summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimeon Simeonov2026-03-29 13:43:38 +0200
committerSimeon Simeonov2026-03-29 13:43:38 +0200
commitbe44243136d710eec0345f8459a64da377bab357 (patch)
tree2abf9cdb409bd8a267caad42e4ff683b0e068c5a
parent63acc390e6417a716ebd789c07530414db7d0981 (diff)
Re-format reveal.js slides and add templatesHEADmaster
-rw-r--r--notebooks/python/cryptographic_primitives.ipynb261
-rw-r--r--notebooks/python/python_3_8_to_3_11.ipynb2
-rw-r--r--notebooks/python/python_intro.ipynb120
-rw-r--r--notebooks/python/python_oo.ipynb151
-rw-r--r--reveal.js/cryptographic_primitives.html494
-rw-r--r--reveal.js/demo.html443
-rw-r--r--reveal.js/dist/theme/statnett_compact.css307
-rw-r--r--reveal.js/free_software.html66
-rw-r--r--[-rwxr-xr-x]reveal.js/git.html69
-rw-r--r--reveal.js/images/cryptographic_primitives/GCM.svg1500
-rw-r--r--reveal.js/images/cryptographic_primitives/hmac.svg165
-rw-r--r--reveal.js/images/cryptographic_primitives/modes_of_operation.pngbin0 -> 195700 bytes
-rw-r--r--reveal.js/images/dataporten/dataporten_the_big_picture1.pngbin9698 -> 0 bytes
-rw-r--r--reveal.js/images/dataporten/flow1.pngbin22182 -> 0 bytes
-rw-r--r--reveal.js/images/gateway/dashboard01.pngbin139944 -> 0 bytes
-rw-r--r--reveal.js/images/gateway/portal01.pngbin97986 -> 0 bytes
-rw-r--r--reveal.js/images/gateway/portal02.pngbin91353 -> 0 bytes
-rw-r--r--reveal.js/images/mqprod/flow01.pngbin40772 -> 0 bytes
-rw-r--r--reveal.js/mqprod.html248
-rw-r--r--reveal.js/postgresql_tuning.html232
-rw-r--r--reveal.js/rabbitmq.html311
-rw-r--r--reveal.js/sqlalchemy.html779
-rw-r--r--reveal.js/template.html55
-rw-r--r--reveal.js/template_statnett.html56
-rw-r--r--reveal.js/timetravel.html127
25 files changed, 3938 insertions, 1448 deletions
diff --git a/notebooks/python/cryptographic_primitives.ipynb b/notebooks/python/cryptographic_primitives.ipynb
new file mode 100644
index 0000000..4d96549
--- /dev/null
+++ b/notebooks/python/cryptographic_primitives.ipynb
@@ -0,0 +1,261 @@
1{
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 12,
6 "id": "fedd7d1a-36a9-4255-8305-a720dfb7b500",
7 "metadata": {},
8 "outputs": [
9 {
10 "name": "stdout",
11 "output_type": "stream",
12 "text": [
13 "b\"{\\x8ea\\xf8wu!\\xeb\\xc4\\xc9\\xcb|\\\\\\xf1K\\xd5t\\x80i\\xbcD\\xb6!\\xfc\\xee\\x06lQ'V0\\xc6\"\n",
14 "7b8e61f8777521ebc4c9cb7c5cf14bd5748069bc44b621fcee066c51275630c6\n",
15 "b'e45h+Hd1IevEyct8XPFL1XSAabxEtiH87gZsUSdWMMY='\n"
16 ]
17 }
18 ],
19 "source": [
20 "# hashes\n",
21 "\n",
22 "import base64\n",
23 "import hashlib\n",
24 "\n",
25 "hashed_result = hashlib.sha256(b\"This is a tesu\")\n",
26 "print(hashed_result.digest())\n",
27 "print(hashed_result.hexdigest())\n",
28 "print(base64.b64encode(hashed_result.digest()))\n"
29 ]
30 },
31 {
32 "cell_type": "code",
33 "execution_count": 13,
34 "id": "9082c388-1c30-46dc-8897-15bf5db255c8",
35 "metadata": {},
36 "outputs": [
37 {
38 "name": "stdout",
39 "output_type": "stream",
40 "text": [
41 "password_hash1 = 'pbkdf2_sha256$100000$j2jYEb1TvX/wh5JEAYGag6h+hRNTGe3rjyv5pegVBu4=$7cV7MljnJJYuGndge3jozwFP28aP8Gfj+QFGvv5bpfo='\n",
42 "password_hash2 = 'pbkdf2_sha256$100000$8+PsThJmJXNAbQ/zaR5AgRA/CuNv8L1uPUXRNuWHc9k=$Kf07CSCVQOTQrvWX5l/ZBdA7zsaEFH247QjUaewpxaU='\n"
43 ]
44 }
45 ],
46 "source": [
47 "# PBKDF2\n",
48 "\n",
49 "import base64\n",
50 "import hashlib\n",
51 "import os\n",
52 "\n",
53 "\n",
54 "def get_password_hash(plaintext_password: str) -> str:\n",
55 " \"\"\"\n",
56 " Returns a complete password hash based on `plaintext_password`\n",
57 "\n",
58 " :return: The hashed version of `plaintext_password`\n",
59 " :rtype: str\n",
60 " \"\"\"\n",
61 " # parameters typycally sent as arguments or fetched from config\n",
62 " hash_algo = \"sha256\" # the hash algorithm to use for HMAC\n",
63 " iterations = 100000 # amount of iterations\n",
64 "\n",
65 " salt = os.urandom(32) # 32 bytes of random data\n",
66 "\n",
67 " key = hashlib.pbkdf2_hmac(hash_algo, plaintext_password.encode(), salt, iterations)\n",
68 "\n",
69 " return (\n",
70 " f\"pbkdf2_{hash_algo}${iterations}$\"\n",
71 " f\"{base64.b64encode(salt).decode(\"ascii\")}$\"\n",
72 " f\"{base64.b64encode(key).decode(\"ascii\")}\"\n",
73 " )\n",
74 "\n",
75 "\n",
76 "def password_matches(plaintext_password: str, password_hash: str) -> bool:\n",
77 " \"\"\"Returns True if `plaintext_password` matches `password_hash`, False otherwise\"\"\"\n",
78 " hash_tokens = password_hash.split(\"$\")\n",
79 " hash_algo = hash_tokens[0].split(\"_\")[1]\n",
80 " iterations = int(hash_tokens[1])\n",
81 " salt = base64.b64decode(hash_tokens[2])\n",
82 " key = hashlib.pbkdf2_hmac(hash_algo, plaintext_password.encode(), salt, iterations)\n",
83 " return key == base64.b64decode(hash_tokens[3])\n",
84 "\n",
85 "\n",
86 "password_hash1 = get_password_hash(\"didn't expect a Spanish Inquisition!\")\n",
87 "password_hash2 = get_password_hash(\"didn't expect a Spanish Inquisition!\")\n",
88 "print(f\"{password_hash1 = }\")\n",
89 "print(f\"{password_hash2 = }\")\n",
90 "\n",
91 "# print(password_matches(\"didn't expect a Spanish Inquisition!\", 'pbkdf2_sha256$100000$JfwrS72mFimypbwhJ/NCyds2dkXtknvfWM5AM3+Z5GQ=$k8YA8csSJZhuYW0um7utq3+lSX5pTAQPd9dukObWrPo='))"
92 ]
93 },
94 {
95 "cell_type": "code",
96 "execution_count": 14,
97 "id": "1274325e-f670-4af8-a0bc-2ff7f668f769",
98 "metadata": {},
99 "outputs": [
100 {
101 "name": "stdout",
102 "output_type": "stream",
103 "text": [
104 "('gxk9W0XFgbzbjRWB7zCPjbWs3', '00000bf5db2c3c6484904bf5e8314aeb123f5594af1f283fb62e14c7d196e84c')\n"
105 ]
106 }
107 ],
108 "source": [
109 "# Proof of work\n",
110 "\n",
111 "import hashlib\n",
112 "import random\n",
113 "import string\n",
114 "\n",
115 "VALID_CHARS = string.ascii_letters + string.digits # valid characters for response\n",
116 "\n",
117 "\n",
118 "def pow_solve_rnd(challenge: str, starting_chars: str = \"00000\", answer_size: int = 25) -> tuple:\n",
119 " \"\"\"\n",
120 " Solves a POW challenge for SHA-256 using `random.choice`\n",
121 "\n",
122 " :return: (response, SHA-256 digest) tuple that solves the challenge\n",
123 " :rtype: tuple\n",
124 " \"\"\"\n",
125 " while True:\n",
126 " attempt = ''.join(\n",
127 " [random.choice(VALID_CHARS) for x in range(answer_size)])\n",
128 " dig = hashlib.sha256(('{0}:{1}'.format(challenge, attempt)).encode()).hexdigest()\n",
129 " if dig.startswith(starting_chars):\n",
130 " return attempt, dig\n",
131 "\n",
132 "print(f\"{pow_solve_rnd('2024-08-07')}\")"
133 ]
134 },
135 {
136 "cell_type": "code",
137 "execution_count": 25,
138 "id": "6752c055-7e49-46c4-858b-599d069a7e77",
139 "metadata": {},
140 "outputs": [
141 {
142 "name": "stdout",
143 "output_type": "stream",
144 "text": [
145 "enc-val$2$6ppVDmiJi0P9BnHuzwFUPA+vV/Gsb4INe2O9E/Ma2uI=$6879D8rw8645nbQ/NQtY3Q+AwKTWpd1P6Q==\n",
146 "Invalid tag when decrypting enc-val$2$tmuH3MTDQ9vMbxJ1pZUb0rQlF43Lgr/AYfkA+vSOZs0=$5CVt3VrxhuuOOVt1vCXeGpbhNh/20IcFNg==\n",
147 "None\n"
148 ]
149 }
150 ],
151 "source": [
152 "# Encryption / decryption using AES-256-GCM\n",
153 "\n",
154 "import hashlib\n",
155 "import os\n",
156 "\n",
157 "from cryptography.exceptions import InvalidTag\n",
158 "from cryptography.hazmat.primitives.ciphers.aead import AESGCM\n",
159 "\n",
160 "\n",
161 "def encrypt(password: str, data: str) -> str:\n",
162 " \"\"\"\n",
163 " Encrypts `data` using `password` and AES-256-GCM.\n",
164 "\n",
165 " The output string is in the following format:\n",
166 " enc-val$`version-num`$`bas64-salt`$`base64-encrypted_data`\n",
167 "\n",
168 " :param password: The password to generate the key with\n",
169 " :type password: str\n",
170 "\n",
171 " :param data: The data to be encrypted\n",
172 " :type data: str\n",
173 "\n",
174 " :return: The output string\n",
175 " :rtype: str\n",
176 " \"\"\"\n",
177 " data_bytes = data.encode()\n",
178 " salt = os.urandom(32)\n",
179 " aesgcm = AESGCM(\n",
180 " hashlib.scrypt(\n",
181 " password.encode(), salt=salt, n=2**14, r=8, p=1, dklen=32\n",
182 " )\n",
183 " )\n",
184 " nonce = salt[:12]\n",
185 " # padding_length_bytes = b\"-1\" # no padding used 2 bytes \"sign\"\n",
186 " edata = aesgcm.encrypt(\n",
187 " nonce, data_bytes, salt\n",
188 " )\n",
189 " return (\n",
190 " f\"enc-val$2${base64.b64encode(salt).decode()}${base64.b64encode(edata).decode()}\"\n",
191 " )\n",
192 "\n",
193 "\n",
194 "def decrypt(password: str, edata: str) -> str:\n",
195 " \"\"\"\n",
196 " Decrypts `edata` using `password`.\n",
197 "\n",
198 " `edata` is in the following format:\n",
199 " enc-val$`version-num`$`bas64-salt`$`base64-encrypted_data`\n",
200 "\n",
201 " :param password: The password to generate the key with\n",
202 " :type password: str\n",
203 "\n",
204 " :param edata: The data to be decrypted\n",
205 " :type edata: str\n",
206 "\n",
207 " :return: The output string / decrypted data\n",
208 " :rtype: str\n",
209 " \"\"\"\n",
210 " # check for supported versions first...\n",
211 "\n",
212 " try:\n",
213 " salt, data = (base64.b64decode(t) for t in edata[10:].split('$'))\n",
214 " nonce = salt[:12]\n",
215 " aesgcm = AESGCM(\n",
216 " hashlib.scrypt(\n",
217 " password.encode(), salt=salt, n=2**14, r=8, p=1, dklen=32\n",
218 " )\n",
219 " )\n",
220 "\n",
221 " # decrypt\n",
222 " data = aesgcm.decrypt(nonce, data, salt)\n",
223 " return data.decode()\n",
224 " except InvalidTag:\n",
225 " print(f\"Invalid tag when decrypting {edata}\")\n",
226 "\n",
227 "print(f\"{encrypt('my passphrase', 'my secret')}\")\n",
228 "print(f\"{decrypt('my passphrase', 'enc-val$2$tmuH3MTDQ9vMbxJ1pZUb0rQlF43Lgr/AYfkA+vSOZs0=$5CVt3VrxhuuOOVt1vCXeGpbhNh/20IcFNg==')}\")"
229 ]
230 },
231 {
232 "cell_type": "code",
233 "execution_count": null,
234 "id": "8ccfb453-d3fd-4383-a01d-f81b19f2cb82",
235 "metadata": {},
236 "outputs": [],
237 "source": []
238 }
239 ],
240 "metadata": {
241 "kernelspec": {
242 "display_name": "Python 3 (ipykernel)",
243 "language": "python",
244 "name": "python3"
245 },
246 "language_info": {
247 "codemirror_mode": {
248 "name": "ipython",
249 "version": 3
250 },
251 "file_extension": ".py",
252 "mimetype": "text/x-python",
253 "name": "python",
254 "nbconvert_exporter": "python",
255 "pygments_lexer": "ipython3",
256 "version": "3.13.9"
257 }
258 },
259 "nbformat": 4,
260 "nbformat_minor": 5
261}
diff --git a/notebooks/python/python_3_8_to_3_11.ipynb b/notebooks/python/python_3_8_to_3_11.ipynb
index b8724e8..016c108 100644
--- a/notebooks/python/python_3_8_to_3_11.ipynb
+++ b/notebooks/python/python_3_8_to_3_11.ipynb
@@ -834,7 +834,7 @@
834 "name": "python", 834 "name": "python",
835 "nbconvert_exporter": "python", 835 "nbconvert_exporter": "python",
836 "pygments_lexer": "ipython3", 836 "pygments_lexer": "ipython3",
837 "version": "3.11.7" 837 "version": "3.12.3"
838 } 838 }
839 }, 839 },
840 "nbformat": 4, 840 "nbformat": 4,
diff --git a/notebooks/python/python_intro.ipynb b/notebooks/python/python_intro.ipynb
index f129ffe..f101400 100644
--- a/notebooks/python/python_intro.ipynb
+++ b/notebooks/python/python_intro.ipynb
@@ -50,6 +50,19 @@
50 }, 50 },
51 { 51 {
52 "cell_type": "markdown", 52 "cell_type": "markdown",
53 "id": "779bac39-4646-4b80-9970-343a3daef1e7",
54 "metadata": {},
55 "source": [
56 "## Important PEPs\n",
57 "\n",
58 "- [PEP0](https://peps.python.org/) - Index of Python Enhancement Proposals\n",
59 "- [PEP8](https://peps.python.org/pep-0008/) - Style Guide for Python Code\n",
60 "- [PEP257](https://peps.python.org/pep-0257/) - Docstring Conventions\n",
61 "- [PEP484](https://peps.python.org/pep-0484/) - Type Hints"
62 ]
63 },
64 {
65 "cell_type": "markdown",
53 "id": "6d1edcfc-b001-4393-9c24-72adc9b5fccf", 66 "id": "6d1edcfc-b001-4393-9c24-72adc9b5fccf",
54 "metadata": {}, 67 "metadata": {},
55 "source": [ 68 "source": [
@@ -72,7 +85,7 @@
72 }, 85 },
73 { 86 {
74 "cell_type": "markdown", 87 "cell_type": "markdown",
75 "id": "4f144f73-51c1-419d-b71e-ee513f68f41c", 88 "id": "81573ed5-b76e-4726-9f44-7dc017fd0896",
76 "metadata": {}, 89 "metadata": {},
77 "source": [ 90 "source": [
78 "## Built-in functions\n", 91 "## Built-in functions\n",
@@ -81,8 +94,6 @@
81 "\n", 94 "\n",
82 "[https://docs.python.org/3/library/functions.html](https://docs.python.org/3/library/functions.html)\n", 95 "[https://docs.python.org/3/library/functions.html](https://docs.python.org/3/library/functions.html)\n",
83 "\n", 96 "\n",
84 "- `dir([obj])` - returns a list of valid attributes for that object\n",
85 "\n",
86 "- `id(obj)` - returns the \"identity\" of an object - an integer which is guaranteed to be unique\n", 97 "- `id(obj)` - returns the \"identity\" of an object - an integer which is guaranteed to be unique\n",
87 "\n", 98 "\n",
88 "- `print(...)` - prints objects to a text stream\n", 99 "- `print(...)` - prints objects to a text stream\n",
@@ -94,6 +105,12 @@
94 }, 105 },
95 { 106 {
96 "cell_type": "markdown", 107 "cell_type": "markdown",
108 "id": "bc180243-fe11-405c-beb9-83db4f793a05",
109 "metadata": {},
110 "source": []
111 },
112 {
113 "cell_type": "markdown",
97 "id": "a0c57535-e285-47af-80f9-1d4a16de5f25", 114 "id": "a0c57535-e285-47af-80f9-1d4a16de5f25",
98 "metadata": {}, 115 "metadata": {},
99 "source": [ 116 "source": [
@@ -116,26 +133,28 @@
116 "source": [ 133 "source": [
117 "# Common built-in types:\n", 134 "# Common built-in types:\n",
118 "\n", 135 "\n",
119 "s = 'foo' # this is a string / str, same as str('foo'), may be encoded, immutable (s[0] = 'r' is NOT possible)\n", 136 "my_string = 'foo' # a string / str, same as str('foo'), may be encoded\n",
137 " # immutable (s[0] = 'r' is NOT possible)\n",
120 "\n", 138 "\n",
121 "b = b'foo' # bytes, same as bytes('foo', 'utf-8'), may be decoded, immutable\n", 139 "my_bytes = b'foo' # bytes, same as bytes('foo', 'utf-8'), may be decoded, immutable\n",
122 "\n", 140 "\n",
123 "i = 6 # int, same as int('6'), immutable\n", 141 "my_int = 6 # int, same as int('6'), immutable\n",
124 "\n", 142 "\n",
125 "f = 0.1 # float, same as float('0.1'), immutable, Note!!: Floats have a fixed size,\n", 143 "my_float = 0.1 # float, same as float('0.1'), immutable, Note!!: Floats have a fixed size,\n",
126 "# hence they don't necessarily behave they way we expect from math class.\n", 144 " # hence they don't necessarily behave they way we expect from math class.\n",
145 "# 24732847234232342892343428.3 == 24732847234232342892343428.1 # True\n",
127 "\n", 146 "\n",
128 "b = False # bool, same as bool(0), bool(''), bool(None)... immutable / constant\n", 147 "my_bool = False # bool, same as bool(0), bool(''), bool(None)... immutable / constant\n",
129 "\n", 148 "\n",
130 "n = None # NoneType, similar to 'null' in other languages, immutable / constant\n", 149 "my_none = None # NoneType, similar to 'null' in other languages, immutable / constant\n",
131 "\n", 150 "\n",
132 "l = [1, False, 'foo'] # list, same as list((1, False, 'foo'))\n", 151 "my_list = [1, False, 'foo'] # list, same as list((1, False, 'foo'))\n",
133 "\n", 152 "\n",
134 "t = (1, False, 'foo') # tuple, same as tuple([1, False, 'foo']), immutable\n", 153 "my_tuple = (1, False, 'foo') # tuple, same as tuple([1, False, 'foo']), immutable\n",
135 "\n", 154 "\n",
136 "d = {'foo': 1, 'bar': 8} # dict, same as dict(foo=1, bar=8), similar to hash in other languages\n", 155 "my_dict = {'foo': 1, 'bar': 8} # dict, same as dict(foo=1, bar=8), similar to hash in other languages\n",
137 "\n", 156 "\n",
138 "s = {'foo', 'bar', 1, 1, 4} # set, same as set(['foo', 'bar', 1, 1, 4]), removes duplicates" 157 "my_set = {'foo', 'bar', 1, 1, 4} # set, same as set(['foo', 'bar', 1, 1, 4]), removes duplicates"
139 ] 158 ]
140 }, 159 },
141 { 160 {
@@ -203,7 +222,7 @@
203 "s3[0] # Out: S\n", 222 "s3[0] # Out: S\n",
204 "s3[-1] # Out: t\n", 223 "s3[-1] # Out: t\n",
205 "s3[1:] # Out: tatnett\n", 224 "s3[1:] # Out: tatnett\n",
206 "s3[1:-1] # Out: tatnett\n", 225 "s3[1:-1] # Out: tatnet\n",
207 "s3[-3:] # Out: ett\n", 226 "s3[-3:] # Out: ett\n",
208 "s3[1:-1:2] # Out: tte\n", 227 "s3[1:-1:2] # Out: tte\n",
209 "\n", 228 "\n",
@@ -223,6 +242,29 @@
223 }, 242 },
224 { 243 {
225 "cell_type": "markdown", 244 "cell_type": "markdown",
245 "id": "25d0f9dc-d783-4a23-a3ee-c0b6cee3d4ab",
246 "metadata": {},
247 "source": [
248 "## Lists vs. tuples\n",
249 "\n",
250 "Tuples are not sumply \"read-only\" lists.\n",
251 "\n",
252 "\"Though tuples may seem similar to lists, they are often used in different situations and for different purposes.\n",
253 "Tuples are immutable, and usually contain a heterogeneous sequence of elements that are accessed via unpacking ... or indexing.\n",
254 "Lists are mutable, and their elements are usually homogeneous and are accessed by iterating over the list.\n",
255 "\n",
256 "```python\n",
257 "my_tuple = (1,2)\n",
258 "my_list = [1,2] \n",
259 "\n",
260 "# tuples are immutable and hashable, hence they can be used as keys in mapping objects as dicts\n",
261 "d = {my_tuple: 1} # OK\n",
262 "d = {my_list: 1} # Error\n",
263 "```"
264 ]
265 },
266 {
267 "cell_type": "markdown",
226 "id": "6b2bc8fa-a5dc-4a58-92b2-abfb19bfe2ed", 268 "id": "6b2bc8fa-a5dc-4a58-92b2-abfb19bfe2ed",
227 "metadata": {}, 269 "metadata": {},
228 "source": [ 270 "source": [
@@ -302,7 +344,7 @@
302 "id": "40db50e4-fb7a-4a77-a074-bc4413f27212", 344 "id": "40db50e4-fb7a-4a77-a074-bc4413f27212",
303 "metadata": {}, 345 "metadata": {},
304 "source": [ 346 "source": [
305 "## Creating and maintaining a Python environment (cont...)\n", 347 "## Creating and maintaining a Python environment - goals\n",
306 "\n", 348 "\n",
307 "Desired qualities for a flexible Python environment:\n", 349 "Desired qualities for a flexible Python environment:\n",
308 "\n", 350 "\n",
@@ -324,10 +366,11 @@
324 "id": "c661bf56-add0-402c-a629-a857f81d0758", 366 "id": "c661bf56-add0-402c-a629-a857f81d0758",
325 "metadata": {}, 367 "metadata": {},
326 "source": [ 368 "source": [
327 "## Creating and maintaining a Python environment (cont...)\n", 369 "## Creating and maintaining a Python environment - using devbox / WSL / UNIX systems directly\n",
328 "\n", 370 "\n",
329 "Exploting the operating system can be done by:\n", 371 "Exploting the operating system can be done by:\n",
330 "\n", 372 "\n",
373 "- using the official Python packages that are maintained by the OS (Ubuntu packages in the case of WSL @ Statnett or a Red Hat enterprise VM @ Statnett) is often good enough\n",
331 "- (re)defining `PYTHONPATH`\n", 374 "- (re)defining `PYTHONPATH`\n",
332 "- using symlinks to point at packages placed at different locations" 375 "- using symlinks to point at packages placed at different locations"
333 ] 376 ]
@@ -337,7 +380,7 @@
337 "id": "db8952aa-0944-4644-9626-7460786fd72a", 380 "id": "db8952aa-0944-4644-9626-7460786fd72a",
338 "metadata": {}, 381 "metadata": {},
339 "source": [ 382 "source": [
340 "## Creating and maintaining a Python environment (cont...)\n", 383 "## Creating and maintaining a Python environment - using the Python virtual environment - *venv*\n",
341 "\n", 384 "\n",
342 "Using venv can be done by directly invoking python:\n", 385 "Using venv can be done by directly invoking python:\n",
343 "\n", 386 "\n",
@@ -365,10 +408,13 @@
365 "id": "299641e6-3d87-4a86-a124-eb49edb75b4b", 408 "id": "299641e6-3d87-4a86-a124-eb49edb75b4b",
366 "metadata": {}, 409 "metadata": {},
367 "source": [ 410 "source": [
368 "## Creating and maintaining a Python environment (cont...)\n", 411 "## Creating and maintaining a Python environment - using Poetry\n",
369 "\n", 412 "\n",
370 "Poetry [https://python-poetry.org](https://python-poetry.org) is the prefered environment and dependency management tool at Statnett.\n", 413 "Poetry [https://python-poetry.org](https://python-poetry.org) is the prefered environment and dependency management tool at Statnett.\n",
371 "\n", 414 "\n",
415 "Although Poetry creates and uses vierual environment(s) behind the scenes,\n",
416 "it is centered around the concept of \"projects\" and not the virtual environment itself\n",
417 "\n",
372 "```bash\n", 418 "```bash\n",
373 "# create project and a virtual environment from scratch\n", 419 "# create project and a virtual environment from scratch\n",
374 "poetry new my-project\n", 420 "poetry new my-project\n",
@@ -411,7 +457,7 @@
411 { 457 {
412 "data": { 458 "data": {
413 "text/plain": [ 459 "text/plain": [
414 "-42990858669078524" 460 "-3158428850515418558"
415 ] 461 ]
416 }, 462 },
417 "execution_count": 15, 463 "execution_count": 15,
@@ -435,8 +481,8 @@
435 "hash(t) # returns f.i. -6333845781340707986\n", 481 "hash(t) # returns f.i. -6333845781340707986\n",
436 "# hash(l) # TypeError: unhashable type: 'list'\n", 482 "# hash(l) # TypeError: unhashable type: 'list'\n",
437 "\n", 483 "\n",
438 "s = 'the long and winding road'\n", 484 "s = \"the long and winding road\"\n",
439 "s2 = 'the long and winding road'\n", 485 "s2 = \"the long and winding road\"\n",
440 "\n", 486 "\n",
441 "# check if s and s2 are the same object:\n", 487 "# check if s and s2 are the same object:\n",
442 "id(s) # Out: 139858905258704\n", 488 "id(s) # Out: 139858905258704\n",
@@ -816,7 +862,7 @@
816 "# the function will behave differently depending on what parameters were\n", 862 "# the function will behave differently depending on what parameters were\n",
817 "# used when calling its enclosing function (factory function)\n", 863 "# used when calling its enclosing function (factory function)\n",
818 "\n", 864 "\n",
819 "def get_multiplier_of(base: int) -> str:\n", 865 "def get_multiplier_of(base: int):\n",
820 " \"\"\"the function enclosing its nested functions\"\"\"\n", 866 " \"\"\"the function enclosing its nested functions\"\"\"\n",
821 " # this function is the enclosing function of the function `multiplier_function`\n", 867 " # this function is the enclosing function of the function `multiplier_function`\n",
822 "\n", 868 "\n",
@@ -958,19 +1004,7 @@
958 "execution_count": 22, 1004 "execution_count": 22,
959 "id": "4346260d-76af-437e-9c10-1c1d0c478695", 1005 "id": "4346260d-76af-437e-9c10-1c1d0c478695",
960 "metadata": {}, 1006 "metadata": {},
961 "outputs": [ 1007 "outputs": [],
962 {
963 "ename": "NameError",
964 "evalue": "name 'is_admin' is not defined",
965 "output_type": "error",
966 "traceback": [
967 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
968 "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
969 "Cell \u001b[0;32mIn[22], line 25\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m decorated\n\u001b[1;32m 21\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m api_access_decorator\n\u001b[1;32m 24\u001b[0m \u001b[38;5;129m@requires_access\u001b[39m(access_secret\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mb28cfeaa65b73cf\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 25\u001b[0m \u001b[38;5;129m@is_admin\u001b[39m\n\u001b[1;32m 26\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msensitive_function\u001b[39m(data, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 27\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"very sensitive function\"\"\"\u001b[39;00m\n\u001b[1;32m 28\u001b[0m db\u001b[38;5;241m.\u001b[39msave(data)\n",
970 "\u001b[0;31mNameError\u001b[0m: name 'is_admin' is not defined"
971 ]
972 }
973 ],
974 "source": [ 1008 "source": [
975 "# Decorators (cont ...) - a complete example\n", 1009 "# Decorators (cont ...) - a complete example\n",
976 "\n", 1010 "\n",
@@ -996,7 +1030,7 @@
996 "\n", 1030 "\n",
997 "\n", 1031 "\n",
998 "@requires_access(access_secret='b28cfeaa65b73cf')\n", 1032 "@requires_access(access_secret='b28cfeaa65b73cf')\n",
999 "@is_admin\n", 1033 "# @is_admin - decorators can be \"chained\"\n",
1000 "def sensitive_function(data, **kwargs):\n", 1034 "def sensitive_function(data, **kwargs):\n",
1001 " \"\"\"very sensitive function\"\"\"\n", 1035 " \"\"\"very sensitive function\"\"\"\n",
1002 " db.save(data)" 1036 " db.save(data)"
@@ -1030,11 +1064,19 @@
1030 "\n", 1064 "\n",
1031 "\n", 1065 "\n",
1032 "# modern Python >= 3.6 f-strings\n", 1066 "# modern Python >= 3.6 f-strings\n",
1033 "f'{s} - {i} - {f:5.2f}' # Out: 'another string - 27 - 6.58'\n", 1067 "f\"{s} - {i} - {f:5.2f}\" # Out: 'another string - 27 - 6.58'\n",
1034 "``` \n", 1068 "``` \n",
1035 "\n", 1069 "\n",
1036 "See https://docs.python.org/3/library/string.html#formatspec for the complete format specification" 1070 "See https://docs.python.org/3/library/string.html#formatspec for the complete format specification"
1037 ] 1071 ]
1072 },
1073 {
1074 "cell_type": "code",
1075 "execution_count": null,
1076 "id": "23972592-e838-4fa7-81f1-ca3ca129e757",
1077 "metadata": {},
1078 "outputs": [],
1079 "source": []
1038 } 1080 }
1039 ], 1081 ],
1040 "metadata": { 1082 "metadata": {
@@ -1053,7 +1095,7 @@
1053 "name": "python", 1095 "name": "python",
1054 "nbconvert_exporter": "python", 1096 "nbconvert_exporter": "python",
1055 "pygments_lexer": "ipython3", 1097 "pygments_lexer": "ipython3",
1056 "version": "3.11.7" 1098 "version": "3.13.9"
1057 } 1099 }
1058 }, 1100 },
1059 "nbformat": 4, 1101 "nbformat": 4,
diff --git a/notebooks/python/python_oo.ipynb b/notebooks/python/python_oo.ipynb
index e38d7f3..1ef2a72 100644
--- a/notebooks/python/python_oo.ipynb
+++ b/notebooks/python/python_oo.ipynb
@@ -66,7 +66,55 @@
66 "\n", 66 "\n",
67 "- improving modularity\n", 67 "- improving modularity\n",
68 "\n", 68 "\n",
69 "- providing foundation for a more intuitive design" 69 "- providing foundation for a more intuitive design\n",
70 "\n",
71 "A pseudo code example:\n",
72 "\n",
73 "```c\n",
74 "/* crating and drawing a (pseudo) widget in C */\n",
75 "my_widget = mylibrary_widget_init(); /* a struct of the type widget */\n",
76 "mylibrary_widget_draw(my_widget);\n",
77 "```\n",
78 "\n",
79 "```python\n",
80 "# creating and drawing a (pseudo) widget in Python\n",
81 "import mylibrary\n",
82 "\n",
83 "my_widget = mylibrary.Widget()\n",
84 "my_widget.draw()\n",
85 "```"
86 ]
87 },
88 {
89 "cell_type": "markdown",
90 "id": "878cb805-a2d7-46a3-a34a-0507495420f7",
91 "metadata": {},
92 "source": [
93 "# Do I need to know / understand OOP when I am programming in Python?\n",
94 "\n",
95 "Most definitely - **yes**.\n",
96 "\n",
97 "While using programming language that is not object-oriented (like *C* and / or *Rust*) is always possible,\n",
98 "when using Python there are no *sane* alternatives that have ever been demonstrated:\n",
99 "\n",
100 "- Understanding OO behaviour and syntax is a must in order to understand Python code in general\n",
101 "- OOP is at the core of Python's design - everything in Python is an object\n",
102 "- Good programming and design is not only about solving a particular task. It is about reusing code and making your code reusable in turn\n",
103 "- Following the priciples described above is more challenging when not using OO in general."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "id": "b83dc815-ed51-4e5a-a30e-fa0252217194",
109 "metadata": {},
110 "source": [
111 "# I am doing only simple things with Python. Do I still need to learn OOP?\n",
112 "\n",
113 "Most definitely - **yes**.\n",
114 "\n",
115 "- A simple task provides a great opportunity to learn and practice OOP\n",
116 "- Using OOP **does not mean overcomplicating** your code. When applied correctly - it means the opposite\n",
117 "- Doing \"simple things\" exclusively is not very ambitious approach to programming and learning in general"
70 ] 118 ]
71 }, 119 },
72 { 120 {
@@ -109,13 +157,20 @@
109 "\n", 157 "\n",
110 "- object - an instance of a class that may contain its own attributes as well as references to its class' attributes\n", 158 "- object - an instance of a class that may contain its own attributes as well as references to its class' attributes\n",
111 "\n", 159 "\n",
112 "- attribute - variable, property, function defined in the class and present in its instances\n", 160 "- attribute - variable, property, function defined in the class and present in its instances - in Python: any name following a dot. Attributes may be *read-only* or *writable*. In the latter case, assignment to attributes is possible.\n",
113 "\n", 161 "\n",
114 "- class variable - attribute of which a single copy exists, regardless of how many instances of the class exist\n", 162 "- class variable - attribute of which a single copy exists, regardless of how many instances of the class exist\n",
115 "\n", 163 "\n",
116 "- object / instance variable, object / instance attribute - attribute for which each instantiated object of the class has a separate copy, or instance\n", 164 "- object / instance variable, object / instance attribute - attribute for which each instantiated object of the class has a separate copy, or instance\n",
117 "\n", 165 "\n",
118 "- method - member function - function that is an attribute" 166 "- method - member function - function that is an attribute\n",
167 "\n",
168 "```python\n",
169 "# my_str_obj is an object (instance) of the class str\n",
170 "my_str_object = str(\"Test\") # or my_str_object = \"Test\"\n",
171 "my_str_object.lower # attribute that is a function -> method\n",
172 "my_str_object.lower() # calling the method \"lower\"\n",
173 "```"
119 ] 174 ]
120 }, 175 },
121 { 176 {
@@ -218,7 +273,7 @@
218 }, 273 },
219 { 274 {
220 "cell_type": "code", 275 "cell_type": "code",
221 "execution_count": 1, 276 "execution_count": 41,
222 "id": "a9c30a5d-aa86-45ab-b897-f051df80f1d8", 277 "id": "a9c30a5d-aa86-45ab-b897-f051df80f1d8",
223 "metadata": {}, 278 "metadata": {},
224 "outputs": [ 279 "outputs": [
@@ -226,17 +281,17 @@
226 "name": "stdout", 281 "name": "stdout",
227 "output_type": "stream", 282 "output_type": "stream",
228 "text": [ 283 "text": [
229 "car1.get_obj_info_str() = \"I am <__main__.Car object at 0x7f70e643d590> with id 140122876269968 from <class '__main__.Car'> with id 93964809433504\"\n", 284 "car1.get_obj_info_str() = \"I am <__main__.Car object at 0x7fd00029ff80> with id 140531332677504 from <class '__main__.Car'> with id 93887620597168\"\n",
230 "car2.get_obj_info_str() = \"I am <__main__.Car object at 0x7f70e63ddf10> with id 140122875879184 from <class '__main__.Car'> with id 93964809433504\"\n", 285 "car2.get_obj_info_str() = \"I am <__main__.Car object at 0x7fd00029ea50> with id 140531332672080 from <class '__main__.Car'> with id 93887620597168\"\n",
231 "car1.model = 'BMW', car1.reg_nr = 'EC76183', car1.extras = ['GPSnav', 'Sound system'], id(car1.cls_extras) = 140122875882432, id(car1.get_obj_info_str) = 140122875878080\n", 286 "car1.model = 'BMW', car1.reg_nr = 'EC76183', car1.extras = ['GPSnav', 'Sound system'], id(car1.cls_extras) = 140531337557440, id(car1.get_obj_info_str) = 140531251735488\n",
232 "car2.model = 'Scoda', car2.reg_nr = 'BD77655', car2.extras = ['GPSnav'], id(car2.cls_extras) = 140122875882432, id(car2.get_obj_info_str) = 140122875880192\n", 287 "car2.model = 'Scoda', car2.reg_nr = 'BD77655', car2.extras = ['GPSnav'], id(car2.cls_extras) = 140531337557440, id(car2.get_obj_info_str) = 140531251728064\n",
233 "id(Car.cls_extras) = 140122875882432, id(Car.get_obj_info_str) = 140122875964416\n", 288 "id(Car.cls_extras) = 140531337557440, id(Car.get_obj_info_str) = 140531252010400\n",
234 "car1.cls_extras = ['GPSnav', 'Sound system'], id(car1.cls_extras) = 140122875882432\n", 289 "car1.cls_extras = ['GPSnav', 'Sound system'], id(car1.cls_extras) = 140531337557440\n",
235 "car2.cls_extras = ['GPSnav', 'Sound system'], id(car2.cls_extras) = 140122875882432\n", 290 "car2.cls_extras = ['GPSnav', 'Sound system'], id(car2.cls_extras) = 140531337557440\n",
236 "True\n", 291 "True\n",
237 "hasattr(car1, 'import_tax_paid') = True\n", 292 "hasattr(car1, 'import_tax_paid') = True\n",
238 "hasattr(car2, 'import_tax_paid') = False\n", 293 "hasattr(car2, 'import_tax_paid') = False\n",
239 "id(car1.__class__) = 93964809433504, id(car2.__class__) = 93964809433504, id(Car) = 93964809433504\n" 294 "id(car1.__class__) = 93887620597168, id(car2.__class__) = 93887620597168, id(Car) = 93887620597168\n"
240 ] 295 ]
241 } 296 }
242 ], 297 ],
@@ -288,7 +343,7 @@
288 "# - checks if 'attr' is an instance attribute\n", 343 "# - checks if 'attr' is an instance attribute\n",
289 "# - checks if 'attr' is a class attribute (through the method resolution order - MRO)\n", 344 "# - checks if 'attr' is a class attribute (through the method resolution order - MRO)\n",
290 "# - raises AttributeError\n", 345 "# - raises AttributeError\n",
291 "# setter:\n", 346 "# setter (making the attribute writable):\n",
292 "# - (re)defines an instance attribute\n", 347 "# - (re)defines an instance attribute\n",
293 "\n", 348 "\n",
294 "# Details not covered in this course:\n", 349 "# Details not covered in this course:\n",
@@ -323,7 +378,7 @@
323 }, 378 },
324 { 379 {
325 "cell_type": "code", 380 "cell_type": "code",
326 "execution_count": 2, 381 "execution_count": 42,
327 "id": "391e816e-c53b-454b-9e9f-3587234f1fea", 382 "id": "391e816e-c53b-454b-9e9f-3587234f1fea",
328 "metadata": {}, 383 "metadata": {},
329 "outputs": [ 384 "outputs": [
@@ -413,7 +468,7 @@
413 }, 468 },
414 { 469 {
415 "cell_type": "code", 470 "cell_type": "code",
416 "execution_count": 3, 471 "execution_count": 43,
417 "id": "e82feefb-025d-4cbb-a8ac-ddc3cc01269c", 472 "id": "e82feefb-025d-4cbb-a8ac-ddc3cc01269c",
418 "metadata": {}, 473 "metadata": {},
419 "outputs": [ 474 "outputs": [
@@ -495,7 +550,7 @@
495 }, 550 },
496 { 551 {
497 "cell_type": "code", 552 "cell_type": "code",
498 "execution_count": 4, 553 "execution_count": 44,
499 "id": "71a90ec6-3cc0-441e-a866-c2c2b9984559", 554 "id": "71a90ec6-3cc0-441e-a866-c2c2b9984559",
500 "metadata": {}, 555 "metadata": {},
501 "outputs": [ 556 "outputs": [
@@ -613,7 +668,7 @@
613 }, 668 },
614 { 669 {
615 "cell_type": "code", 670 "cell_type": "code",
616 "execution_count": 5, 671 "execution_count": 45,
617 "id": "a4d2735d-d167-4f43-ad55-cb3d13ece2dc", 672 "id": "a4d2735d-d167-4f43-ad55-cb3d13ece2dc",
618 "metadata": {}, 673 "metadata": {},
619 "outputs": [ 674 "outputs": [
@@ -656,7 +711,7 @@
656 }, 711 },
657 { 712 {
658 "cell_type": "code", 713 "cell_type": "code",
659 "execution_count": 6, 714 "execution_count": 46,
660 "id": "a6ead5e6-e987-4bda-bf48-30f91877278d", 715 "id": "a6ead5e6-e987-4bda-bf48-30f91877278d",
661 "metadata": {}, 716 "metadata": {},
662 "outputs": [ 717 "outputs": [
@@ -715,7 +770,7 @@
715 }, 770 },
716 { 771 {
717 "cell_type": "code", 772 "cell_type": "code",
718 "execution_count": 7, 773 "execution_count": 47,
719 "id": "11f6a3fb-64d7-40a9-a130-27548ec4b802", 774 "id": "11f6a3fb-64d7-40a9-a130-27548ec4b802",
720 "metadata": {}, 775 "metadata": {},
721 "outputs": [ 776 "outputs": [
@@ -797,7 +852,7 @@
797 }, 852 },
798 { 853 {
799 "cell_type": "code", 854 "cell_type": "code",
800 "execution_count": 8, 855 "execution_count": 48,
801 "id": "c345a69f-02da-40e7-bb37-c0511b6af096", 856 "id": "c345a69f-02da-40e7-bb37-c0511b6af096",
802 "metadata": {}, 857 "metadata": {},
803 "outputs": [ 858 "outputs": [
@@ -806,6 +861,9 @@
806 "output_type": "stream", 861 "output_type": "stream",
807 "text": [ 862 "text": [
808 "9\n", 863 "9\n",
864 "9\n",
865 "140531251904896\n",
866 "140531251904896\n",
809 "Vector.from_str('1:1:5:6') = Vector(start=Point(x=1, y=1), end=Point(x=5, y=6))\n" 867 "Vector.from_str('1:1:5:6') = Vector(start=Point(x=1, y=1), end=Point(x=5, y=6))\n"
810 ] 868 ]
811 } 869 }
@@ -837,7 +895,14 @@
837 " Point(coordinates[2], coordinates[3]),\n", 895 " Point(coordinates[2], coordinates[3]),\n",
838 " )\n", 896 " )\n",
839 "\n", 897 "\n",
840 "print(Point.get_manhattan_distance(Point(1, 1), Point(5, 6)))\n", 898 "point1 = Point(1, 1)\n",
899 "point2 = Point(5, 6)\n",
900 "print(f\"{point1.get_manhattan_distance(point1, point2)}\") # works, but should not be used in that way\n",
901 "print(f\"{Point.get_manhattan_distance(point1, point2)}\")\n",
902 "print(f\"{id(point1.get_manhattan_distance)}\")\n",
903 "print(f\"{id(point2.get_manhattan_distance)}\")\n",
904 "# print(f\"{id(point1.from_str)}\") <-- not available as an instance attribute\n",
905 "\n",
841 "print(f\"{Vector.from_str('1:1:5:6') = }\")" 906 "print(f\"{Vector.from_str('1:1:5:6') = }\")"
842 ] 907 ]
843 }, 908 },
@@ -890,7 +955,7 @@
890 }, 955 },
891 { 956 {
892 "cell_type": "code", 957 "cell_type": "code",
893 "execution_count": 9, 958 "execution_count": 49,
894 "id": "44d47e1c-1a06-4577-8db6-6ec78ce5cef8", 959 "id": "44d47e1c-1a06-4577-8db6-6ec78ce5cef8",
895 "metadata": {}, 960 "metadata": {},
896 "outputs": [ 961 "outputs": [
@@ -903,32 +968,32 @@
903 "\n", 968 "\n",
904 "class TigerShark(Fish)\n", 969 "class TigerShark(Fish)\n",
905 " | TigerShark(weight: int, alive: bool = True, **kwargs)\n", 970 " | TigerShark(weight: int, alive: bool = True, **kwargs)\n",
906 " | \n", 971 " |\n",
907 " | Base class for all tiger sharks\n", 972 " | Base class for all tiger sharks\n",
908 " | \n", 973 " |\n",
909 " | Method resolution order:\n", 974 " | Method resolution order:\n",
910 " | TigerShark\n", 975 " | TigerShark\n",
911 " | Fish\n", 976 " | Fish\n",
912 " | Animal\n", 977 " | Animal\n",
913 " | builtins.object\n", 978 " | builtins.object\n",
914 " | \n", 979 " |\n",
915 " | Methods defined here:\n", 980 " | Methods defined here:\n",
916 " | \n", 981 " |\n",
917 " | __init__(self, weight: int, alive: bool = True, **kwargs)\n", 982 " | __init__(self, weight: int, alive: bool = True, **kwargs)\n",
918 " | Initialize self. See help(type(self)) for accurate signature.\n", 983 " | Initialize self. See help(type(self)) for accurate signature.\n",
919 " | \n", 984 " |\n",
920 " | ----------------------------------------------------------------------\n", 985 " | ----------------------------------------------------------------------\n",
921 " | Data descriptors inherited from Animal:\n", 986 " | Data descriptors inherited from Animal:\n",
922 " | \n", 987 " |\n",
923 " | __dict__\n", 988 " | __dict__\n",
924 " | dictionary for instance variables (if defined)\n", 989 " | dictionary for instance variables\n",
925 " | \n", 990 " |\n",
926 " | __weakref__\n", 991 " | __weakref__\n",
927 " | list of weak references to the object (if defined)\n", 992 " | list of weak references to the object\n",
928 " | \n", 993 " |\n",
929 " | alive\n", 994 " | alive\n",
930 " | getter property alive\n", 995 " | getter property alive\n",
931 " | \n", 996 " |\n",
932 " | weight\n", 997 " | weight\n",
933 " | getter property weight\n", 998 " | getter property weight\n",
934 "\n", 999 "\n",
@@ -1064,7 +1129,7 @@
1064 }, 1129 },
1065 { 1130 {
1066 "cell_type": "code", 1131 "cell_type": "code",
1067 "execution_count": 10, 1132 "execution_count": 50,
1068 "id": "e6076925-75f0-456c-aed5-7db0a24a67a1", 1133 "id": "e6076925-75f0-456c-aed5-7db0a24a67a1",
1069 "metadata": {}, 1134 "metadata": {},
1070 "outputs": [ 1135 "outputs": [
@@ -1169,7 +1234,7 @@
1169 }, 1234 },
1170 { 1235 {
1171 "cell_type": "code", 1236 "cell_type": "code",
1172 "execution_count": 11, 1237 "execution_count": 51,
1173 "id": "cf79617a-95d2-48f2-be66-fa1fa34e4e04", 1238 "id": "cf79617a-95d2-48f2-be66-fa1fa34e4e04",
1174 "metadata": {}, 1239 "metadata": {},
1175 "outputs": [ 1240 "outputs": [
@@ -1192,14 +1257,14 @@
1192 " | Adam\n", 1257 " | Adam\n",
1193 " | Eve\n", 1258 " | Eve\n",
1194 " | builtins.object\n", 1259 " | builtins.object\n",
1195 " | \n", 1260 " |\n",
1196 " | Data descriptors inherited from Adam:\n", 1261 " | Data descriptors inherited from Adam:\n",
1197 " | \n", 1262 " |\n",
1198 " | __dict__\n", 1263 " | __dict__\n",
1199 " | dictionary for instance variables (if defined)\n", 1264 " | dictionary for instance variables\n",
1200 " | \n", 1265 " |\n",
1201 " | __weakref__\n", 1266 " | __weakref__\n",
1202 " | list of weak references to the object (if defined)\n", 1267 " | list of weak references to the object\n",
1203 "\n" 1268 "\n"
1204 ] 1269 ]
1205 } 1270 }
@@ -1256,7 +1321,7 @@
1256 }, 1321 },
1257 { 1322 {
1258 "cell_type": "code", 1323 "cell_type": "code",
1259 "execution_count": 12, 1324 "execution_count": 52,
1260 "id": "95a1d0cc-0006-4ddc-b08d-d0b8b02acfba", 1325 "id": "95a1d0cc-0006-4ddc-b08d-d0b8b02acfba",
1261 "metadata": {}, 1326 "metadata": {},
1262 "outputs": [ 1327 "outputs": [
@@ -1324,7 +1389,7 @@
1324 }, 1389 },
1325 { 1390 {
1326 "cell_type": "code", 1391 "cell_type": "code",
1327 "execution_count": 13, 1392 "execution_count": 53,
1328 "id": "38066107-0190-4383-ba14-a4e9cd454a9c", 1393 "id": "38066107-0190-4383-ba14-a4e9cd454a9c",
1329 "metadata": {}, 1394 "metadata": {},
1330 "outputs": [ 1395 "outputs": [
@@ -1418,7 +1483,7 @@
1418 "name": "python", 1483 "name": "python",
1419 "nbconvert_exporter": "python", 1484 "nbconvert_exporter": "python",
1420 "pygments_lexer": "ipython3", 1485 "pygments_lexer": "ipython3",
1421 "version": "3.11.7" 1486 "version": "3.13.9"
1422 } 1487 }
1423 }, 1488 },
1424 "nbformat": 4, 1489 "nbformat": 4,
diff --git a/reveal.js/cryptographic_primitives.html b/reveal.js/cryptographic_primitives.html
new file mode 100644
index 0000000..4b2e6fc
--- /dev/null
+++ b/reveal.js/cryptographic_primitives.html
@@ -0,0 +1,494 @@
1<!DOCTYPE html>
2<html lang="en">
3 <head>
4 <meta charset="utf-8" />
5 <title>Introduction to cryptographic primitives</title>
6 <meta name="author" content="Simeon Simeonov"/>
7 <meta name="mobile-web-app-capable" content="yes"/>
8 <meta name="mobile-web-app-status-bar-style" content="black-translucent"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
10
11 <link rel="stylesheet" href="dist/reset.css"/>
12 <link rel="stylesheet" href="dist/reveal.css"/>
13
14 <!-- <link rel="stylesheet" href="dist/theme/black.css" id="theme"/> -->
15 <link rel="stylesheet" href="dist/theme/statnett.css" id="theme"/>
16
17 <!-- Theme used for syntax highlighting of code -->
18 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"/>
19 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"/> -->
20 </head>
21
22 <body>
23 <div class="reveal">
24 <!-- Any section element inside of this container is displayed as a slide -->
25 <div class="slides">
26
27 <section>
28 <h2>Introduction to cryptographic primitives</h2>
29 </br>
30 <p><small>Simeon Simeonov - TDE</small></p>
31 </section>
32
33
34 <section>
35 <h2>What are cryptographic primitives?</h2>
36 </br>
37 <p>Cryptographic primitives are the most basic building blocks in cryptographic systems and protocols.</p>
38 <p>Creating cryptographic routines is very hard, and testing them to be reliable takes a long time, it is essentially never sensible (nor secure) to design a new cryptographic primitive to suit the needs of a new cryptographic system.</p>
39 <p>Since algorithms in this field are not only required to be designed well but also need to be tested well by the cryptologist community, even if a cryptographic routine looks good from a design point of view it might still contain errors. Successfully withstanding such scrutiny gives some confidence (in fact, so far, the only confidence) that the algorithm is indeed secure enough to use. Security proofs for cryptographic primitives are generally not available.</p>
40 <p>When choosing primitive for a cryptographic system, one should always consider if the primitive:</p>
41 <ul>
42 <li>is open and can be studied by the community</li>
43 <li>is patented</li>
44 </ul>
45 </section>
46
47
48 <section>
49 <h2>Agenda</h2>
50 </br>
51 <section id="fragments">
52 <ul>
53 <span class="fragment"><li>cryptographic hash functions</li></span>
54 <span class="fragment"><li>cryptographically secure random generators (the very basics)</li></span>
55 <span class="fragment"><li>symmetric ciphers</li></span>
56 <span class="fragment"><li>public-key cryptography / asymmetric cryptography</li></span>
57 </ul>
58 </section>
59 </section>
60
61
62 <section>
63 <h2>Cryptographic hash functions</h2>
64 <p>A hash function is any function that can be used to map data of arbitrary size to fixed-size values (or a set of fixed-size values)</p>
65 <p>Cryptographic hash functions or cryptographically secure hash functions are hash functions with special properties (making them desirable for cryptographic systems)</p>
66 <p>(Over)simplified list of desired properties:</p>
67 <ul>
68 <li>the probability of a particular output result (hash value) <em>n</em> for a random input string ("message") is 2^(-n) (as for any good hash), so the hash value can be used as a representative of the message</li>
69 <li>given a hash value <em>h</em>, it should be difficult to find any message <em>m</em> such that <em>h = hash(m)</em> ("reversing the function")</li>
70 <li>given an input <em>m1</em>, it should be difficult to find a different input <em>m2</em> such that <em>hash(m1) = hash(m2)</em> (weak collision resistance)</li>
71 <li>it should be difficult to find two different messages <em>m1</em> and <em>m2</em> such that <em>hash(m1) = hash(m2)</em>. Such a pair is called a cryptographic hash collision (strong collision resistance)</li>
72 <li>if an input is changed slightly (for example, flipping a single bit), the output changes significantly (avalanche effect) - a property also desired in ciphers</li>
73 <li>being fast is always a nice bonus :)</li>
74 </ul>
75 </section>
76
77
78 <section>
79 <h2>MD5</h2>
80 <table>
81 <tbody>
82 <tr>
83 <td>Designers</td>
84 <td>Ronald Rivest</td>
85 </tr>
86 <tr>
87 <td>Published</td>
88 <td>1992</td>
89 </tr>
90 <tr>
91 <td>Digest size</td>
92 <td>128 bits (16 bytes)</td>
93 </tr>
94 <tr>
95 <td>Block size</td>
96 <td>512 bits</td>
97 </tr>
98 <tr>
99 <td>Broken?</td>
100 <td>Yes (broken collision resistance in 2^18 time)</td>
101 </tr>
102 </tbody>
103 </table>
104 <p>Still in use in lagacy applications and in applications where collision resistance is not needed</p>
105 </section>
106
107
108 <section>
109 <h2>SHA-1 (Secure Hash Algorithm 1)</h2>
110 <table>
111 <tbody>
112 <tr>
113 <td>Designers</td>
114 <td>NSA</td>
115 </tr>
116 <tr>
117 <td>Published</td>
118 <td>1995</td>
119 </tr>
120 <tr>
121 <td>Digest size</td>
122 <td>160 bits (20 bytes)</td>
123 </tr>
124 <tr>
125 <td>Block size</td>
126 <td>512 bits</td>
127 </tr>
128 <tr>
129 <td>Broken?</td>
130 <td>Yes</td>
131 </tr>
132 </tbody>
133 </table>
134 <p>Still in use. Revision control systems such as <em>Git</em>, <em>Mercurial</em>, and <em>Monotone</em> use <em>SHA-1</em>, not for security, but to identify revisions and to ensure that the data has not changed due to accidental corruption.</p>
135 </section>
136
137
138 <section>
139 <h2>SHA-2</h2>
140 <table>
141 <tbody>
142 <tr>
143 <td>Designers</td>
144 <td>NSA</td>
145 </tr>
146 <tr>
147 <td>Published</td>
148 <td>2001</td>
149 </tr>
150 <tr>
151 <td>Digest sizes</td>
152 <td>224, 256, 384 or 512 bits</td>
153 </tr>
154 <tr>
155 <td>Block sizes</td>
156 <td>256 bits (SHA-224 and SHA-256) or 512 bits</td>
157 </tr>
158 <tr>
159 <td>Broken?</td>
160 <td>No</td>
161 </tr>
162 </tbody>
163 </table>
164 </section>
165
166
167 <section>
168 <h2>SHA-3</h2>
169 <table>
170 <tbody>
171 <tr>
172 <td>Designers</td>
173 <td>Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles van Assche</td>
174 </tr>
175 <tr>
176 <td>Published</td>
177 <td>2016</td>
178 </tr>
179 <tr>
180 <td>Digest size</td>
181 <td>arbitrary</td>
182 </tr>
183 <tr>
184 <td>Block size</td>
185 <td>variable</td>
186 </tr>
187 <tr>
188 <td>Broken?</td>
189 <td>No</td>
190 </tr>
191 </tbody>
192 </table>
193 <p>Based on Keccak - winner of the NIST hash function competition after some controversial adjustments. Very fast and flexible.</p>
194 </section>
195
196
197 <section>
198 <h2>BLAKE2</h2>
199 <table>
200 <tbody>
201 <tr>
202 <td>Designers</td>
203 <td>Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn and Christian Winnerlein</td>
204 </tr>
205 <tr>
206 <td>Published</td>
207 <td>2008 (BLAKE)</td>
208 </tr>
209 <tr>
210 <td>Digest size</td>
211 <td>up to 64 bytes (BLAKE2b), up to 32 bytes (BLAKE2s)</td>
212 </tr>
213 <tr>
214 <td>Block size</td>
215 <td>variable (stream)</td>
216 </tr>
217 <tr>
218 <td>Broken?</td>
219 <td>No</td>
220 </tr>
221 </tbody>
222 </table>
223 <p>BLAKE2 is based on Daniel J. Bernstein's ChaCha stream cipher and is extremely fast. BLAKE2b and BLAKE2s are specified in RFC 7693.</p>
224 </section>
225
226
227 <section>
228 <h2>Application of cryptographic hash functions</h2>
229 <p>Cryptographic hash functions are used for many different things in cryptographic systems and protocols. Few examples:</p>
230 <ul>
231 <li>can be used directly (f.i. sha256sum - part of GNU coreutils)</li>
232 <li>message authentication code (MAC)</li>
233 <li>password hashing / key derivation</li>
234 <li>proof of work</li>
235 </ul>
236 </section>
237
238
239 <section>
240 <h2>HMAC</h2>
241 <p>HMAC (hash-based message authentication code) is a specific type of message authentication code (MAC) involving a cryptographic hash function and a secret cryptographic key. It may be used to simultaneously verify both the data integrity and authenticity of a message. An HMAC is a type of keyed hash function that can also be used in a key derivation scheme or a key stretching scheme.</p>
242 <p>HMAC can provide authentication using a shared secret instead of using digital signatures with asymmetric cryptography. It trades off the need for a complex public key infrastructure by delegating the key exchange to the communicating parties, who are responsible for establishing and using a trusted channel to agree on the key prior to communication.</p>
243 <img src="images/cryptographic_primitives/hmac.svg"></img>
244 <p><em>XOR</em> (eXclusive OR) - is a logical operator</p>
245 <p>With two inputs, XOR is true if and only if the inputs differ (one is true, one is false)</p>
246 </section>
247
248
249 <section>
250 <h2>PBKDF2</h2>
251 <p>PBKDF2 (Password-Based Key Derivation Function 2) is a key derivation function with a sliding computational cost, used to reduce vulnerability to brute-force attacks.</p>
252 <p>PBKDF2 applies a pseudorandom function, such as <em>HMAC</em>, to the input password or passphrase along with a <em>salt</em> value and repeats the process many times to produce a derived key, which can then be used as a cryptographic key in subsequent operations. The added computational work makes password cracking much more difficult, and is known as <em>key stretching</em>.</p>
253 <h4>Demo</h4>
254 </section>
255
256
257 <section>
258 <h2>Proof of work</h2>
259 <h4>Demo</h4>
260 </section>
261
262
263 <section>
264 <h3>Cryptographically secure random generators</h3>
265 <p>Most cryptographic applications require random numbers for: generating keys, initialization vectors, nonces (arbitrary numbers that can be used just once), salts, tokens etc, etc.</p>
266 <p>The "quality" of the randomness required for these applications varies. For example, creating a <em>nonce</em> in some protocols needs only uniqueness. On the other hand, the generation of a master key requires a higher quality, such as more entropy.</p>
267 <p>Entropy is obtained from a high-quality source, generally the operating system's randomness API.</p>
268 <p>In practical situations, numbers are needed with more randomness than the available entropy can provide. Also, the processes to extract randomness from a running system are slow in actual practice. In such instances, a cryptographically secure pseudorandom number generator (CSPRNG) can sometimes be used. A CSPRNG can "stretch" the available entropy over more bits.</p>
269 </section>
270
271
272 <section>
273 <h3>Cryptographically secure random generators (cont...)</h3>
274 <p>CSPRNG must</p>
275 <ul>
276 <li>pass statistical randomness tests - f.i. given the first k bits of a random sequence, there is no polynomial-time algorithm that can predict the (k+1)th bit with probability of success non-negligibly better than 50%</li>
277 <li>be attack resistant - f.i. in the event that part or all of its state has been revealed it should be impossible to reconstruct the stream of random numbers prior to the revelation</li>
278 </ul>
279 <p>"Practical" CSPRNG schemes not only include an CSPRNG algorithm, but also a way to initialize ("seed") it while keeping the seed secret.</p>
280 </section>
281
282
283 <section>
284 <h3>Symmetric-key algorithms / symmetric ciphers</h3>
285 <p>Symmetric ciphers use the same cryptographic keys for both the encryption of <em>plaintext</em> and the decryption of <em>ciphertext</em>.</p>
286 <p>“Anyone, from the most clueless amateur to the best cryptographer, can create an algorithm that he himself can’t break. It’s not even hard. What is hard is creating an algorithm that no one else can break, even after years of analysis. And the only way to prove that is to subject the algorithm to years of analysis by the best cryptographers around.” - Bruce Schneier</p>
287 <p>A "perfect" cipher - the one-time pad has been known since 1882, but is not practically applicable in modern systems:</p>
288 <ul>
289 <li>generate random stream (pad) with length = len(plaintext)</li>
290 <li>ciphertext = plaintext XOR pad</li>
291 </ul>
292
293 <p>There two types of modern ciphers:</p>
294 <ul>
295 <li>block ciphers - operate on fixed-length groups of bits, called blocks (padding may be used to the remaining bits)</li>
296 <li>stream ciphers - plaintext digits are combined (XORed) with a pseudorandom cipher digit stream (keystream).</li>
297 </ul>
298 </section>
299
300
301 <section>
302 <h2>DES (Data Encryption Standard)</h2>
303 <table>
304 <tbody>
305 <tr>
306 <td>Designer</td>
307 <td>IBM</td>
308 </tr>
309 <tr>
310 <td>Published</td>
311 <td>1975</td>
312 </tr>
313 <tr>
314 <td>Key size</td>
315 <td>56 bits</td>
316 </tr>
317 <tr>
318 <td>Block size</td>
319 <td>64 bits</td>
320 </tr>
321 </tbody>
322 </table>
323 <p>Not used anymore. 3DES was published in 1981 (with keysize of 112 bits or 168 bits).</p>
324 </section>
325
326
327 <section>
328 <h2>Blowfish</h2>
329 <table>
330 <tbody>
331 <tr>
332 <td>Designer</td>
333 <td>Bruce Schneier</td>
334 </tr>
335 <tr>
336 <td>Published</td>
337 <td>1993</td>
338 </tr>
339 <tr>
340 <td>Key size</td>
341 <td>32-448 bits</td>
342 </tr>
343 <tr>
344 <td>Block size</td>
345 <td>64 bits</td>
346 </tr>
347 </tbody>
348 </table>
349 <p>Schneier has stated that "Blowfish is unpatented, and will remain so in all countries. The algorithm is hereby placed in the public domain, and can be freely used by anyone.". Still in use in legacy applications and notably in the <em>bcrypt</em> password hashing function.</p>
350 </section>
351
352
353 <section>
354 <h2>AES (Advanced Encryption Standard - Rijndael)</h2>
355 <table>
356 <tbody>
357 <tr>
358 <td>Designer</td>
359 <td>Joan Daemen, Vincent Rijmen</td>
360 </tr>
361 <tr>
362 <td>Published</td>
363 <td>1998</td>
364 </tr>
365 <tr>
366 <td>Key size</td>
367 <td>128 bits, 192 bits or 256 bits</td>
368 </tr>
369 <tr>
370 <td>Block size</td>
371 <td>128 bits</td>
372 </tr>
373 </tbody>
374 </table>
375 <p>Rijndael was thew winner of the NIST AES selection process. Currently the most widely adopted block cipher (both in hardware and software).</p>
376 </section>
377
378
379 <section>
380 <h3>Mode of operation for block ciphers</h3>
381 <p>A block cipher by itself is only suitable for the secure cryptographic transformation (encryption or decryption) of one fixed-length group of bits called a block. A mode of operation describes how to repeatedly apply a cipher's single-block operation to securely transform amounts of data larger than a block.</p>
382 <img src="images/cryptographic_primitives/modes_of_operation.png" style="width: 30vw;"></img>
383 </section>
384
385
386 <section>
387 <h3>Galois/counter (GCM)</h3>
388 <p>The GCM algorithm provides both data authenticity (integrity) and confidentiality and belongs to the class of authenticated encryption with associated data (AEAD) methods. This means that as input it takes a key <em>K</em>, some plaintext <em>P</em>, and some associated data <em>AD</em>; it then encrypts the plaintext using the key to produce ciphertext <em>C</em>, and computes an authentication tag <em>T</em> from the ciphertext and the associated data (which remains unencrypted). A recipient with knowledge of <em>K</em>, upon reception of <em>AD</em>, <em>C</em> and <em>T</em>, can decrypt the ciphertext to recover the plaintext <em>P</em> and can check the tag <em>T</em> to ensure that neither ciphertext nor associated data were tampered with.</p>
389 <img src="images/cryptographic_primitives/GCM.svg" style="width: 12vw;"></img>
390 </section>
391
392
393 <section>
394 <h2>Stream ciphers</h2>
395 <p> Stream ciphers typically execute at a higher speed than block ciphers and have lower hardware complexity. However, stream ciphers can be susceptible to security breaches, for example, when the same starting state (seed) is used twice.</p>
396 <p>Essentially they behave as pseudorandom functions where they key is / is part of the "seed".</p>
397 <br/>
398 <h4>ChaCha</h4>
399 <table>
400 <tbody>
401 <tr>
402 <td>Designer</td>
403 <td>Daniel J. Bernstein (djb)</td>
404 </tr>
405 <tr>
406 <td>Published</td>
407 <td>2008</td>
408 </tr>
409 <tr>
410 <td>Key size</td>
411 <td>128 bits or 256 bits</td>
412 </tr>
413 </tbody>
414 </table>
415 <br/>
416 <h5>ChaCha20-Poly1305</h5>
417 <p><em>ChaCha20-Poly1305</em> is an <em>AEAD</em> algorithm, that combines the <em>ChaCha20</em> stream cipher with the <em>Poly1305</em> message authentication code. It has fast software performance, and without hardware acceleration, is usually faster than <em>AES-GCM</em>.</p>
418 </section>
419
420
421 <section>
422 <h3>Public-key cryptography / asymmetric cryptography</h3>
423 <p>Asymmetric cryptography makes use pairs of related keys. Each key pair consists of a <em>public key</em> and a corresponding <em>private key</em>. Key pairs are generated with cryptographic algorithms based on mathematical problems termed <em>one-way functions</em>. Security of public-key cryptography depends on keeping the private key secret, while the public key can be openly distributed without compromising security.</p>
424 <p>Usually we use public key cryptography for:</p>
425 <ul>
426 <li>public key encryption - a message is encrypted with the intended recipient's public key. For properly chosen and used algorithms, messages cannot in practice be decrypted by anyone who does not possess the matching private key, who is thus presumed to be the owner of that key and so the person associated with the public key. This can be used to ensure confidentiality of a message.</li>
427 <li>digital signatures - a message is signed with the sender's private key and can be verified by anyone who has access to the sender's public key. This verification proves that the sender had access to the private key, and therefore is very likely to be the person associated with the public key. It also proves that the signature was prepared for that exact message, since a signature that passes verification with the public key on one message will not pass verification with the public key on other messages.</li>
428 </ul>
429 </section>
430
431
432 <section>
433 <h3>RSA</h3>
434 <table>
435 <tbody>
436 <tr>
437 <td>Designers</td>
438 <td>Ron Rivest, Adi Shamir and Leonard Adleman</td>
439 </tr>
440 <tr>
441 <td>Published</td>
442 <td>1977, patented until 2000 :(</td>
443 </tr>
444 </tbody>
445 </table>
446 <br/>
447 <h4>Using RSA</h4>
448 <p>The security of RSA relies on the practical difficulty of factoring the product of two large prime numbers, the "factoring problem". Still the most widely used public key system. A key size of 2048 or 4096 bits should be used. A very good CSPRNG is needed.</p>
449 <p>In modern cryptographic systems and protocols (like TLS >= 1.2) RSA is only used for verifying that the client is initiating session with the "right" server. Encryption / decryption is performed using common negotiated key and symmetric ciphers.</p>
450 <p><em>Forward secrecy</em> is a desired feature of specific key-agreement protocols that gives assurances that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised, limiting damage. For HTTPS, the long-term secret is typically the private key of the server.</p>
451 </section>
452
453
454 <section>
455 <h2>Post-quantum cryptography</h2>
456 <p>Post-quantum cryptography (PQC), sometimes referred to as quantum-proof, quantum-safe, or quantum-resistant, is the development of cryptographic algorithms (usually public-key algorithms) that are thought to be secure against a cryptanalytic attack by a quantum computer. Most widely-used public-key algorithms rely on the difficulty of one of three mathematical problems: the integer factorization problem, the discrete logarithm problem or the elliptic-curve discrete logarithm problem. All of these problems could be easily solved on a sufficiently powerful quantum computer running Shor's algorithm or even faster and less demanding (in terms of the number of qubits required) alternatives.</p>
457 </section>
458
459
460 <section>
461 <h1>Q &amp; A</h1>
462 </section>
463
464
465 </div>
466 </div>
467
468 <script src="dist/reveal.js"></script>
469 <script src="dist/plugin/zoom.js"></script>
470 <script src="dist/plugin/notes.js"></script>
471 <script src="dist/plugin/search.js"></script>
472 <script src="dist/plugin/markdown.js"></script>
473 <script src="dist/plugin/highlight.js"></script>
474 <script>
475 // Also available as an ES module, see: https://revealjs.com/initialization/
476 // import Reveal from 'reveal.js';
477 // import RevealZoom from 'reveal.js/plugin/zoom';
478 // import RevealNotes from 'reveal.js/plugin/notes';
479 // import RevealSearch from 'reveal.js/plugin/search';
480 // import RevealMarkdown from 'reveal.js/plugin/markdown';
481 // import RevealHighlight from 'reveal.js/plugin/highlight';
482
483 Reveal.initialize({
484 controls: true,
485 progress: true,
486 center: true,
487 hash: true,
488
489 // Learn about plugins: https://revealjs.com/plugins/
490 plugins: [RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight],
491 });
492 </script>
493 </body>
494</html>
diff --git a/reveal.js/demo.html b/reveal.js/demo.html
index 39b014d..20ed6cd 100644
--- a/reveal.js/demo.html
+++ b/reveal.js/demo.html
@@ -1,47 +1,58 @@
1<!doctype html> 1<!DOCTYPE html>
2<html lang="en"> 2<html lang="en">
3
4 <head> 3 <head>
5 <meta charset="utf-8"> 4 <meta charset="utf-8" />
6 5
7 <title>reveal.js – The HTML Presentation Framework</title> 6 <title>reveal.js – The HTML Presentation Framework</title>
8 7
9 <meta name="description" content="A framework for easily creating beautiful presentations using HTML"> 8 <meta
10 <meta name="author" content="Hakim El Hattab"> 9 name="description"
10 content="A framework for easily creating beautiful presentations using HTML"
11 />
12 <meta name="author" content="Hakim El Hattab" />
11 13
12 <meta name="apple-mobile-web-app-capable" content="yes"> 14 <meta name="mobile-web-app-capable" content="yes" />
13 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 15 <meta name="mobile-web-app-status-bar-style" content="black-translucent" />
14 16
15 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 17 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
16 18
17 <link rel="stylesheet" href="dist/reset.css"> 19 <link rel="stylesheet" href="dist/reset.css" />
18 <link rel="stylesheet" href="dist/reveal.css"> 20 <link rel="stylesheet" href="dist/reveal.css" />
19 <link rel="stylesheet" href="dist/theme/black.css" id="theme"> 21 <link rel="stylesheet" href="dist/theme/black.css" id="theme" />
20 22
21 <!-- Theme used for syntax highlighting of code --> 23 <!-- Theme used for syntax highlighting of code -->
22 <link rel="stylesheet" href="plugin/highlight/monokai.css"> 24 <link rel="stylesheet" href="dist/plugin/highlight/monokai.css" />
23 </head> 25 </head>
24 26
25 <body> 27 <body>
26
27 <div class="reveal"> 28 <div class="reveal">
28
29 <!-- Any section element inside of this container is displayed as a slide --> 29 <!-- Any section element inside of this container is displayed as a slide -->
30 <div class="slides"> 30 <div class="slides">
31 <section> 31 <section>
32 <a href="https://revealjs.com"> 32 <a href="https://revealjs.com">
33 <img src="https://static.slid.es/reveal/logo-v1/reveal-white-text.svg" alt="reveal.js logo" style="height: 180px; margin: 0 auto 4rem auto; background: transparent;" class="demo-logo"> 33 <img
34 src="https://static.slid.es/reveal/logo-v1/reveal-white-text.svg"
35 alt="reveal.js logo"
36 style="height: 180px; margin: 0 auto 4rem auto; background: transparent"
37 class="demo-logo"
38 />
34 </a> 39 </a>
35 <h3>The HTML Presentation Framework</h3> 40 <h3>The HTML Presentation Framework</h3>
36 <p> 41 <p>
37 <small>Created by <a href="http://hakim.se">Hakim El Hattab</a> and <a href="https://github.com/hakimel/reveal.js/graphs/contributors">contributors</a></small> 42 <small
43 >Created by <a href="http://hakim.se">Hakim El Hattab</a> and
44 <a href="https://github.com/hakimel/reveal.js/graphs/contributors"
45 >contributors</a
46 ></small
47 >
38 </p> 48 </p>
39 </section> 49 </section>
40 50
41 <section> 51 <section>
42 <h2>Hello There</h2> 52 <h2>Hello There</h2>
43 <p> 53 <p>
44 reveal.js enables you to create beautiful interactive slide decks using HTML. This presentation will show you examples of what it can do. 54 reveal.js enables you to create beautiful interactive slide decks using HTML. This
55 presentation will show you examples of what it can do.
45 </p> 56 </p>
46 </section> 57 </section>
47 58
@@ -51,21 +62,38 @@
51 <h2>Vertical Slides</h2> 62 <h2>Vertical Slides</h2>
52 <p>Slides can be nested inside of each other.</p> 63 <p>Slides can be nested inside of each other.</p>
53 <p>Use the <em>Space</em> key to navigate through all slides.</p> 64 <p>Use the <em>Space</em> key to navigate through all slides.</p>
54 <br> 65 <br />
55 <a href="#/2/1" class="navigate-down"> 66 <a href="#/2/1" class="navigate-down">
56 <img class="r-frame" style="background: rgba(255,255,255,0.1);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Down arrow"> 67 <img
68 class="r-frame"
69 style="background: rgba(255, 255, 255, 0.1)"
70 width="178"
71 height="238"
72 data-src="https://static.slid.es/reveal/arrow.png"
73 alt="Down arrow"
74 />
57 </a> 75 </a>
58 </section> 76 </section>
59 <section> 77 <section>
60 <h2>Basement Level 1</h2> 78 <h2>Basement Level 1</h2>
61 <p>Nested slides are useful for adding additional detail underneath a high level horizontal slide.</p> 79 <p>
80 Nested slides are useful for adding additional detail underneath a high level
81 horizontal slide.
82 </p>
62 </section> 83 </section>
63 <section> 84 <section>
64 <h2>Basement Level 2</h2> 85 <h2>Basement Level 2</h2>
65 <p>That's it, time to go back up.</p> 86 <p>That's it, time to go back up.</p>
66 <br> 87 <br />
67 <a href="#/2"> 88 <a href="#/2">
68 <img class="r-frame" style="background: rgba(255,255,255,0.1); transform: rotate(180deg);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Up arrow"> 89 <img
90 class="r-frame"
91 style="background: rgba(255, 255, 255, 0.1); transform: rotate(180deg)"
92 width="178"
93 height="238"
94 data-src="https://static.slid.es/reveal/arrow.png"
95 alt="Up arrow"
96 />
69 </a> 97 </a>
70 </section> 98 </section>
71 </section> 99 </section>
@@ -73,37 +101,46 @@
73 <section> 101 <section>
74 <h2>Slides</h2> 102 <h2>Slides</h2>
75 <p> 103 <p>
76 Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at <a href="https://slides.com" target="_blank">https://slides.com</a>. 104 Not a coder? Not a problem. There's a fully-featured visual editor for authoring these,
105 try it out at <a href="https://slides.com" target="_blank">https://slides.com</a>.
77 </p> 106 </p>
78 </section> 107 </section>
79 108
80 <section data-visibility="hidden"> 109 <section data-visibility="hidden">
81 <h2>Hidden Slides</h2> 110 <h2>Hidden Slides</h2>
82 <p> 111 <p>
83 This slide is visible in the source, but hidden when the presentation is viewed. You can show all hidden slides by setting the `showHiddenSlides` config option to `true`. 112 This slide is visible in the source, but hidden when the presentation is viewed. You can
113 show all hidden slides by setting the `showHiddenSlides` config option to `true`.
84 </p> 114 </p>
85 </section> 115 </section>
86 116
87 <section data-auto-animate> 117 <section data-auto-animate>
88 <h2 data-id="code-title">Pretty Code</h2> 118 <h2 data-id="code-title">Pretty Code</h2>
89 <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers> 119 <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers>
90 import React, { useState } from 'react'; 120 import { useState } from 'react';
91 121
92 function Example() { 122 function Example() {
93 const [count, setCount] = useState(0); 123 const [count, setCount] = useState(0);
94 124
95 return ( 125 return (
96 ... 126
127 ...
128
97 ); 129 );
98 } 130 }
99 </code></pre> 131 </code></pre>
100 <p>Code syntax highlighting courtesy of <a href="https://highlightjs.org/usage/">highlight.js</a>.</p> 132 <p>
133 Code syntax highlighting courtesy of
134 <a href="https://highlightjs.org/usage/">highlight.js</a>.
135 </p>
101 </section> 136 </section>
102 137
103 <section data-auto-animate> 138 <section data-auto-animate>
104 <h2 data-id="code-title">With animations</h2> 139 <h2 data-id="code-title">With Animations</h2>
105 <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|4,8-11|17|22-24"><script type="text/template"> 140 <pre
106 import React, { useState } from 'react'; 141 data-id="code-animation"
142 ><code class="hljs javascript" data-trim data-line-numbers="|4,8-11|17|22-24"><script type="text/template">
143 import { useState } from 'react';
107 144
108 function Example() { 145 function Example() {
109 const [count, setCount] = useState(0); 146 const [count, setCount] = useState(0);
@@ -135,60 +172,92 @@
135 172
136 <section> 173 <section>
137 <h2>Point of View</h2> 174 <h2>Point of View</h2>
175 <p>Press <strong>ESC</strong> to enter the slide overview.</p>
138 <p> 176 <p>
139 Press <strong>ESC</strong> to enter the slide overview. 177 Hold down the <strong>alt</strong> key (<strong>ctrl</strong> in Linux) and click on any
140 </p> 178 element to zoom towards it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>.
141 <p> 179 Click again to zoom back out.
142 Hold down the <strong>alt</strong> key (<strong>ctrl</strong> in Linux) and click on any element to zoom towards it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>. Click again to zoom back out.
143 </p>
144 <p>
145 (NOTE: Use ctrl + click in Linux.)
146 </p> 180 </p>
181 <p>(NOTE: Use ctrl + click in Linux.)</p>
147 </section> 182 </section>
148 183
149 <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> 184 <section
185 data-auto-animate
186 data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"
187 >
150 <h2>Auto-Animate</h2> 188 <h2>Auto-Animate</h2>
151 <p>Automatically animate matching elements across slides with <a href="https://revealjs.com/auto-animate/">Auto-Animate</a>.</p> 189 <p>
190 Automatically animate matching elements across slides with
191 <a href="https://revealjs.com/auto-animate/">Auto-Animate</a>.
192 </p>
152 <div class="r-hstack justify-center"> 193 <div class="r-hstack justify-center">
153 <div data-id="box1" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> 194 <div
154 <div data-id="box2" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> 195 data-id="box1"
155 <div data-id="box3" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> 196 style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px"
197 ></div>
198 <div
199 data-id="box2"
200 style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px"
201 ></div>
202 <div
203 data-id="box3"
204 style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px"
205 ></div>
156 </div> 206 </div>
157 </section> 207 </section>
158 <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> 208 <section
209 data-auto-animate
210 data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"
211 >
159 <div class="r-hstack justify-center"> 212 <div class="r-hstack justify-center">
160 <div data-id="box1" data-auto-animate-delay="0" style="background: cyan; width: 150px; height: 100px; margin: 10px;"></div> 213 <div
161 <div data-id="box2" data-auto-animate-delay="0.1" style="background: magenta; width: 150px; height: 100px; margin: 10px;"></div> 214 data-id="box1"
162 <div data-id="box3" data-auto-animate-delay="0.2" style="background: yellow; width: 150px; height: 100px; margin: 10px;"></div> 215 data-auto-animate-delay="0"
216 style="background: cyan; width: 150px; height: 100px; margin: 10px"
217 ></div>
218 <div
219 data-id="box2"
220 data-auto-animate-delay="0.1"
221 style="background: magenta; width: 150px; height: 100px; margin: 10px"
222 ></div>
223 <div
224 data-id="box3"
225 data-auto-animate-delay="0.2"
226 style="background: yellow; width: 150px; height: 100px; margin: 10px"
227 ></div>
163 </div> 228 </div>
164 <h2 style="margin-top: 20px;">Auto-Animate</h2> 229 <h2 style="margin-top: 20px">Auto-Animate</h2>
165 </section> 230 </section>
166 <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> 231 <section
232 data-auto-animate
233 data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"
234 >
167 <div class="r-stack"> 235 <div class="r-stack">
168 <div data-id="box1" style="background: cyan; width: 300px; height: 300px; border-radius: 200px;"></div> 236 <div data-id="box1" style="background: cyan; width: 300px; height: 300px"></div>
169 <div data-id="box2" style="background: magenta; width: 200px; height: 200px; border-radius: 200px;"></div> 237 <div data-id="box2" style="background: magenta; width: 200px; height: 200px"></div>
170 <div data-id="box3" style="background: yellow; width: 100px; height: 100px; border-radius: 200px;"></div> 238 <div data-id="box3" style="background: yellow; width: 100px; height: 100px"></div>
171 </div> 239 </div>
172 <h2 style="margin-top: 20px;">Auto-Animate</h2> 240 <h2 style="margin-top: 20px">Auto-Animate</h2>
173 </section> 241 </section>
174 242
175 <section> 243 <section>
176 <h2>Touch Optimized</h2> 244 <h2>Touch Optimized</h2>
177 <p> 245 <p>
178 Presentations look great on touch devices, like mobile phones and tablets. Simply swipe through your slides. 246 Presentations look great on touch devices, like mobile phones and tablets. Simply swipe
247 through your slides.
179 </p> 248 </p>
180 </section> 249 </section>
181 250
182 <section data-markdown> 251 <section data-markdown>
183 <script type="text/template"> 252 <script type="text/template">
184 ## Markdown support 253 ## Markdown Support
185 254
186 Write content using inline or external Markdown. 255 Write content using inline or external Markdown.
187 Instructions and more info available in the [docs](https://revealjs.com/markdown/). 256 Instructions and more info available in the [docs](https://revealjs.com/markdown/).
188 257
189 ```html [] 258 ```html []
190 <section data-markdown> 259 <section data-markdown>
191 ## Markdown support 260 ## Markdown Support
192 261
193 Write content using inline or external Markdown. 262 Write content using inline or external Markdown.
194 Instructions and more info available in the [docs](https://revealjs.com/markdown/). 263 Instructions and more info available in the [docs](https://revealjs.com/markdown/).
@@ -198,6 +267,25 @@
198 </section> 267 </section>
199 268
200 <section> 269 <section>
270 <h2>Lightbox</h2>
271 Turn any element into a <a href="https://revealjs.com/lightbox/">lightbox</a> using <strong>data‑preview‑image</strong> & <strong>data‑preview‑video</strong>.
272 <div class="r-hstack" style="gap: 2rem;">
273 <div>
274 <pre style="font-size: 12px; width: 100%"><code class="html" data-trim>
275 &lt;img src="image.png" data-preview-image="image.png"&gt;
276 </code></pre>
277 <img src="https://static.slid.es/logo/v2/slides-symbol-1024x1024.png" height="100" data-preview-image>
278 </div>
279 <div>
280 <pre style="font-size: 12px; width: 100%"><code class="html" data-trim>
281 &lt;img src="video.png" data-preview-video="video.mp4"&gt;
282 </code></pre>
283 <img src="https://static.slid.es/site/homepage/v1/homepage-video-editor.png" height="100" data-preview-video="https://static.slid.es/site/homepage/v1/homepage-video-editor.mp4">
284 </div>
285 </div>
286 </section>
287
288 <section>
201 <p>Add the <code>r-fit-text</code> class to auto-size text</p> 289 <p>Add the <code>r-fit-text</code> class to auto-size text</p>
202 <h2 class="r-fit-text">FIT TEXT</h2> 290 <h2 class="r-fit-text">FIT TEXT</h2>
203 </section> 291 </section>
@@ -207,7 +295,10 @@
207 <h2>Fragments</h2> 295 <h2>Fragments</h2>
208 <p>Hit the next arrow...</p> 296 <p>Hit the next arrow...</p>
209 <p class="fragment">... to step through ...</p> 297 <p class="fragment">... to step through ...</p>
210 <p><span class="fragment">... a</span> <span class="fragment">fragmented</span> <span class="fragment">slide.</span></p> 298 <p>
299 <span class="fragment">... a</span> <span class="fragment">fragmented</span>
300 <span class="fragment">slide.</span>
301 </p>
211 302
212 <aside class="notes"> 303 <aside class="notes">
213 This slide has fragments which are also stepped through in the notes window. 304 This slide has fragments which are also stepped through in the notes window.
@@ -220,21 +311,25 @@
220 <p class="fragment shrink">shrink</p> 311 <p class="fragment shrink">shrink</p>
221 <p class="fragment fade-out">fade-out</p> 312 <p class="fragment fade-out">fade-out</p>
222 <p> 313 <p>
223 <span style="display: inline-block;" class="fragment fade-right">fade-right, </span> 314 <span style="display: inline-block" class="fragment fade-right">fade-right, </span>
224 <span style="display: inline-block;" class="fragment fade-up">up, </span> 315 <span style="display: inline-block" class="fragment fade-up">up, </span>
225 <span style="display: inline-block;" class="fragment fade-down">down, </span> 316 <span style="display: inline-block" class="fragment fade-down">down, </span>
226 <span style="display: inline-block;" class="fragment fade-left">left</span> 317 <span style="display: inline-block" class="fragment fade-left">left</span>
227 </p> 318 </p>
228 <p class="fragment fade-in-then-out">fade-in-then-out</p> 319 <p class="fragment fade-in-then-out">fade-in-then-out</p>
229 <p class="fragment fade-in-then-semi-out">fade-in-then-semi-out</p> 320 <p class="fragment fade-in-then-semi-out">fade-in-then-semi-out</p>
230 <p>Highlight <span class="fragment highlight-red">red</span> <span class="fragment highlight-blue">blue</span> <span class="fragment highlight-green">green</span></p> 321 <p>
322 Highlight <span class="fragment highlight-red">red</span>
323 <span class="fragment highlight-blue">blue</span>
324 <span class="fragment highlight-green">green</span>
325 </p>
231 </section> 326 </section>
232 </section> 327 </section>
233 328
234 <section id="transitions"> 329 <section id="transitions">
235 <h2>Transition Styles</h2> 330 <h2>Transition Styles</h2>
236 <p> 331 <p>
237 You can select from different transitions, like: <br> 332 You can select from different transitions, like: <br />
238 <a href="?transition=none#/transitions">None</a> - 333 <a href="?transition=none#/transitions">None</a> -
239 <a href="?transition=fade#/transitions">Fade</a> - 334 <a href="?transition=fade#/transitions">Fade</a> -
240 <a href="?transition=slide#/transitions">Slide</a> - 335 <a href="?transition=slide#/transitions">Slide</a> -
@@ -247,19 +342,73 @@
247 <section id="themes"> 342 <section id="themes">
248 <h2>Themes</h2> 343 <h2>Themes</h2>
249 <p> 344 <p>
250 reveal.js comes with a few themes built in: <br> 345 reveal.js comes with a few themes built in: <br />
251 <!-- Hacks to swap themes after the page has loaded. Not flexible and only intended for the reveal.js demo deck. --> 346 <!-- Hacks to swap themes after the page has loaded. Not flexible and only intended for the reveal.js demo deck. -->
252 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/black.css'); return false;">Black (default)</a> - 347 <a
253 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/white.css'); return false;">White</a> - 348 href="#/themes"
254 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/league.css'); return false;">League</a> - 349 onclick="document.getElementById('theme').setAttribute('href','dist/theme/black.css'); return false;"
255 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/sky.css'); return false;">Sky</a> - 350 >Black (default)</a
256 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/beige.css'); return false;">Beige</a> - 351 >
257 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/simple.css'); return false;">Simple</a> <br> 352 -
258 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/serif.css'); return false;">Serif</a> - 353 <a
259 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/blood.css'); return false;">Blood</a> - 354 href="#/themes"
260 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/night.css'); return false;">Night</a> - 355 onclick="document.getElementById('theme').setAttribute('href','dist/theme/white.css'); return false;"
261 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/moon.css'); return false;">Moon</a> - 356 >White</a
262 <a href="#" onclick="document.getElementById('theme').setAttribute('href','dist/theme/solarized.css'); return false;">Solarized</a> 357 >
358 -
359 <a
360 href="#/themes"
361 onclick="document.getElementById('theme').setAttribute('href','dist/theme/league.css'); return false;"
362 >League</a
363 >
364 -
365 <a
366 href="#/themes"
367 onclick="document.getElementById('theme').setAttribute('href','dist/theme/sky.css'); return false;"
368 >Sky</a
369 >
370 -
371 <a
372 href="#/themes"
373 onclick="document.getElementById('theme').setAttribute('href','dist/theme/beige.css'); return false;"
374 >Beige</a
375 >
376 -
377 <a
378 href="#/themes"
379 onclick="document.getElementById('theme').setAttribute('href','dist/theme/simple.css'); return false;"
380 >Simple</a
381 >
382 <br />
383 <a
384 href="#/themes"
385 onclick="document.getElementById('theme').setAttribute('href','dist/theme/serif.css'); return false;"
386 >Serif</a
387 >
388 -
389 <a
390 href="#/themes"
391 onclick="document.getElementById('theme').setAttribute('href','dist/theme/blood.css'); return false;"
392 >Blood</a
393 >
394 -
395 <a
396 href="#/themes"
397 onclick="document.getElementById('theme').setAttribute('href','dist/theme/night.css'); return false;"
398 >Night</a
399 >
400 -
401 <a
402 href="#/themes"
403 onclick="document.getElementById('theme').setAttribute('href','dist/theme/moon.css'); return false;"
404 >Moon</a
405 >
406 -
407 <a
408 href="#/themes"
409 onclick="document.getElementById('theme').setAttribute('href','dist/theme/solarized.css'); return false;"
410 >Solarized</a
411 >
263 </p> 412 </p>
264 </section> 413 </section>
265 414
@@ -267,10 +416,18 @@
267 <section data-background="#dddddd"> 416 <section data-background="#dddddd">
268 <h2>Slide Backgrounds</h2> 417 <h2>Slide Backgrounds</h2>
269 <p> 418 <p>
270 Set <code>data-background="#dddddd"</code> on a slide to change the background color. All CSS color formats are supported. 419 Set <code>data-background="#dddddd"</code> on a slide to change the background color.
420 All CSS color formats are supported.
271 </p> 421 </p>
272 <a href="#" class="navigate-down"> 422 <a href="#" class="navigate-down">
273 <img class="r-frame" style="background: rgba(255,255,255,0.1);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Down arrow"> 423 <img
424 class="r-frame"
425 style="background: rgba(255, 255, 255, 0.1)"
426 width="178"
427 height="238"
428 data-src="https://static.slid.es/reveal/arrow.png"
429 alt="Down arrow"
430 />
274 </a> 431 </a>
275 </section> 432 </section>
276 <section data-background-gradient="linear-gradient(to bottom, #283b95, #17b2c3)"> 433 <section data-background-gradient="linear-gradient(to bottom, #283b95, #17b2c3)">
@@ -282,12 +439,19 @@
282 <h2>Image Backgrounds</h2> 439 <h2>Image Backgrounds</h2>
283 <pre><code class="hljs html">&lt;section data-background="image.png"&gt;</code></pre> 440 <pre><code class="hljs html">&lt;section data-background="image.png"&gt;</code></pre>
284 </section> 441 </section>
285 <section data-background="https://static.slid.es/reveal/image-placeholder.png" data-background-repeat="repeat" data-background-size="100px"> 442 <section
443 data-background="https://static.slid.es/reveal/image-placeholder.png"
444 data-background-repeat="repeat"
445 data-background-size="100px"
446 >
286 <h2>Tiled Backgrounds</h2> 447 <h2>Tiled Backgrounds</h2>
287 <pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"&gt;</code></pre> 448 <pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"&gt;</code></pre>
288 </section> 449 </section>
289 <section data-background-video="https://static.slid.es/site/homepage/v1/homepage-video-editor.mp4" data-background-color="#000000"> 450 <section
290 <div style="background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px;"> 451 data-background-video="https://static.slid.es/site/homepage/v1/homepage-video-editor.mp4"
452 data-background-color="#000000"
453 >
454 <div style="background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px">
291 <h2>Video Backgrounds</h2> 455 <h2>Video Backgrounds</h2>
292 <pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background-video="video.mp4,video.webm"&gt;</code></pre> 456 <pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background-video="video.mp4,video.webm"&gt;</code></pre>
293 </div> 457 </div>
@@ -297,26 +461,48 @@
297 </section> 461 </section>
298 </section> 462 </section>
299 463
300 <section data-transition="slide" data-background="#4d7e65" data-background-transition="zoom"> 464 <section
465 data-transition="slide"
466 data-background="#4d7e65"
467 data-background-transition="zoom"
468 >
301 <h2>Background Transitions</h2> 469 <h2>Background Transitions</h2>
302 <p> 470 <p>
303 Different background transitions are available via the backgroundTransition option. This one's called "zoom". 471 Different background transitions are available via the backgroundTransition option. This
472 one's called "zoom".
304 </p> 473 </p>
305 <pre><code class="hljs javascript">Reveal.configure({ backgroundTransition: 'zoom' })</code></pre> 474 <pre><code class="hljs javascript">Reveal.configure({ backgroundTransition: 'zoom' })</code></pre>
306 </section> 475 </section>
307 476
308 <section data-transition="slide" data-background="#b5533c" data-background-transition="zoom"> 477 <section
478 data-transition="slide"
479 data-background="#b5533c"
480 data-background-transition="zoom"
481 >
309 <h2>Background Transitions</h2> 482 <h2>Background Transitions</h2>
310 <p> 483 <p>You can override background transitions per-slide.</p>
311 You can override background transitions per-slide.
312 </p>
313 <pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background-transition="zoom"&gt;</code></pre> 484 <pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background-transition="zoom"&gt;</code></pre>
314 </section> 485 </section>
315 486
316 <section data-background-iframe="https://hakim.se" data-background-interactive> 487 <section data-background-iframe="https://hakim.se" data-background-interactive>
317 <div style="position: absolute; width: 40%; right: 0; box-shadow: 0 1px 4px rgba(0,0,0,0.5), 0 5px 25px rgba(0,0,0,0.2); background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px; font-size: 20px; text-align: left;"> 488 <div
489 style="
490 position: absolute;
491 width: 40%;
492 right: 0;
493 box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 5px 25px rgba(0, 0, 0, 0.2);
494 background-color: rgba(0, 0, 0, 0.9);
495 color: #fff;
496 padding: 20px;
497 font-size: 20px;
498 text-align: left;
499 "
500 >
318 <h2>Iframe Backgrounds</h2> 501 <h2>Iframe Backgrounds</h2>
319 <p>Since reveal.js runs on the web, you can easily embed other web content. Try interacting with the page in the background.</p> 502 <p>
503 Since reveal.js runs on the web, you can easily embed other web content. Try
504 interacting with the page in the background.
505 </p>
320 </div> 506 </div>
321 </section> 507 </section>
322 508
@@ -372,11 +558,19 @@
372 <section> 558 <section>
373 <h2>Clever Quotes</h2> 559 <h2>Clever Quotes</h2>
374 <p> 560 <p>
375 These guys come in two forms, inline: <q cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">The nice thing about standards is that there are so many to choose from</q> and block: 561 These guys come in two forms, inline:
562 <q
563 cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations"
564 >The nice thing about standards is that there are so many to choose from</q
565 >
566 and block:
376 </p> 567 </p>
377 <blockquote cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations"> 568 <blockquote
378 &ldquo;For years there has been a theory that millions of monkeys typing at random on millions of typewriters would 569 cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations"
379 reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.&rdquo; 570 >
571 &ldquo;For years there has been a theory that millions of monkeys typing at random on
572 millions of typewriters would reproduce the entire works of Shakespeare. The Internet
573 has proven this theory to be untrue.&rdquo;
380 </blockquote> 574 </blockquote>
381 </section> 575 </section>
382 576
@@ -390,18 +584,36 @@
390 584
391 <section> 585 <section>
392 <h2>Speaker View</h2> 586 <h2>Speaker View</h2>
393 <p>There's a <a href="https://revealjs.com/speaker-view/">speaker view</a>. It includes a timer, preview of the upcoming slide as well as your speaker notes.</p> 587 <p>
588 There's a <a href="https://revealjs.com/speaker-view/">speaker view</a>. It includes a
589 timer, preview of the upcoming slide as well as your speaker notes.
590 </p>
394 <p>Press the <em>S</em> key to try it out.</p> 591 <p>Press the <em>S</em> key to try it out.</p>
395 592
396 <aside class="notes"> 593 <aside class="notes">
397 Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard). 594 Oh hey, these are some notes. They'll be hidden in your presentation, but you can see
595 them if you open the speaker notes window (hit 's' on your keyboard).
398 </aside> 596 </aside>
399 </section> 597 </section>
400 598
401 <section> 599 <section>
402 <h2>Export to PDF</h2> 600 <h2>Export to PDF</h2>
403 <p>Presentations can be <a href="https://revealjs.com/pdf-export/">exported to PDF</a>, here's an example:</p> 601 <p>
404 <iframe data-src="https://www.slideshare.net/slideshow/embed_code/42840540" width="445" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:3px solid #666; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> 602 Presentations can be <a href="https://revealjs.com/pdf-export/">exported to PDF</a>,
603 here's an example:
604 </p>
605 <iframe
606 data-src="https://www.slideshare.net/slideshow/embed_code/42840540"
607 width="445"
608 height="355"
609 frameborder="0"
610 marginwidth="0"
611 marginheight="0"
612 scrolling="no"
613 style="border: 3px solid #666; margin-bottom: 5px; max-width: 100%"
614 allowfullscreen
615 >
616 </iframe>
405 </section> 617 </section>
406 618
407 <section> 619 <section>
@@ -416,7 +628,8 @@
416 <section data-state="customevent"> 628 <section data-state="customevent">
417 <h2>State Events</h2> 629 <h2>State Events</h2>
418 <p> 630 <p>
419 Additionally custom events can be triggered on a per slide basis by binding to the <code>data-state</code> name. 631 Additionally custom events can be triggered on a per slide basis by binding to the
632 <code>data-state</code> name.
420 </p> 633 </p>
421 <pre><code class="javascript" data-trim contenteditable style="font-size: 18px;"> 634 <pre><code class="javascript" data-trim contenteditable style="font-size: 18px;">
422Reveal.on( 'customevent', function() { 635Reveal.on( 'customevent', function() {
@@ -428,7 +641,8 @@ Reveal.on( 'customevent', function() {
428 <section> 641 <section>
429 <h2>Take a Moment</h2> 642 <h2>Take a Moment</h2>
430 <p> 643 <p>
431 Press B or . on your keyboard to pause the presentation. This is helpful when you're on stage and want to take distracting slides off the screen. 644 Press B or . on your keyboard to pause the presentation. This is helpful when you're on
645 stage and want to take distracting slides off the screen.
432 </p> 646 </p>
433 </section> 647 </section>
434 648
@@ -438,33 +652,40 @@ Reveal.on( 'customevent', function() {
438 <li>Right-to-left support</li> 652 <li>Right-to-left support</li>
439 <li><a href="https://revealjs.com/api/">Extensive JavaScript API</a></li> 653 <li><a href="https://revealjs.com/api/">Extensive JavaScript API</a></li>
440 <li><a href="https://revealjs.com/auto-slide/">Auto-progression</a></li> 654 <li><a href="https://revealjs.com/auto-slide/">Auto-progression</a></li>
441 <li><a href="https://revealjs.com/backgrounds/#parallax-background">Parallax backgrounds</a></li> 655 <li>
656 <a href="https://revealjs.com/backgrounds/#parallax-background"
657 >Parallax backgrounds</a
658 >
659 </li>
442 <li><a href="https://revealjs.com/keyboard/">Custom keyboard bindings</a></li> 660 <li><a href="https://revealjs.com/keyboard/">Custom keyboard bindings</a></li>
443 </ul> 661 </ul>
444 </section> 662 </section>
445 663
446 <section style="text-align: left;"> 664 <section style="text-align: left">
447 <h1>THE END</h1> 665 <h1>THE END</h1>
448 <p> 666 <p>
449 - <a href="https://slides.com">Try the online editor</a> <br> 667 - <a href="https://slides.com">Try the online editor</a> <br />
450 - <a href="https://github.com/hakimel/reveal.js">Source code &amp; documentation</a> 668 - <a href="https://github.com/hakimel/reveal.js">Source code &amp; documentation</a>
451 </p> 669 </p>
452 </section> 670 </section>
453
454 </div> 671 </div>
455
456 </div> 672 </div>
457 673
458 <script src="dist/reveal.js"></script> 674 <script src="dist/reveal.js"></script>
459 <script src="plugin/zoom/zoom.js"></script> 675 <script src="dist/plugin/zoom.js"></script>
460 <script src="plugin/notes/notes.js"></script> 676 <script src="dist/plugin/notes.js"></script>
461 <script src="plugin/search/search.js"></script> 677 <script src="dist/plugin/search.js"></script>
462 <script src="plugin/markdown/markdown.js"></script> 678 <script src="dist/plugin/markdown.js"></script>
463 <script src="plugin/highlight/highlight.js"></script> 679 <script src="dist/plugin/highlight.js"></script>
464 <script> 680 <script>
681 // Also available as an ES module, see: https://revealjs.com/initialization/
682 // import Reveal from 'reveal.js';
683 // import RevealZoom from 'reveal.js/plugin/zoom';
684 // import RevealNotes from 'reveal.js/plugin/notes';
685 // import RevealSearch from 'reveal.js/plugin/search';
686 // import RevealMarkdown from 'reveal.js/plugin/markdown';
687 // import RevealHighlight from 'reveal.js/plugin/highlight';
465 688
466 // Also available as an ES module, see:
467 // https://revealjs.com/initialization/
468 Reveal.initialize({ 689 Reveal.initialize({
469 controls: true, 690 controls: true,
470 progress: true, 691 progress: true,
@@ -472,10 +693,8 @@ Reveal.on( 'customevent', function() {
472 hash: true, 693 hash: true,
473 694
474 // Learn about plugins: https://revealjs.com/plugins/ 695 // Learn about plugins: https://revealjs.com/plugins/
475 plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ] 696 plugins: [RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight],
476 }); 697 });
477
478 </script> 698 </script>
479
480 </body> 699 </body>
481</html> 700</html>
diff --git a/reveal.js/dist/theme/statnett_compact.css b/reveal.js/dist/theme/statnett_compact.css
new file mode 100644
index 0000000..b9f8dd8
--- /dev/null
+++ b/reveal.js/dist/theme/statnett_compact.css
@@ -0,0 +1,307 @@
1/**
2 * A simple theme for reveal.js presentations, similar
3 * to the default theme. The accent color is brown.
4 *
5 * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
6 */
7.reveal a {
8 line-height: 1.3em; }
9
10section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
11 color: #fff; }
12
13/*********************************************
14 * GLOBAL STYLES
15 *********************************************/
16:root {
17 --background-color: #F0F1EB;
18 --main-font: Palatino Linotype, Book Antiqua, Palatino, FreeSerif, serif;
19 --main-font-size: 40px;
20 --main-color: #000;
21 --block-margin: 20px;
22 --heading-margin: 0 0 20px 0;
23 --heading-font: Palatino Linotype, Book Antiqua, Palatino, FreeSerif, serif;
24 --heading-color: #383D3D;
25 --heading-line-height: 1.2;
26 --heading-letter-spacing: normal;
27 --heading-text-transform: none;
28 --heading-text-shadow: none;
29 --heading-font-weight: normal;
30 --heading1-text-shadow: none;
31 --heading1-size: 3.77em;
32 --heading2-size: 2.11em;
33 --heading3-size: 1.55em;
34 --heading4-size: 1em;
35 --code-font: monospace;
36 --link-color: #51483D;
37 --link-color-hover: #8b7c69;
38 --selection-background-color: #26351C;
39 --selection-color: #fff; }
40
41.reveal-viewport {
42 background: #F0F1EB;
43 background-image: url("statnett.svg");
44 background-repeat: no-repeat;
45 background-color: #F0F1EB; }
46
47.reveal {
48 font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
49 /* font-size: 24px; */
50 font-size: 20px;
51 font-weight: normal;
52 color: #000; }
53
54.reveal ::selection {
55 color: #fff;
56 background: #26351C;
57 text-shadow: none; }
58
59.reveal ::-moz-selection {
60 color: #fff;
61 background: #26351C;
62 text-shadow: none; }
63
64.reveal .slides section,
65.reveal .slides section > section {
66 line-height: 1.3;
67 font-weight: inherit; }
68
69/*********************************************
70 * HEADERS
71 *********************************************/
72.reveal h1,
73.reveal h2,
74.reveal h3,
75.reveal h4,
76.reveal h5,
77.reveal h6 {
78 /* margin: 0 0 20px 0; */
79 margin: 0 0 16px 0;
80 color: #383D3D;
81 font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
82 font-weight: normal;
83 line-height: 1.2;
84 letter-spacing: normal;
85 text-transform: none;
86 text-shadow: none;
87 word-wrap: break-word; }
88
89.reveal h1 {
90 font-size: 3.77em; }
91
92.reveal h2 {
93 font-size: 2.11em; }
94
95.reveal h3 {
96 font-size: 1.55em; }
97
98.reveal h4 {
99 font-size: 1em; }
100
101.reveal h1 {
102 text-shadow: none; }
103
104/*********************************************
105 * OTHER
106 *********************************************/
107.reveal p {
108 /* margin: 20px 0; */
109 margin: 16px 0;
110 line-height: 1.3; }
111
112/* Remove trailing margins after titles */
113.reveal h1:last-child,
114.reveal h2:last-child,
115.reveal h3:last-child,
116.reveal h4:last-child,
117.reveal h5:last-child,
118.reveal h6:last-child {
119 margin-bottom: 0; }
120
121/* Ensure certain elements are never larger than the slide itself */
122.reveal img,
123.reveal video,
124.reveal iframe {
125 max-width: 95%;
126 max-height: 95%; }
127
128.reveal strong,
129.reveal b {
130 font-weight: bold; }
131
132.reveal em {
133 font-style: italic; }
134
135.reveal ol,
136.reveal dl,
137.reveal ul {
138 display: inline-block;
139 text-align: left;
140 margin: 0 0 0 1em; }
141
142.reveal ol {
143 list-style-type: decimal; }
144
145.reveal ul {
146 list-style-type: disc; }
147
148.reveal ul ul {
149 list-style-type: square; }
150
151.reveal ul ul ul {
152 list-style-type: circle; }
153
154.reveal ul ul,
155.reveal ul ol,
156.reveal ol ol,
157.reveal ol ul {
158 display: block;
159 /* margin-left: 40px; } */
160 margin-left: 34px; }
161
162.reveal dt {
163 font-weight: bold; }
164
165.reveal dd {
166 margin-left: 40px; }
167
168.reveal blockquote {
169 display: block;
170 position: relative;
171 width: 70%;
172 margin: 20px auto;
173 padding: 5px;
174 font-style: italic;
175 background: rgba(255, 255, 255, 0.05);
176 box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
177
178.reveal blockquote p:first-child,
179.reveal blockquote p:last-child {
180 display: inline-block; }
181
182.reveal q {
183 font-style: italic; }
184
185.reveal pre {
186 display: block;
187 position: relative;
188 width: 90%;
189 margin: 20px auto;
190 text-align: left;
191 font-size: 0.55em;
192 font-family: monospace;
193 line-height: 1.1em;
194 word-wrap: break-word; }
195 /* box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); } */
196
197.reveal code {
198 font-family: monospace;
199 text-transform: none; }
200
201.reveal pre code {
202 display: block;
203 padding: 4px;
204 overflow: auto;
205 max-height: 520px;
206 word-wrap: normal; }
207
208.reveal table {
209 margin: auto;
210 border-collapse: collapse;
211 border-spacing: 0; }
212
213.reveal table th {
214 font-weight: bold; }
215
216.reveal table th,
217.reveal table td {
218 text-align: left;
219 padding: 0.2em 0.5em 0.2em 0.5em;
220 border-bottom: 1px solid; }
221
222.reveal table th[align="center"],
223.reveal table td[align="center"] {
224 text-align: center; }
225
226.reveal table th[align="right"],
227.reveal table td[align="right"] {
228 text-align: right; }
229
230.reveal table tbody tr:last-child th,
231.reveal table tbody tr:last-child td {
232 border-bottom: none; }
233
234.reveal sup {
235 vertical-align: super;
236 font-size: smaller; }
237
238.reveal sub {
239 vertical-align: sub;
240 font-size: smaller; }
241
242.reveal small {
243 display: inline-block;
244 font-size: 0.6em;
245 line-height: 1.2em;
246 vertical-align: top; }
247
248.reveal small * {
249 vertical-align: top; }
250
251.reveal img {
252 margin: 20px 0; }
253
254/*********************************************
255 * LINKS
256 *********************************************/
257.reveal a {
258 color: #51483D;
259 text-decoration: none;
260 transition: color .15s ease; }
261
262.reveal a:hover {
263 color: #8b7c69;
264 text-shadow: none;
265 border: none; }
266
267.reveal .roll span:after {
268 color: #fff;
269 background: #25211c; }
270
271/*********************************************
272 * Frame helper
273 *********************************************/
274.reveal .r-frame {
275 border: 4px solid #000;
276 box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
277
278.reveal a .r-frame {
279 transition: all .15s linear; }
280
281.reveal a:hover .r-frame {
282 border-color: #51483D;
283 box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
284
285/*********************************************
286 * NAVIGATION CONTROLS
287 *********************************************/
288.reveal .controls {
289 color: #51483D; }
290
291/*********************************************
292 * PROGRESS BAR
293 *********************************************/
294.reveal .progress {
295 background: rgba(0, 0, 0, 0.2);
296 color: #51483D; }
297
298#smallertext {
299 font-size: 0.48em;
300}
301
302/*********************************************
303 * PRINT BACKGROUND
304 *********************************************/
305@media print {
306 .backgrounds {
307 background-color: #F0F1EB; } }
diff --git a/reveal.js/free_software.html b/reveal.js/free_software.html
index 71bea85..7421378 100644
--- a/reveal.js/free_software.html
+++ b/reveal.js/free_software.html
@@ -1,25 +1,25 @@
1<!doctype html> 1<!DOCTYPE html>
2<html lang="en"> 2<html lang="en">
3 <head> 3 <head>
4 <meta charset="utf-8"> 4 <meta charset="utf-8" />
5 <title>Free software in a nutshell</title> 5 <title>Free software in a nutshell</title>
6 <meta name="author" content="Simeon Simeonov"> 6 <meta name="author" content="Simeon Simeonov"/>
7 <meta name="apple-mobile-web-app-capable" content="yes"> 7 <meta name="mobile-web-app-capable" content="yes"/>
8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 8 <meta name="mobile-web-app-status-bar-style" content="black-translucent"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
10 10
11 <link rel="stylesheet" href="dist/reset.css"> 11 <link rel="stylesheet" href="dist/reset.css"/>
12 <link rel="stylesheet" href="dist/reveal.css"> 12 <link rel="stylesheet" href="dist/reveal.css"/>
13 13
14 <link rel="stylesheet" href="dist/theme/statnett_compact.css" id="theme"> 14 <link rel="stylesheet" href="dist/theme/statnett_compact.css" id="theme">
15 15
16 <!-- Theme used for syntax highlighting of code --> 16 <!-- Theme used for syntax highlighting of code -->
17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"> 17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"/>
18 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"> --> 18 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"/> -->
19 </head> 19 </head>
20
20 <body> 21 <body>
21 <div class="reveal"> 22 <div class="reveal">
22
23 <!-- Any section element inside of this container is displayed as a slide --> 23 <!-- Any section element inside of this container is displayed as a slide -->
24 <div class="slides"> 24 <div class="slides">
25 25
@@ -192,28 +192,30 @@ copies or substantial portions of the Software."</p>
192 </div> 192 </div>
193 </div> 193 </div>
194 194
195 <script src="dist/reveal.js"></script> 195 <script src="dist/reveal.js"></script>
196 <script src="plugin/zoom/zoom.js"></script> 196 <script src="dist/plugin/zoom.js"></script>
197 <script src="plugin/notes/notes.js"></script> 197 <script src="dist/plugin/notes.js"></script>
198 <script src="plugin/search/search.js"></script> 198 <script src="dist/plugin/search.js"></script>
199 <script src="plugin/markdown/markdown.js"></script> 199 <script src="dist/plugin/markdown.js"></script>
200 <script src="plugin/highlight/highlight.js"></script> 200 <script src="dist/plugin/highlight.js"></script>
201 <script> 201 <script>
202 202 // Also available as an ES module, see: https://revealjs.com/initialization/
203 // Also available as an ES module, see: 203 // import Reveal from 'reveal.js';
204 // https://revealjs.netlify.app/initialization/ 204 // import RevealZoom from 'reveal.js/plugin/zoom';
205 Reveal.initialize({ 205 // import RevealNotes from 'reveal.js/plugin/notes';
206 controls: true, 206 // import RevealSearch from 'reveal.js/plugin/search';
207 progress: true, 207 // import RevealMarkdown from 'reveal.js/plugin/markdown';
208 center: true, 208 // import RevealHighlight from 'reveal.js/plugin/highlight';
209 hash: true,
210
211 // Learn about plugins: https://revealjs.netlify.app/plugins/
212 plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ]
213 });
214 Reveal.configure({ pdfSeparateFragments: false });
215 209
216 </script> 210 Reveal.initialize({
211 controls: true,
212 progress: true,
213 center: true,
214 hash: true,
217 215
216 // Learn about plugins: https://revealjs.com/plugins/
217 plugins: [RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight],
218 });
219 </script>
218 </body> 220 </body>
219</html> 221</html>
diff --git a/reveal.js/git.html b/reveal.js/git.html
index 6ee3406..69e658a 100755..100644
--- a/reveal.js/git.html
+++ b/reveal.js/git.html
@@ -1,25 +1,26 @@
1<!doctype html> 1<!DOCTYPE html>
2<html lang="en"> 2<html lang="en">
3 <head> 3 <head>
4 <meta charset="utf-8"> 4 <meta charset="utf-8" />
5 <title>Introduction to git</title> 5 <title>Introduction to git</title>
6 <meta name="author" content="Simeon Simeonov"> 6 <meta name="author" content="Simeon Simeonov"/>
7 <meta name="apple-mobile-web-app-capable" content="yes"> 7 <meta name="mobile-web-app-capable" content="yes"/>
8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 8 <meta name="mobile-web-app-status-bar-style" content="black-translucent"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
10 10
11 <link rel="stylesheet" href="dist/reset.css"> 11 <link rel="stylesheet" href="dist/reset.css"/>
12 <link rel="stylesheet" href="dist/reveal.css"> 12 <link rel="stylesheet" href="dist/reveal.css"/>
13 13
14 <link rel="stylesheet" href="dist/theme/statnett.css" id="theme"> 14 <!-- <link rel="stylesheet" href="dist/theme/black.css" id="theme"/> -->
15 <link rel="stylesheet" href="dist/theme/statnett.css" id="theme"/>
15 16
16 <!-- Theme used for syntax highlighting of code --> 17 <!-- Theme used for syntax highlighting of code -->
17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"> 18 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"/>
18 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"> --> 19 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"/> -->
19 </head> 20 </head>
21
20 <body> 22 <body>
21 <div class="reveal"> 23 <div class="reveal">
22
23 <!-- Any section element inside of this container is displayed as a slide --> 24 <!-- Any section element inside of this container is displayed as a slide -->
24 <div class="slides"> 25 <div class="slides">
25 26
@@ -486,28 +487,30 @@
486 </div> 487 </div>
487 </div> 488 </div>
488 489
489 <script src="dist/reveal.js"></script> 490 <script src="dist/reveal.js"></script>
490 <script src="plugin/zoom/zoom.js"></script> 491 <script src="dist/plugin/zoom.js"></script>
491 <script src="plugin/notes/notes.js"></script> 492 <script src="dist/plugin/notes.js"></script>
492 <script src="plugin/search/search.js"></script> 493 <script src="dist/plugin/search.js"></script>
493 <script src="plugin/markdown/markdown.js"></script> 494 <script src="dist/plugin/markdown.js"></script>
494 <script src="plugin/highlight/highlight.js"></script> 495 <script src="dist/plugin/highlight.js"></script>
495 <script> 496 <script>
496 497 // Also available as an ES module, see: https://revealjs.com/initialization/
497 // Also available as an ES module, see: 498 // import Reveal from 'reveal.js';
498 // https://revealjs.netlify.app/initialization/ 499 // import RevealZoom from 'reveal.js/plugin/zoom';
499 Reveal.initialize({ 500 // import RevealNotes from 'reveal.js/plugin/notes';
500 controls: true, 501 // import RevealSearch from 'reveal.js/plugin/search';
501 progress: true, 502 // import RevealMarkdown from 'reveal.js/plugin/markdown';
502 center: true, 503 // import RevealHighlight from 'reveal.js/plugin/highlight';
503 hash: true,
504
505 // Learn about plugins: https://revealjs.netlify.app/plugins/
506 plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ]
507 });
508 Reveal.configure({ pdfSeparateFragments: false });
509 504
510 </script> 505 Reveal.initialize({
506 controls: true,
507 progress: true,
508 center: true,
509 hash: true,
511 510
511 // Learn about plugins: https://revealjs.com/plugins/
512 plugins: [RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight],
513 });
514 </script>
512 </body> 515 </body>
513</html> 516</html>
diff --git a/reveal.js/images/cryptographic_primitives/GCM.svg b/reveal.js/images/cryptographic_primitives/GCM.svg
new file mode 100644
index 0000000..5d59d8c
--- /dev/null
+++ b/reveal.js/images/cryptographic_primitives/GCM.svg
@@ -0,0 +1,1500 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12 version="1.1"
13 width="695.61249"
14 height="765.31958"
15 id="svg2"
16 sodipodi:docname="GCM-Galois_Counter_Mode.svg"
17 inkscape:version="0.92.3 (2405546, 2018-03-11)">
18 <sodipodi:namedview
19 pagecolor="#ffffff"
20 bordercolor="#666666"
21 borderopacity="1"
22 objecttolerance="10"
23 gridtolerance="10"
24 guidetolerance="10"
25 inkscape:pageopacity="0"
26 inkscape:pageshadow="2"
27 inkscape:window-width="1236"
28 inkscape:window-height="945"
29 id="namedview292"
30 showgrid="false"
31 showguides="true"
32 inkscape:guide-bbox="true"
33 fit-margin-top="10"
34 fit-margin-left="10"
35 fit-margin-right="10"
36 fit-margin-bottom="10"
37 inkscape:zoom="0.65391053"
38 inkscape:cx="632.36731"
39 inkscape:cy="481.88405"
40 inkscape:window-x="680"
41 inkscape:window-y="79"
42 inkscape:window-maximized="0"
43 inkscape:current-layer="text4422" />
44 <defs
45 id="defs4" />
46 <metadata
47 id="metadata7">
48 <rdf:RDF>
49 <cc:Work
50 rdf:about="">
51 <dc:format>image/svg+xml</dc:format>
52 <dc:type
53 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
54 <dc:title></dc:title>
55 </cc:Work>
56 </rdf:RDF>
57 </metadata>
58 <text
59 xml:space="preserve"
60 style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
61 x="-25.40925"
62 y="92.446503"
63 id="text4406"><tspan
64 sodipodi:role="line"
65 id="tspan4404"
66 x="-25.40925"
67 y="127.83713"></tspan></text>
68 <text
69 xml:space="preserve"
70 style="font-style:normal;font-weight:normal;font-size:32px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
71 x="-29.734655"
72 y="63.790699"
73 id="text4410"><tspan
74 sodipodi:role="line"
75 id="tspan4408"
76 x="-29.734655"
77 y="92.103195"></tspan></text>
78 <path
79 inkscape:connector-curvature="0"
80 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
81 id="path2995"
82 d="m 14.2925,102.6046 h 129.325 V 74.25835 H 14.2925 Z" />
83 <path
84 inkscape:connector-curvature="0"
85 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
86 id="path2997"
87 d="m 14.2925,102.6046 h 129.325 V 74.25835 H 14.2925 Z" />
88 <g
89 id="text2999"
90 transform="matrix(1.25,0,0,1.25,40.5325,93.6796)">
91 <path
92 inkscape:connector-curvature="0"
93 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
94 id="path3591"
95 d="m 8.2302804,-3.5135915 1.3261415,0.3349533 C 9.2784242,-2.0894683 8.7782734,-1.2589217 8.055968,-0.68699599 7.3336464,-0.11506887 6.4506923,0.17089436 5.4071028,0.17089453 4.3270451,0.17089436 3.4486481,-0.04898972 2.7719092,-0.48875834 2.0951648,-0.928526 1.5802031,-1.5653923 1.2270227,-2.3993591 0.8738398,-3.2333212 0.69724897,-4.1288076 0.69724967,-5.0858211 c -7e-7,-1.0435898 0.19937605,-1.953887 0.59813083,-2.7308945 0.3987522,-0.7769919 0.9661215,-1.367147 1.7021095,-1.7704673 0.735982,-0.4033011 1.5460213,-0.6049561 2.4301201,-0.6049671 1.0025748,1.1e-5 1.8456537,0.2552129 2.529239,0.7656079 0.6835695,0.5104139 1.1597951,1.2281702 1.4286783,2.1532711 L 8.0798932,-6.9656609 C 7.8474688,-7.6948032 7.5102373,-8.225715 7.0681976,-8.5583979 6.6261438,-8.8910636 6.0701675,-9.0574008 5.400267,-9.0574099 c -0.7701693,9.1e-6 -1.4138713,0.184575 -1.9311081,0.5536983 -0.5172437,0.3691403 -0.8806791,0.8647339 -1.0903071,1.4867824 -0.2096328,0.6220624 -0.314448,1.2634859 -0.3144459,1.9242723 -2.1e-6,0.8521983 0.1241811,1.5961584 0.37255,2.2318825 0.2483641,0.6357299 0.6345853,1.1108162 1.1586649,1.4252604 0.5240725,0.314447 1.0914417,0.47166984 1.7021095,0.47166887 0.7428155,9.7e-7 1.3717067,-0.21418667 1.8866756,-0.64256337 0.5149544,-0.4283736 0.8635789,-1.0641006 1.0458745,-1.907183 z" />
96 <path
97 inkscape:connector-curvature="0"
98 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
99 id="path3593"
100 d="m 10.575073,-3.6297997 c 0,-1.3443653 0.373689,-2.3401098 1.121068,-2.9872363 0.624333,-0.537741 1.385382,-0.8066148 2.283151,-0.8066222 0.998019,7.4e-6 1.813755,0.3269853 2.44721,0.9809346 0.633442,0.6539621 0.950166,1.5574236 0.950173,2.7103872 -7e-6,0.9342262 -0.14014,1.6690719 -0.4204,2.2045393 -0.280274,0.53547055 -0.688142,0.95131348 -1.223605,1.24753008 -0.535475,0.29621716 -1.119933,0.4443256 -1.753378,0.44432576 -1.016256,-1.6e-7 -1.837688,-0.32583873 -2.464299,-0.97751668 -0.626614,-0.65167636 -0.93992,-1.59045596 -0.93992,-2.81634176 z m 1.26462,0 c -2e-6,0.9296689 0.202792,1.6257786 0.608384,2.0883311 0.405587,0.4625556 0.915992,0.6938326 1.531215,0.69383175 0.610659,8.5e-7 1.118785,-0.23241545 1.524379,-0.69724965 0.405584,-0.4648311 0.608379,-1.173473 0.608385,-2.1259279 -6e-6,-0.8977614 -0.20394,-1.5779209 -0.611803,-2.0404807 -0.407873,-0.4625483 -0.91486,-0.6938253 -1.520961,-0.6938317 -0.615223,6.4e-6 -1.125628,0.2301441 -1.531215,0.6904139 -0.405592,0.4602811 -0.608386,1.1552515 -0.608384,2.0849132 z" />
101 <path
102 inkscape:connector-curvature="0"
103 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
104 id="path3595"
105 d="m 23.576854,0 v -1.0663818 c -0.565096,0.82029393 -1.332981,1.23044038 -2.303658,1.23044054 -0.428378,-1.6e-7 -0.828271,-0.08202945 -1.199679,-0.24608811 -0.371413,-0.1640585 -0.647123,-0.37027102 -0.82713,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.23044 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241528,0.5776248 0.492176,0.7621896 0.250642,0.18456703 0.560531,0.27684998 0.929666,0.27684908 0.369128,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552554,-0.4466028 0.686996,-0.7724433 0.134432,-0.3258366 0.20165,-0.7986443 0.201656,-1.4184246 v -3.8895594 h 1.23044 V 0 Z" />
106 <path
107 inkscape:connector-curvature="0"
108 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
109 id="path3597"
110 d="m 26.60523,0 v -7.2595995 h 1.107397 v 1.032203 c 0.533188,-0.7975008 1.303352,-1.1962543 2.310494,-1.1962617 0.437485,7.4e-6 0.839656,0.078619 1.206515,0.2358344 0.366848,0.15723 0.641418,0.3634426 0.823712,0.6186382 0.182281,0.2552088 0.309882,0.5582615 0.382803,0.9091589 0.04556,0.2278648 0.06835,0.6266183 0.06836,1.1962617 V 0 h -1.23044 v -4.4159146 c -6e-6,-0.5012856 -0.04786,-0.8761139 -0.143552,-1.1244859 -0.09571,-0.248361 -0.265461,-0.4465984 -0.509265,-0.594713 -0.243815,-0.1481023 -0.529778,-0.2221565 -0.857891,-0.2221629 -0.52408,6.4e-6 -0.97638,0.1663436 -1.356903,0.4990121 -0.380527,0.3326802 -0.570789,0.96385 -0.570787,1.8935113 V 0 Z" />
111 <path
112 inkscape:connector-curvature="0"
113 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
114 id="path3599"
115 d="m 37.077772,-1.1005607 0.17773,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.519519,-0.55711615 -0.10026,-0.23013706 -0.150389,-0.71433777 -0.150388,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237277 v 0.9570094 h -1.237277 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
116 <path
117 inkscape:connector-curvature="0"
118 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
119 id="path3601"
120 d="m 43.250651,-2.3378371 1.271455,0.1572229 c -0.200523,0.742823 -0.571933,1.31930665 -1.114232,1.72945265 -0.542311,0.4101469 -1.235003,0.61522013 -2.078078,0.61522029 -1.061827,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933084,-1.57108797 -0.933084,-2.75140187 0,-1.2213214 0.314445,-2.1692154 0.943338,-2.8436849 0.62889,-0.6744567 1.444626,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763626,0.3304032 2.378851,0.9911882 0.615214,0.660798 0.922824,1.5904633 0.922831,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413938 c 0.04557,0.7975103 0.27115,1.4081728 0.676742,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517543,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318998,-0.2369723 0.571922,-0.6152184 0.758772,-1.1347396 z m -4.039947,-1.9892123 h 4.053619 c -0.05469,-0.6106582 -0.209637,-1.068655 -0.464834,-1.373992 -0.391923,-0.4739413 -0.900049,-0.7109148 -1.524379,-0.7109212 -0.565094,6.4e-6 -1.040181,0.1891295 -1.42526,0.5673698 -0.385085,0.378252 -0.598133,0.8840993 -0.639146,1.5175434 z" />
121 <path
122 inkscape:connector-curvature="0"
123 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
124 id="path3603"
125 d="m 46.053446,0 v -7.2595995 h 1.107397 v 1.1005608 c 0.282543,-0.5149555 0.543442,-0.8544656 0.782696,-1.0185314 0.23925,-0.1640514 0.502427,-0.2460807 0.789533,-0.2460881 0.4147,7.4e-6 0.83624,0.1321657 1.26462,0.3964753 l -0.423819,1.1415754 c -0.300778,-0.1777242 -0.601552,-0.2665893 -0.902323,-0.2665954 -0.268877,6.1e-6 -0.510408,0.080896 -0.724593,0.2426702 -0.21419,0.1617859 -0.366856,0.3862271 -0.457997,0.6733244 -0.136718,0.4374948 -0.205076,0.915999 -0.205073,1.435514 V 0 Z" />
126 </g>
127 <g
128 id="text3003"
129 transform="matrix(1.25,0,0,1.25,107.65,93.6796)">
130 <path
131 inkscape:connector-curvature="0"
132 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
133 id="path3606"
134 d="m 0.58104139,-4.9422697 c -5.8e-7,-1.1848626 0.12190406,-2.1384531 0.36571428,-2.8607744 C 1.190564,-8.5253497 1.55286,-9.0824653 2.0336449,-9.4743925 2.5144256,-9.8663008 3.1193916,-10.06226 3.8485447,-10.06227 c 0.5377437,10e-6 1.0094122,0.1082435 1.4150067,0.3246999 0.405584,0.2164759 0.7405369,0.528643 1.0048598,0.936502 0.2643103,0.4078767 0.4716622,0.9046096 0.6220561,1.4902003 0.1503801,0.5856053 0.2255736,1.3751372 0.2255808,2.3685981 -7.2e-6,1.1757581 -0.1207725,2.1247914 -0.3622964,2.8471028 C 6.5122142,-1.3728513 6.1510575,-0.81459643 5.6702804,-0.42040053 5.1894919,-0.0262038 4.5822473,0.17089436 3.8485447,0.17089453 2.8824181,0.17089436 2.1236472,-0.17545154 1.5722296,-0.86814419 0.91143656,-1.7021078 0.58104081,-3.0601483 0.58104139,-4.9422697 Z m 1.26461951,0 c -1.9e-6,1.6451479 0.1925391,2.7400111 0.5776235,3.2845928 0.3850795,0.544585 0.8601658,0.81687667 1.4252603,0.81687583 0.5650868,8.4e-7 1.0401732,-0.27343013 1.4252604,-0.82029373 0.3850766,-0.5468603 0.5776176,-1.6405841 0.5776235,-3.2811749 -5.9e-6,-1.6496952 -0.1925469,-2.7456977 -0.5776235,-3.2880107 -0.3850872,-0.5422965 -0.8647307,-0.8134489 -1.4389319,-0.8134579 -0.5650945,9e-6 -1.0162556,0.2392611 -1.3534847,0.717757 -0.4238205,0.6106708 -0.6357295,1.7385736 -0.6357276,3.3837116 z" />
135 </g>
136 <path
137 inkscape:connector-curvature="0"
138 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
139 id="path3007"
140 d="M 282.7,102.6046 H 412.025 V 74.25835 H 282.7 Z" />
141 <path
142 inkscape:connector-curvature="0"
143 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
144 id="path3009"
145 d="M 282.7,102.6046 H 412.025 V 74.25835 H 282.7 Z" />
146 <g
147 id="text3011"
148 transform="matrix(1.25,0,0,1.25,308.9375,93.6796)">
149 <path
150 inkscape:connector-curvature="0"
151 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
152 id="path3609"
153 d="m 8.2302804,-3.5135915 1.3261415,0.3349533 C 9.2784242,-2.0894683 8.7782734,-1.2589217 8.055968,-0.68699599 7.3336464,-0.11506887 6.4506923,0.17089436 5.4071028,0.17089453 4.3270451,0.17089436 3.4486481,-0.04898972 2.7719092,-0.48875834 2.0951648,-0.928526 1.5802031,-1.5653923 1.2270227,-2.3993591 0.8738398,-3.2333212 0.69724897,-4.1288076 0.69724967,-5.0858211 c -7e-7,-1.0435898 0.19937605,-1.953887 0.59813083,-2.7308945 0.3987522,-0.7769919 0.9661215,-1.367147 1.7021095,-1.7704673 0.735982,-0.4033011 1.5460213,-0.6049561 2.4301201,-0.6049671 1.0025748,1.1e-5 1.8456537,0.2552129 2.529239,0.7656079 0.6835695,0.5104139 1.1597951,1.2281702 1.4286783,2.1532711 L 8.0798932,-6.9656609 C 7.8474688,-7.6948032 7.5102373,-8.225715 7.0681976,-8.5583979 6.6261438,-8.8910636 6.0701675,-9.0574008 5.400267,-9.0574099 c -0.7701693,9.1e-6 -1.4138713,0.184575 -1.9311081,0.5536983 -0.5172437,0.3691403 -0.8806791,0.8647339 -1.0903071,1.4867824 -0.2096328,0.6220624 -0.314448,1.2634859 -0.3144459,1.9242723 -2.1e-6,0.8521983 0.1241811,1.5961584 0.37255,2.2318825 0.2483641,0.6357299 0.6345853,1.1108162 1.1586649,1.4252604 0.5240725,0.314447 1.0914417,0.47166984 1.7021095,0.47166887 0.7428155,9.7e-7 1.3717067,-0.21418667 1.8866756,-0.64256337 0.5149544,-0.4283736 0.8635789,-1.0641006 1.0458745,-1.907183 z" />
154 <path
155 inkscape:connector-curvature="0"
156 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
157 id="path3611"
158 d="m 10.575073,-3.6297997 c 0,-1.3443653 0.373689,-2.3401098 1.121068,-2.9872363 0.624333,-0.537741 1.385382,-0.8066148 2.283151,-0.8066222 0.998019,7.4e-6 1.813755,0.3269853 2.44721,0.9809346 0.633442,0.6539621 0.950166,1.5574236 0.950173,2.7103872 -7e-6,0.9342262 -0.14014,1.6690719 -0.4204,2.2045393 -0.280274,0.53547055 -0.688142,0.95131348 -1.223605,1.24753008 -0.535475,0.29621716 -1.119933,0.4443256 -1.753378,0.44432576 -1.016256,-1.6e-7 -1.837688,-0.32583873 -2.464299,-0.97751668 -0.626614,-0.65167636 -0.93992,-1.59045596 -0.93992,-2.81634176 z m 1.26462,0 c -2e-6,0.9296689 0.202792,1.6257786 0.608384,2.0883311 0.405587,0.4625556 0.915992,0.6938326 1.531215,0.69383175 0.610659,8.5e-7 1.118785,-0.23241545 1.524379,-0.69724965 0.405584,-0.4648311 0.608379,-1.173473 0.608385,-2.1259279 -6e-6,-0.8977614 -0.20394,-1.5779209 -0.611803,-2.0404807 -0.407873,-0.4625483 -0.91486,-0.6938253 -1.520961,-0.6938317 -0.615223,6.4e-6 -1.125628,0.2301441 -1.531215,0.6904139 -0.405592,0.4602811 -0.608386,1.1552515 -0.608384,2.0849132 z" />
159 <path
160 inkscape:connector-curvature="0"
161 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
162 id="path3613"
163 d="m 23.576854,0 v -1.0663818 c -0.565096,0.82029393 -1.332981,1.23044038 -2.303658,1.23044054 -0.428378,-1.6e-7 -0.828271,-0.08202945 -1.199679,-0.24608811 -0.371413,-0.1640585 -0.647123,-0.37027102 -0.82713,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.23044 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241528,0.5776248 0.492176,0.7621896 0.250642,0.18456703 0.560531,0.27684998 0.929666,0.27684908 0.369128,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552554,-0.4466028 0.686996,-0.7724433 0.134432,-0.3258366 0.20165,-0.7986443 0.201656,-1.4184246 v -3.8895594 h 1.23044 V 0 Z" />
164 <path
165 inkscape:connector-curvature="0"
166 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
167 id="path3615"
168 d="m 26.60523,0 v -7.2595995 h 1.107397 v 1.032203 c 0.533188,-0.7975008 1.303352,-1.1962543 2.310494,-1.1962617 0.437485,7.4e-6 0.839656,0.078619 1.206515,0.2358344 0.366848,0.15723 0.641418,0.3634426 0.823712,0.6186382 0.182281,0.2552088 0.309882,0.5582615 0.382803,0.9091589 0.04556,0.2278648 0.06835,0.6266183 0.06836,1.1962617 V 0 h -1.23044 v -4.4159146 c -6e-6,-0.5012856 -0.04786,-0.8761139 -0.143552,-1.1244859 -0.09571,-0.248361 -0.265461,-0.4465984 -0.509265,-0.594713 -0.243815,-0.1481023 -0.529778,-0.2221565 -0.857891,-0.2221629 -0.52408,6.4e-6 -0.97638,0.1663436 -1.356903,0.4990121 -0.380527,0.3326802 -0.570789,0.96385 -0.570787,1.8935113 V 0 Z" />
169 <path
170 inkscape:connector-curvature="0"
171 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
172 id="path3617"
173 d="m 37.077772,-1.1005607 0.17773,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.519519,-0.55711615 -0.10026,-0.23013706 -0.150389,-0.71433777 -0.150388,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237277 v 0.9570094 h -1.237277 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
174 <path
175 inkscape:connector-curvature="0"
176 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
177 id="path3619"
178 d="m 43.250651,-2.3378371 1.271455,0.1572229 c -0.200523,0.742823 -0.571933,1.31930665 -1.114232,1.72945265 -0.542311,0.4101469 -1.235003,0.61522013 -2.078078,0.61522029 -1.061827,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933084,-1.57108797 -0.933084,-2.75140187 0,-1.2213214 0.314445,-2.1692154 0.943338,-2.8436849 0.62889,-0.6744567 1.444626,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763626,0.3304032 2.378851,0.9911882 0.615214,0.660798 0.922824,1.5904633 0.922831,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413938 c 0.04557,0.7975103 0.27115,1.4081728 0.676742,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517543,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318998,-0.2369723 0.571922,-0.6152184 0.758772,-1.1347396 z m -4.039947,-1.9892123 h 4.053619 c -0.05469,-0.6106582 -0.209637,-1.068655 -0.464834,-1.373992 -0.391923,-0.4739413 -0.900049,-0.7109148 -1.524379,-0.7109212 -0.565094,6.4e-6 -1.040181,0.1891295 -1.42526,0.5673698 -0.385085,0.378252 -0.598133,0.8840993 -0.639146,1.5175434 z" />
179 <path
180 inkscape:connector-curvature="0"
181 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
182 id="path3621"
183 d="m 46.053446,0 v -7.2595995 h 1.107397 v 1.1005608 c 0.282543,-0.5149555 0.543442,-0.8544656 0.782696,-1.0185314 0.23925,-0.1640514 0.502427,-0.2460807 0.789533,-0.2460881 0.4147,7.4e-6 0.83624,0.1321657 1.26462,0.3964753 l -0.423819,1.1415754 c -0.300778,-0.1777242 -0.601552,-0.2665893 -0.902323,-0.2665954 -0.268877,6.1e-6 -0.510408,0.080896 -0.724593,0.2426702 -0.21419,0.1617859 -0.366856,0.3862271 -0.457997,0.6733244 -0.136718,0.4374948 -0.205076,0.915999 -0.205073,1.435514 V 0 Z" />
184 </g>
185 <g
186 id="text3015"
187 transform="matrix(1.25,0,0,1.25,376.0625,93.6796)">
188 <path
189 inkscape:connector-curvature="0"
190 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
191 id="path3624"
192 d="M 5.2157009,0 H 3.9852603 V -7.8406409 C 3.6890395,-7.5580877 3.3005396,-7.2755423 2.8197597,-6.993004 2.3389741,-6.7104517 1.907181,-6.4985427 1.5243792,-6.3572764 V -7.5467023 C 2.2125123,-7.8702547 2.8140604,-8.2621724 3.3290254,-8.7224566 3.8439837,-9.1827233 4.2085583,-9.6293273 4.4227503,-10.06227 h 0.7929506 z" />
193 </g>
194 <path
195 inkscape:connector-curvature="0"
196 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
197 id="path3019"
198 d="m 551.9875,102.6046 h 129.325 V 74.25835 h -129.325 z" />
199 <path
200 inkscape:connector-curvature="0"
201 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
202 id="path3021"
203 d="m 551.9875,102.6046 h 129.325 V 74.25835 h -129.325 z" />
204 <g
205 id="text3023"
206 transform="matrix(1.25,0,0,1.25,578.225,93.6796)">
207 <path
208 inkscape:connector-curvature="0"
209 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
210 id="path3627"
211 d="m 8.2302804,-3.5135915 1.3261415,0.3349533 C 9.2784242,-2.0894683 8.7782734,-1.2589217 8.055968,-0.68699599 7.3336464,-0.11506887 6.4506923,0.17089436 5.4071028,0.17089453 4.3270451,0.17089436 3.4486481,-0.04898972 2.7719092,-0.48875834 2.0951648,-0.928526 1.5802031,-1.5653923 1.2270227,-2.3993591 0.8738398,-3.2333212 0.69724897,-4.1288076 0.69724967,-5.0858211 c -7e-7,-1.0435898 0.19937605,-1.953887 0.59813083,-2.7308945 0.3987522,-0.7769919 0.9661215,-1.367147 1.7021095,-1.7704673 0.735982,-0.4033011 1.5460213,-0.6049561 2.4301201,-0.6049671 1.0025748,1.1e-5 1.8456537,0.2552129 2.529239,0.7656079 0.6835695,0.5104139 1.1597951,1.2281702 1.4286783,2.1532711 L 8.0798932,-6.9656609 C 7.8474688,-7.6948032 7.5102373,-8.225715 7.0681976,-8.5583979 6.6261438,-8.8910636 6.0701675,-9.0574008 5.400267,-9.0574099 c -0.7701693,9.1e-6 -1.4138713,0.184575 -1.9311081,0.5536983 -0.5172437,0.3691403 -0.8806791,0.8647339 -1.0903071,1.4867824 -0.2096328,0.6220624 -0.314448,1.2634859 -0.3144459,1.9242723 -2.1e-6,0.8521983 0.1241811,1.5961584 0.37255,2.2318825 0.2483641,0.6357299 0.6345853,1.1108162 1.1586649,1.4252604 0.5240725,0.314447 1.0914417,0.47166984 1.7021095,0.47166887 0.7428155,9.7e-7 1.3717067,-0.21418667 1.8866756,-0.64256337 0.5149544,-0.4283736 0.8635789,-1.0641006 1.0458745,-1.907183 z" />
212 <path
213 inkscape:connector-curvature="0"
214 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
215 id="path3629"
216 d="m 10.575073,-3.6297997 c 0,-1.3443653 0.373689,-2.3401098 1.121068,-2.9872363 0.624333,-0.537741 1.385382,-0.8066148 2.283151,-0.8066222 0.998019,7.4e-6 1.813755,0.3269853 2.44721,0.9809346 0.633442,0.6539621 0.950166,1.5574236 0.950173,2.7103872 -7e-6,0.9342262 -0.14014,1.6690719 -0.4204,2.2045393 -0.280274,0.53547055 -0.688142,0.95131348 -1.223605,1.24753008 -0.535475,0.29621716 -1.119933,0.4443256 -1.753378,0.44432576 -1.016256,-1.6e-7 -1.837688,-0.32583873 -2.464299,-0.97751668 -0.626614,-0.65167636 -0.93992,-1.59045596 -0.93992,-2.81634176 z m 1.26462,0 c -2e-6,0.9296689 0.202792,1.6257786 0.608384,2.0883311 0.405587,0.4625556 0.915992,0.6938326 1.531215,0.69383175 0.610659,8.5e-7 1.118785,-0.23241545 1.524379,-0.69724965 0.405584,-0.4648311 0.608379,-1.173473 0.608385,-2.1259279 -6e-6,-0.8977614 -0.20394,-1.5779209 -0.611803,-2.0404807 -0.407873,-0.4625483 -0.91486,-0.6938253 -1.520961,-0.6938317 -0.615223,6.4e-6 -1.125628,0.2301441 -1.531215,0.6904139 -0.405592,0.4602811 -0.608386,1.1552515 -0.608384,2.0849132 z" />
217 <path
218 inkscape:connector-curvature="0"
219 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
220 id="path3631"
221 d="m 23.576854,0 v -1.0663818 c -0.565096,0.82029393 -1.332981,1.23044038 -2.303658,1.23044054 -0.428378,-1.6e-7 -0.828271,-0.08202945 -1.199679,-0.24608811 -0.371413,-0.1640585 -0.647123,-0.37027102 -0.82713,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.23044 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241528,0.5776248 0.492176,0.7621896 0.250642,0.18456703 0.560531,0.27684998 0.929666,0.27684908 0.369128,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552554,-0.4466028 0.686996,-0.7724433 0.134432,-0.3258366 0.20165,-0.7986443 0.201656,-1.4184246 v -3.8895594 h 1.23044 V 0 Z" />
222 <path
223 inkscape:connector-curvature="0"
224 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
225 id="path3633"
226 d="m 26.60523,0 v -7.2595995 h 1.107397 v 1.032203 c 0.533188,-0.7975008 1.303352,-1.1962543 2.310494,-1.1962617 0.437485,7.4e-6 0.839656,0.078619 1.206515,0.2358344 0.366848,0.15723 0.641418,0.3634426 0.823712,0.6186382 0.182281,0.2552088 0.309882,0.5582615 0.382803,0.9091589 0.04556,0.2278648 0.06835,0.6266183 0.06836,1.1962617 V 0 h -1.23044 v -4.4159146 c -6e-6,-0.5012856 -0.04786,-0.8761139 -0.143552,-1.1244859 -0.09571,-0.248361 -0.265461,-0.4465984 -0.509265,-0.594713 -0.243815,-0.1481023 -0.529778,-0.2221565 -0.857891,-0.2221629 -0.52408,6.4e-6 -0.97638,0.1663436 -1.356903,0.4990121 -0.380527,0.3326802 -0.570789,0.96385 -0.570787,1.8935113 V 0 Z" />
227 <path
228 inkscape:connector-curvature="0"
229 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
230 id="path3635"
231 d="m 37.077772,-1.1005607 0.17773,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.519519,-0.55711615 -0.10026,-0.23013706 -0.150389,-0.71433777 -0.150388,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237277 v 0.9570094 h -1.237277 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
232 <path
233 inkscape:connector-curvature="0"
234 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
235 id="path3637"
236 d="m 43.250651,-2.3378371 1.271455,0.1572229 c -0.200523,0.742823 -0.571933,1.31930665 -1.114232,1.72945265 -0.542311,0.4101469 -1.235003,0.61522013 -2.078078,0.61522029 -1.061827,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933084,-1.57108797 -0.933084,-2.75140187 0,-1.2213214 0.314445,-2.1692154 0.943338,-2.8436849 0.62889,-0.6744567 1.444626,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763626,0.3304032 2.378851,0.9911882 0.615214,0.660798 0.922824,1.5904633 0.922831,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413938 c 0.04557,0.7975103 0.27115,1.4081728 0.676742,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517543,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318998,-0.2369723 0.571922,-0.6152184 0.758772,-1.1347396 z m -4.039947,-1.9892123 h 4.053619 c -0.05469,-0.6106582 -0.209637,-1.068655 -0.464834,-1.373992 -0.391923,-0.4739413 -0.900049,-0.7109148 -1.524379,-0.7109212 -0.565094,6.4e-6 -1.040181,0.1891295 -1.42526,0.5673698 -0.385085,0.378252 -0.598133,0.8840993 -0.639146,1.5175434 z" />
237 <path
238 inkscape:connector-curvature="0"
239 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
240 id="path3639"
241 d="m 46.053446,0 v -7.2595995 h 1.107397 v 1.1005608 c 0.282543,-0.5149555 0.543442,-0.8544656 0.782696,-1.0185314 0.23925,-0.1640514 0.502427,-0.2460807 0.789533,-0.2460881 0.4147,7.4e-6 0.83624,0.1321657 1.26462,0.3964753 l -0.423819,1.1415754 c -0.300778,-0.1777242 -0.601552,-0.2665893 -0.902323,-0.2665954 -0.268877,6.1e-6 -0.510408,0.080896 -0.724593,0.2426702 -0.21419,0.1617859 -0.366856,0.3862271 -0.457997,0.6733244 -0.136718,0.4374948 -0.205076,0.915999 -0.205073,1.435514 V 0 Z" />
242 </g>
243 <g
244 id="text3027"
245 transform="matrix(1.25,0,0,1.25,645.35,93.6796)">
246 <path
247 inkscape:connector-curvature="0"
248 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
249 id="path3642"
250 d="M 7.0476902,-1.1825901 V 0 H 0.42381842 C 0.41470363,-0.29621688 0.46255405,-0.58104081 0.56736983,-0.85447263 0.73598502,-1.3056329 1.0059981,-1.7499582 1.3774099,-2.1874499 1.7488189,-2.6249373 2.2854272,-3.1307846 2.9872363,-3.7049933 4.0764,-4.5981974 4.812385,-5.3057001 5.1951936,-5.8275033 5.5779917,-6.3492949 5.7693934,-6.84261 5.7693992,-7.3074499 5.7693934,-7.7950612 5.5950812,-8.2063469 5.2464619,-8.5413084 4.8978322,-8.8762528 4.4432532,-9.0437293 3.8827236,-9.0437383 c -0.5924376,9e-6 -1.0663846,0.1777392 -1.4218424,0.5331909 -0.3554627,0.3554688 -0.5354715,0.8476445 -0.5400267,1.4765287 L 0.65623498,-7.1638985 C 0.7428208,-8.1072282 1.0686594,-8.8261238 1.6337517,-9.3205874 2.1988407,-9.8150325 2.9576116,-10.06226 3.9100668,-10.06227 c 0.9615616,10e-6 1.7226111,0.2666056 2.2831508,0.7997867 0.5605273,0.5331996 0.8407941,1.1939912 0.8408011,1.9823765 -7e-6,0.4010394 -0.082036,0.7952357 -0.2460881,1.1825901 -0.1640654,0.3873666 -0.4363571,0.7952345 -0.8168759,1.2236048 -0.3805307,0.4283801 -1.0128398,1.0162567 -1.8969292,1.7636315 -0.7382677,0.61978 -1.2122147,1.0401801 -1.4218425,1.2612016 -0.209633,0.2210252 -0.382806,0.4431879 -0.5195193,0.6664887 z" />
251 </g>
252 <path
253 inkscape:connector-curvature="0"
254 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
255 id="path3031"
256 d="M 282.7,318.7421 H 412.025 V 290.39585 H 282.7 Z" />
257 <path
258 inkscape:connector-curvature="0"
259 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
260 id="path3033"
261 d="M 282.7,318.7421 H 412.025 V 290.39585 H 282.7 Z" />
262 <g
263 id="text3035"
264 transform="matrix(1.25,0,0,1.25,300.1875,309.8171)">
265 <path
266 inkscape:connector-curvature="0"
267 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
268 id="path3645"
269 d="m 8.2302804,-3.5135915 1.3261415,0.3349533 C 9.2784242,-2.0894683 8.7782734,-1.2589217 8.055968,-0.68699599 7.3336464,-0.11506887 6.4506923,0.17089436 5.4071028,0.17089453 4.3270451,0.17089436 3.4486481,-0.04898972 2.7719092,-0.48875834 2.0951648,-0.928526 1.5802031,-1.5653923 1.2270227,-2.3993591 0.8738398,-3.2333212 0.69724897,-4.1288076 0.69724967,-5.0858211 c -7e-7,-1.0435898 0.19937605,-1.953887 0.59813083,-2.7308945 0.3987522,-0.7769919 0.9661215,-1.367147 1.7021095,-1.7704673 0.735982,-0.4033011 1.5460213,-0.6049561 2.4301201,-0.6049671 1.0025748,1.1e-5 1.8456537,0.2552129 2.529239,0.7656079 0.6835695,0.5104139 1.1597951,1.2281702 1.4286783,2.1532711 L 8.0798932,-6.9656609 C 7.8474688,-7.6948032 7.5102373,-8.225715 7.0681976,-8.5583979 6.6261438,-8.8910636 6.0701675,-9.0574008 5.400267,-9.0574099 c -0.7701693,9.1e-6 -1.4138713,0.184575 -1.9311081,0.5536983 -0.5172437,0.3691403 -0.8806791,0.8647339 -1.0903071,1.4867824 -0.2096328,0.6220624 -0.314448,1.2634859 -0.3144459,1.9242723 -2.1e-6,0.8521983 0.1241811,1.5961584 0.37255,2.2318825 0.2483641,0.6357299 0.6345853,1.1108162 1.1586649,1.4252604 0.5240725,0.314447 1.0914417,0.47166984 1.7021095,0.47166887 0.7428155,9.7e-7 1.3717067,-0.21418667 1.8866756,-0.64256337 0.5149544,-0.4283736 0.8635789,-1.0641006 1.0458745,-1.907183 z" />
270 <path
271 inkscape:connector-curvature="0"
272 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
273 id="path3647"
274 d="m 11.039906,-8.6062483 v -1.4150067 h 1.230441 v 1.4150067 z m 0,8.6062483 v -7.2595995 h 1.230441 V 0 Z" />
275 <path
276 inkscape:connector-curvature="0"
277 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
278 id="path3649"
279 d="M 14.143327,2.7821629 V -7.2595995 h 1.121068 v 0.9433378 c 0.264314,-0.3691255 0.56281,-0.6459743 0.895487,-0.8305474 0.332671,-0.1845587 0.735982,-0.2768417 1.209933,-0.2768491 0.619773,7.4e-6 1.166635,0.1595088 1.640588,0.4785047 0.473941,0.3190097 0.83168,0.7690315 1.073217,1.3500667 0.241524,0.5810464 0.36229,1.2179127 0.362297,1.9106008 -7e-6,0.7428245 -0.133305,1.4115911 -0.399893,2.0063018 -0.266602,0.594714 -0.653963,1.05043227 -1.162083,1.36715616 C 18.375809,0.00569648 17.84148,0.16405858 17.28095,0.16405874 16.8708,0.16405858 16.502807,0.07747211 16.176971,-0.09570093 15.85113,-0.26887379 15.583395,-0.48761856 15.373767,-0.75193591 V 2.7821629 Z m 1.114232,-6.3709479 c -2e-6,0.934226 0.189121,1.6246392 0.56737,2.0712416 0.378243,0.4466054 0.83624,0.6699074 1.373992,0.66990655 0.546858,8.5e-7 1.015108,-0.23127615 1.404753,-0.69383175 0.389633,-0.4625525 0.584453,-1.1791695 0.584459,-2.1498532 -6e-6,-0.9251044 -0.190268,-1.6177962 -0.570788,-2.0780774 -0.38053,-0.4602697 -0.835109,-0.6904074 -1.363738,-0.6904139 -0.52408,6.5e-6 -0.987773,0.2449551 -1.391081,0.7348465 -0.403314,0.4899029 -0.604969,1.2019627 -0.604967,2.1361816 z" />
280 <path
281 inkscape:connector-curvature="0"
282 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
283 id="path3651"
284 d="m 21.929407,0 v -10.021255 h 1.230441 v 3.5956208 c 0.574202,-0.6653422 1.298795,-0.9980166 2.173778,-0.998024 0.537743,7.4e-6 1.004854,0.1059619 1.401335,0.3178638 0.396469,0.2119161 0.680154,0.5047151 0.851055,0.8783979 0.170888,0.3736952 0.256335,0.9159999 0.256342,1.6269159 V 0 h -1.230441 v -4.6004806 c -6e-6,-0.6152151 -0.133303,-1.0629583 -0.399893,-1.343231 -0.266601,-0.2802608 -0.643707,-0.4203942 -1.131322,-0.4204005 -0.364579,6.3e-6 -0.707507,0.094568 -1.028785,0.2836849 -0.321284,0.1891291 -0.550283,0.4454707 -0.686996,0.7690253 -0.136718,0.3235653 -0.205076,0.7701692 -0.205073,1.3398131 V 0 Z" />
285 <path
286 inkscape:connector-curvature="0"
287 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
288 id="path3653"
289 d="m 34.685099,-2.3378371 1.271455,0.1572229 c -0.200523,0.742823 -0.571933,1.31930665 -1.114232,1.72945265 -0.542311,0.4101469 -1.235002,0.61522013 -2.078077,0.61522029 -1.061828,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933085,-1.57108797 -0.933084,-2.75140187 -1e-6,-1.2213214 0.314445,-2.1692154 0.943337,-2.8436849 0.62889,-0.6744567 1.444626,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763626,0.3304032 2.378852,0.9911882 0.615213,0.660798 0.922823,1.5904633 0.92283,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413938 c 0.04557,0.7975103 0.27115,1.4081728 0.676742,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517544,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318997,-0.2369723 0.571921,-0.6152184 0.758771,-1.1347396 z m -4.039946,-1.9892123 h 4.053618 c -0.05469,-0.6106582 -0.209637,-1.068655 -0.464833,-1.373992 -0.391924,-0.4739413 -0.900049,-0.7109148 -1.52438,-0.7109212 -0.565094,6.4e-6 -1.04018,0.1891295 -1.42526,0.5673698 -0.385084,0.378252 -0.598133,0.8840993 -0.639145,1.5175434 z" />
290 <path
291 inkscape:connector-curvature="0"
292 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
293 id="path3655"
294 d="m 37.487894,0 v -7.2595995 h 1.107397 v 1.1005608 c 0.282543,-0.5149555 0.543442,-0.8544656 0.782697,-1.0185314 0.239249,-0.1640514 0.502426,-0.2460807 0.789532,-0.2460881 0.4147,7.4e-6 0.83624,0.1321657 1.26462,0.3964753 l -0.423819,1.1415754 c -0.300778,-0.1777242 -0.601552,-0.2665893 -0.902323,-0.2665954 -0.268877,6.1e-6 -0.510408,0.080896 -0.724592,0.2426702 -0.214191,0.1617859 -0.366856,0.3862271 -0.457998,0.6733244 -0.136718,0.4374948 -0.205075,0.915999 -0.205073,1.435514 V 0 Z" />
295 <path
296 inkscape:connector-curvature="0"
297 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
298 id="path3657"
299 d="m 44.850099,-1.1005607 0.17773,1.08688914 c -0.346349,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.246089,-0.14127255 -0.419262,-0.32697775 -0.519519,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -3e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.4204,0.088865 0.136713,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
300 <path
301 inkscape:connector-curvature="0"
302 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
303 id="path3659"
304 d="m 51.022978,-2.3378371 1.271456,0.1572229 c -0.200524,0.742823 -0.571934,1.31930665 -1.114233,1.72945265 -0.54231,0.4101469 -1.235002,0.61522013 -2.078077,0.61522029 -1.061828,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933085,-1.57108797 -0.933084,-2.75140187 -1e-6,-1.2213214 0.314445,-2.1692154 0.943337,-2.8436849 0.62889,-0.6744567 1.444626,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763626,0.3304032 2.378852,0.9911882 0.615213,0.660798 0.922823,1.5904633 0.92283,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413939 c 0.04557,0.7975103 0.271151,1.4081728 0.676742,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517544,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318997,-0.2369723 0.571921,-0.6152184 0.758771,-1.1347396 z m -4.039946,-1.9892123 h 4.053618 c -0.05469,-0.6106582 -0.209636,-1.068655 -0.464833,-1.373992 -0.391923,-0.4739413 -0.900049,-0.7109148 -1.524379,-0.7109212 -0.565095,6.4e-6 -1.040181,0.1891295 -1.425261,0.5673698 -0.385084,0.378252 -0.598132,0.8840993 -0.639145,1.5175434 z" />
305 <path
306 inkscape:connector-curvature="0"
307 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
308 id="path3661"
309 d="m 53.019151,0 2.652283,-3.7733511 -2.454045,-3.4862484 h 1.538051 l 1.114232,1.7021095 c 0.209627,0.3235656 0.378243,0.5947179 0.505848,0.813458 0.200512,-0.3007694 0.385078,-0.5673646 0.553698,-0.7997864 l 1.223605,-1.7157811 h 1.469693 L 57.113784,-3.8417089 59.813918,0 H 58.30321 L 56.81301,-2.2558077 56.416534,-2.8641923 54.509352,0 Z" />
310 <path
311 inkscape:connector-curvature="0"
312 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
313 id="path3663"
314 d="m 63.525819,-1.1005607 0.17773,1.08688914 c -0.346349,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792952,-0.07063642 -1.039038,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.51952,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -3e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.4204,0.088865 0.136713,1.1e-6 0.316722,-0.015949 0.540027,-0.04785 z" />
315 </g>
316 <g
317 id="text3039"
318 transform="matrix(1.25,0,0,1.25,384.8125,309.8171)">
319 <path
320 inkscape:connector-curvature="0"
321 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
322 id="path3666"
323 d="M 5.2157009,0 H 3.9852603 V -7.8406409 C 3.6890395,-7.5580877 3.3005396,-7.2755423 2.8197597,-6.993004 2.3389741,-6.7104517 1.907181,-6.4985427 1.5243792,-6.3572764 V -7.5467023 C 2.2125123,-7.8702547 2.8140604,-8.2621724 3.3290254,-8.7224566 3.8439837,-9.1827233 4.2085583,-9.6293273 4.4227503,-10.06227 h 0.7929506 z" />
324 </g>
325 <path
326 inkscape:connector-curvature="0"
327 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
328 id="path3043"
329 d="M 435.95,254.9671 H 565.275 V 226.62085 H 435.95 Z" />
330 <path
331 inkscape:connector-curvature="0"
332 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
333 id="path3045"
334 d="M 435.95,254.9671 H 565.275 V 226.62085 H 435.95 Z" />
335 <g
336 id="text3047"
337 transform="matrix(1.25,0,0,1.25,459.75,246.0421)">
338 <path
339 inkscape:connector-curvature="0"
340 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
341 id="path3669"
342 d="m 1.0800534,0 v -10.021255 h 3.7801869 c 0.6653438,10e-6 1.1734697,0.03191 1.5243792,0.095701 0.4921693,0.082039 0.9045944,0.2381228 1.2372764,0.468251 0.3326667,0.2301472 0.6004012,0.5525679 0.8032042,0.9672631 0.2027862,0.4147121 0.3041836,0.8704304 0.3041923,1.3671562 -8.7e-6,0.8522003 -0.2711611,1.5733744 -0.813458,2.1635247 -0.5423126,0.5901601 -1.5221069,0.8852377 -2.9393858,0.8852336 H 2.4061949 V 1e-7 Z m 1.3261415,-5.2567156 h 2.590761 c 0.8567454,5.2e-6 1.4651293,-0.1594962 1.8251536,-0.4785047 C 7.1821201,-6.0542174 7.3621288,-6.5030999 7.3621362,-7.0818692 7.3621288,-7.5011229 7.2561743,-7.860001 7.0442724,-8.1585047 6.8323563,-8.456992 6.5532289,-8.6540901 6.2068892,-8.7497997 5.983581,-8.8090344 5.571156,-8.838656 4.9696128,-8.8386649 H 2.4061949 Z" />
343 <path
344 inkscape:connector-curvature="0"
345 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
346 id="path3671"
347 d="m 10.233167,0 v -10.021255 h 1.230441 V 0 Z" />
348 <path
349 inkscape:connector-curvature="0"
350 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
351 id="path3673"
352 d="m 18.107963,-0.89548732 c -0.455724,0.38736144 -0.894353,0.66079241 -1.315888,0.82029373 -0.421544,0.15950147 -0.873844,0.23925217 -1.356903,0.23925233 -0.79751,-1.6e-7 -1.410451,-0.19481972 -1.838825,-0.58445927 -0.428376,-0.38963871 -0.642564,-0.88751097 -0.642563,-1.49361817 -1e-6,-0.3554583 0.08089,-0.6801576 0.24267,-0.9740988 0.161779,-0.2939354 0.373688,-0.5297696 0.635728,-0.7075033 0.262036,-0.1777266 0.557114,-0.3121635 0.885233,-0.4033111 0.241529,-0.063797 0.606103,-0.1253185 1.093725,-0.1845661 0.993463,-0.1184826 1.724891,-0.2597552 2.194286,-0.4238184 0.0046,-0.1686112 0.0068,-0.275705 0.0068,-0.3212817 -6e-6,-0.5012852 -0.116214,-0.8544669 -0.348625,-1.0595461 -0.314451,-0.2779822 -0.781562,-0.4169762 -1.401335,-0.4169826 -0.578766,6.4e-6 -1.006002,0.1014037 -1.281709,0.3041922 -0.275712,0.2028008 -0.479646,0.5616789 -0.611802,1.0766355 l -1.203098,-0.1640587 c 0.109372,-0.5149565 0.28938,-0.9307994 0.540027,-1.24753 0.250644,-0.3167178 0.61294,-0.5605271 1.086889,-0.7314286 0.473945,-0.1708872 1.023085,-0.2563344 1.647423,-0.2563418 0.619773,7.4e-6 1.123342,0.072922 1.510708,0.218745 0.387355,0.145837 0.672179,0.3292636 0.854472,0.5502804 0.182281,0.22103 0.309882,0.5001574 0.382804,0.8373831 0.04101,0.2096363 0.06151,0.5878824 0.06152,1.1347397 v 1.6405874 c -7e-6,1.143856 0.0262,1.8673087 0.07861,2.17036052 C 19.38055,-0.56850855 19.484226,-0.27798815 19.639178,0 H 18.354051 C 18.226444,-0.25520224 18.144415,-0.55369771 18.107963,-0.89548732 Z M 18.005426,-3.6434713 c -0.446609,0.182291 -1.116515,0.3372352 -2.00972,0.4648331 -0.50585,0.072918 -0.863589,0.1549474 -1.073217,0.2460881 -0.209633,0.091147 -0.371413,0.2244442 -0.485341,0.3998932 -0.113931,0.1754541 -0.170896,0.3702737 -0.170894,0.5844593 -2e-6,0.3281191 0.124181,0.6015501 0.37255,0.8202937 0.248364,0.21874593 0.611799,0.32811832 1.090307,0.32811752 0.473944,8e-7 0.895483,-0.10367511 1.264619,-0.31102802 0.369128,-0.2073507 0.64028,-0.4910354 0.813458,-0.8510548 0.132153,-0.2779861 0.198232,-0.6881326 0.198238,-1.2304405 z" />
353 <path
354 inkscape:connector-curvature="0"
355 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
356 id="path3675"
357 d="m 21.163683,-8.6062483 v -1.4150067 h 1.23044 v 1.4150067 z m 0,8.6062483 v -7.2595995 h 1.23044 V 0 Z" />
358 <path
359 inkscape:connector-curvature="0"
360 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
361 id="path3677"
362 d="M 24.267103,0 V -7.2595995 H 25.3745 v 1.032203 c 0.533188,-0.7975008 1.303352,-1.1962543 2.310494,-1.1962617 0.437485,7.4e-6 0.839656,0.078619 1.206515,0.2358344 0.366848,0.15723 0.641418,0.3634426 0.823712,0.6186382 0.18228,0.2552088 0.309882,0.5582615 0.382803,0.9091589 0.04556,0.2278648 0.06835,0.6266183 0.06836,1.1962617 V 0 h -1.23044 v -4.4159146 c -6e-6,-0.5012856 -0.04786,-0.8761139 -0.143552,-1.1244859 -0.09571,-0.248361 -0.265461,-0.4465984 -0.509266,-0.594713 -0.243814,-0.1481023 -0.529777,-0.2221565 -0.85789,-0.2221629 -0.52408,6.4e-6 -0.976381,0.1663436 -1.356903,0.4990121 -0.380527,0.3326802 -0.57079,0.96385 -0.570787,1.8935113 V 0 Z" />
363 <path
364 inkscape:connector-curvature="0"
365 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
366 id="path3679"
367 d="m 34.739644,-1.1005607 0.177731,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929667,0.10937249 -0.446606,-9e-8 -0.792952,-0.07063642 -1.039038,-0.21190921 C 32.70258,-0.25748083 32.529407,-0.44318603 32.42915,-0.67332443 32.328891,-0.90346149 32.278762,-1.3876622 32.278763,-2.1259279 V -6.3025901 H 31.37644 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540026,-0.04785 z" />
368 <path
369 inkscape:connector-curvature="0"
370 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
371 id="path3681"
372 d="m 40.912524,-2.3378371 1.271455,0.1572229 c -0.200523,0.742823 -0.571934,1.31930665 -1.114232,1.72945265 -0.542311,0.4101469 -1.235003,0.61522013 -2.078078,0.61522029 -1.061827,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933084,-1.57108797 -0.933084,-2.75140187 0,-1.2213214 0.314445,-2.1692154 0.943338,-2.8436849 0.62889,-0.6744567 1.444625,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763625,0.3304032 2.378851,0.9911882 0.615214,0.660798 0.922824,1.5904633 0.922831,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413939 c 0.04557,0.7975103 0.271151,1.4081728 0.676743,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517543,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318998,-0.2369723 0.571921,-0.6152184 0.758772,-1.1347396 z m -4.039947,-1.9892123 h 4.053618 c -0.05469,-0.6106582 -0.209636,-1.068655 -0.464833,-1.373992 -0.391923,-0.4739413 -0.900049,-0.7109148 -1.524379,-0.7109212 -0.565094,6.4e-6 -1.040181,0.1891295 -1.42526,0.5673698 -0.385085,0.378252 -0.598133,0.8840993 -0.639146,1.5175434 z" />
373 <path
374 inkscape:connector-curvature="0"
375 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
376 id="path3683"
377 d="m 42.908697,0 2.652283,-3.7733511 -2.454046,-3.4862484 h 1.538051 l 1.114232,1.7021095 c 0.209628,0.3235656 0.378244,0.5947179 0.505848,0.813458 0.200513,-0.3007694 0.385079,-0.5673646 0.553698,-0.7997864 l 1.223605,-1.7157811 h 1.469693 L 47.00333,-3.8417089 49.703463,0 H 48.192755 L 46.702555,-2.2558077 46.30608,-2.8641923 44.398897,0 Z" />
378 <path
379 inkscape:connector-curvature="0"
380 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
381 id="path3685"
382 d="m 53.415365,-1.1005607 0.17773,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 C 51.3783,-0.25748083 51.205127,-0.44318603 51.104871,-0.67332443 51.004611,-0.90346149 50.954482,-1.3876622 50.954483,-2.1259279 V -6.3025901 H 50.05216 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237277 v 0.9570094 h -1.237277 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.238111,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
383 </g>
384 <g
385 id="text3051"
386 transform="matrix(1.25,0,0,1.25,531.7375,246.0421)">
387 <path
388 inkscape:connector-curvature="0"
389 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
390 id="path3688"
391 d="M 7.0476902,-1.1825901 V 0 H 0.42381842 C 0.41470363,-0.29621688 0.46255405,-0.58104081 0.56736983,-0.85447263 0.73598502,-1.3056329 1.0059981,-1.7499582 1.3774099,-2.1874499 1.7488189,-2.6249373 2.2854272,-3.1307846 2.9872363,-3.7049933 4.0764,-4.5981974 4.812385,-5.3057001 5.1951936,-5.8275033 5.5779917,-6.3492949 5.7693934,-6.84261 5.7693992,-7.3074499 5.7693934,-7.7950612 5.5950812,-8.2063469 5.2464619,-8.5413084 4.8978322,-8.8762528 4.4432532,-9.0437293 3.8827236,-9.0437383 c -0.5924376,9e-6 -1.0663846,0.1777392 -1.4218424,0.5331909 -0.3554627,0.3554688 -0.5354715,0.8476445 -0.5400267,1.4765287 L 0.65623498,-7.1638985 C 0.7428208,-8.1072282 1.0686594,-8.8261238 1.6337517,-9.3205874 2.1988407,-9.8150325 2.9576116,-10.06226 3.9100668,-10.06227 c 0.9615616,10e-6 1.7226111,0.2666056 2.2831508,0.7997867 0.5605273,0.5331996 0.8407941,1.1939912 0.8408011,1.9823765 -7e-6,0.4010394 -0.082036,0.7952357 -0.2460881,1.1825901 -0.1640654,0.3873666 -0.4363571,0.7952345 -0.8168759,1.2236048 -0.3805307,0.4283801 -1.0128398,1.0162567 -1.8969292,1.7636315 -0.7382677,0.61978 -1.2122147,1.0401801 -1.4218425,1.2612016 -0.209633,0.2210252 -0.382806,0.4431879 -0.5195193,0.6664887 z" />
392 </g>
393 <path
394 inkscape:connector-curvature="0"
395 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
396 id="path3055"
397 d="m 551.9875,318.7421 h 129.325 v -28.34625 h -129.325 z" />
398 <path
399 inkscape:connector-curvature="0"
400 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
401 id="path3057"
402 d="m 551.9875,318.7421 h 129.325 v -28.34625 h -129.325 z" />
403 <g
404 id="text3059"
405 transform="matrix(1.25,0,0,1.25,569.475,309.8171)">
406 <path
407 inkscape:connector-curvature="0"
408 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
409 id="path3691"
410 d="m 8.2302804,-3.5135915 1.3261415,0.3349533 C 9.2784242,-2.0894683 8.7782734,-1.2589217 8.055968,-0.68699599 7.3336464,-0.11506887 6.4506923,0.17089436 5.4071028,0.17089453 4.3270451,0.17089436 3.4486481,-0.04898972 2.7719092,-0.48875834 2.0951648,-0.928526 1.5802031,-1.5653923 1.2270227,-2.3993591 0.8738398,-3.2333212 0.69724897,-4.1288076 0.69724967,-5.0858211 c -7e-7,-1.0435898 0.19937605,-1.953887 0.59813083,-2.7308945 0.3987522,-0.7769919 0.9661215,-1.367147 1.7021095,-1.7704673 0.735982,-0.4033011 1.5460213,-0.6049561 2.4301201,-0.6049671 1.0025748,1.1e-5 1.8456537,0.2552129 2.529239,0.7656079 0.6835695,0.5104139 1.1597951,1.2281702 1.4286783,2.1532711 L 8.0798932,-6.9656609 C 7.8474688,-7.6948032 7.5102373,-8.225715 7.0681976,-8.5583979 6.6261438,-8.8910636 6.0701675,-9.0574008 5.400267,-9.0574099 c -0.7701693,9.1e-6 -1.4138713,0.184575 -1.9311081,0.5536983 -0.5172437,0.3691403 -0.8806791,0.8647339 -1.0903071,1.4867824 -0.2096328,0.6220624 -0.314448,1.2634859 -0.3144459,1.9242723 -2.1e-6,0.8521983 0.1241811,1.5961584 0.37255,2.2318825 0.2483641,0.6357299 0.6345853,1.1108162 1.1586649,1.4252604 0.5240725,0.314447 1.0914417,0.47166984 1.7021095,0.47166887 0.7428155,9.7e-7 1.3717067,-0.21418667 1.8866756,-0.64256337 0.5149544,-0.4283736 0.8635789,-1.0641006 1.0458745,-1.907183 z" />
411 <path
412 inkscape:connector-curvature="0"
413 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
414 id="path3693"
415 d="m 11.039906,-8.6062483 v -1.4150067 h 1.230441 v 1.4150067 z m 0,8.6062483 v -7.2595995 h 1.230441 V 0 Z" />
416 <path
417 inkscape:connector-curvature="0"
418 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
419 id="path3695"
420 d="M 14.143327,2.7821629 V -7.2595995 h 1.121068 v 0.9433378 c 0.264314,-0.3691255 0.56281,-0.6459743 0.895487,-0.8305474 0.332671,-0.1845587 0.735982,-0.2768417 1.209933,-0.2768491 0.619773,7.4e-6 1.166635,0.1595088 1.640588,0.4785047 0.473941,0.3190097 0.83168,0.7690315 1.073217,1.3500667 0.241524,0.5810464 0.36229,1.2179127 0.362297,1.9106008 -7e-6,0.7428245 -0.133305,1.4115911 -0.399893,2.0063018 -0.266602,0.594714 -0.653963,1.05043227 -1.162083,1.36715616 C 18.375809,0.00569648 17.84148,0.16405858 17.28095,0.16405874 16.8708,0.16405858 16.502807,0.07747211 16.176971,-0.09570093 15.85113,-0.26887379 15.583395,-0.48761856 15.373767,-0.75193591 V 2.7821629 Z m 1.114232,-6.3709479 c -2e-6,0.934226 0.189121,1.6246392 0.56737,2.0712416 0.378243,0.4466054 0.83624,0.6699074 1.373992,0.66990655 0.546858,8.5e-7 1.015108,-0.23127615 1.404753,-0.69383175 0.389633,-0.4625525 0.584453,-1.1791695 0.584459,-2.1498532 -6e-6,-0.9251044 -0.190268,-1.6177962 -0.570788,-2.0780774 -0.38053,-0.4602697 -0.835109,-0.6904074 -1.363738,-0.6904139 -0.52408,6.5e-6 -0.987773,0.2449551 -1.391081,0.7348465 -0.403314,0.4899029 -0.604969,1.2019627 -0.604967,2.1361816 z" />
421 <path
422 inkscape:connector-curvature="0"
423 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
424 id="path3697"
425 d="m 21.929407,0 v -10.021255 h 1.230441 v 3.5956208 c 0.574202,-0.6653422 1.298795,-0.9980166 2.173778,-0.998024 0.537743,7.4e-6 1.004854,0.1059619 1.401335,0.3178638 0.396469,0.2119161 0.680154,0.5047151 0.851055,0.8783979 0.170888,0.3736952 0.256335,0.9159999 0.256342,1.6269159 V 0 h -1.230441 v -4.6004806 c -6e-6,-0.6152151 -0.133303,-1.0629583 -0.399893,-1.343231 -0.266601,-0.2802608 -0.643707,-0.4203942 -1.131322,-0.4204005 -0.364579,6.3e-6 -0.707507,0.094568 -1.028785,0.2836849 -0.321284,0.1891291 -0.550283,0.4454707 -0.686996,0.7690253 -0.136718,0.3235653 -0.205076,0.7701692 -0.205073,1.3398131 V 0 Z" />
426 <path
427 inkscape:connector-curvature="0"
428 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
429 id="path3699"
430 d="m 34.685099,-2.3378371 1.271455,0.1572229 c -0.200523,0.742823 -0.571933,1.31930665 -1.114232,1.72945265 -0.542311,0.4101469 -1.235002,0.61522013 -2.078077,0.61522029 -1.061828,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933085,-1.57108797 -0.933084,-2.75140187 -1e-6,-1.2213214 0.314445,-2.1692154 0.943337,-2.8436849 0.62889,-0.6744567 1.444626,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763626,0.3304032 2.378852,0.9911882 0.615213,0.660798 0.922823,1.5904633 0.92283,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413938 c 0.04557,0.7975103 0.27115,1.4081728 0.676742,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517544,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318997,-0.2369723 0.571921,-0.6152184 0.758771,-1.1347396 z m -4.039946,-1.9892123 h 4.053618 c -0.05469,-0.6106582 -0.209637,-1.068655 -0.464833,-1.373992 -0.391924,-0.4739413 -0.900049,-0.7109148 -1.52438,-0.7109212 -0.565094,6.4e-6 -1.04018,0.1891295 -1.42526,0.5673698 -0.385084,0.378252 -0.598133,0.8840993 -0.639145,1.5175434 z" />
431 <path
432 inkscape:connector-curvature="0"
433 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
434 id="path3701"
435 d="m 37.487894,0 v -7.2595995 h 1.107397 v 1.1005608 c 0.282543,-0.5149555 0.543442,-0.8544656 0.782697,-1.0185314 0.239249,-0.1640514 0.502426,-0.2460807 0.789532,-0.2460881 0.4147,7.4e-6 0.83624,0.1321657 1.26462,0.3964753 l -0.423819,1.1415754 c -0.300778,-0.1777242 -0.601552,-0.2665893 -0.902323,-0.2665954 -0.268877,6.1e-6 -0.510408,0.080896 -0.724592,0.2426702 -0.214191,0.1617859 -0.366856,0.3862271 -0.457998,0.6733244 -0.136718,0.4374948 -0.205075,0.915999 -0.205073,1.435514 V 0 Z" />
436 <path
437 inkscape:connector-curvature="0"
438 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
439 id="path3703"
440 d="m 44.850099,-1.1005607 0.17773,1.08688914 c -0.346349,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.246089,-0.14127255 -0.419262,-0.32697775 -0.519519,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -3e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.4204,0.088865 0.136713,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
441 <path
442 inkscape:connector-curvature="0"
443 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
444 id="path3705"
445 d="m 51.022978,-2.3378371 1.271456,0.1572229 c -0.200524,0.742823 -0.571934,1.31930665 -1.114233,1.72945265 -0.54231,0.4101469 -1.235002,0.61522013 -2.078077,0.61522029 -1.061828,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933085,-1.57108797 -0.933084,-2.75140187 -1e-6,-1.2213214 0.314445,-2.1692154 0.943337,-2.8436849 0.62889,-0.6744567 1.444626,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763626,0.3304032 2.378852,0.9911882 0.615213,0.660798 0.922823,1.5904633 0.92283,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413939 c 0.04557,0.7975103 0.271151,1.4081728 0.676742,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517544,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318997,-0.2369723 0.571921,-0.6152184 0.758771,-1.1347396 z m -4.039946,-1.9892123 h 4.053618 c -0.05469,-0.6106582 -0.209636,-1.068655 -0.464833,-1.373992 -0.391923,-0.4739413 -0.900049,-0.7109148 -1.524379,-0.7109212 -0.565095,6.4e-6 -1.040181,0.1891295 -1.425261,0.5673698 -0.385084,0.378252 -0.598132,0.8840993 -0.639145,1.5175434 z" />
446 <path
447 inkscape:connector-curvature="0"
448 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
449 id="path3707"
450 d="m 53.019151,0 2.652283,-3.7733511 -2.454045,-3.4862484 h 1.538051 l 1.114232,1.7021095 c 0.209627,0.3235656 0.378243,0.5947179 0.505848,0.813458 0.200512,-0.3007694 0.385078,-0.5673646 0.553698,-0.7997864 l 1.223605,-1.7157811 h 1.469693 L 57.113784,-3.8417089 59.813918,0 H 58.30321 L 56.81301,-2.2558077 56.416534,-2.8641923 54.509352,0 Z" />
451 <path
452 inkscape:connector-curvature="0"
453 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
454 id="path3709"
455 d="m 63.525819,-1.1005607 0.17773,1.08688914 c -0.346349,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792952,-0.07063642 -1.039038,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.51952,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -3e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.4204,0.088865 0.136713,1.1e-6 0.316722,-0.015949 0.540027,-0.04785 z" />
456 </g>
457 <g
458 id="text3063"
459 transform="matrix(1.25,0,0,1.25,654.1,309.8171)">
460 <path
461 inkscape:connector-curvature="0"
462 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
463 id="path3712"
464 d="M 7.0476902,-1.1825901 V 0 H 0.42381842 C 0.41470363,-0.29621688 0.46255405,-0.58104081 0.56736983,-0.85447263 0.73598502,-1.3056329 1.0059981,-1.7499582 1.3774099,-2.1874499 1.7488189,-2.6249373 2.2854272,-3.1307846 2.9872363,-3.7049933 4.0764,-4.5981974 4.812385,-5.3057001 5.1951936,-5.8275033 5.5779917,-6.3492949 5.7693934,-6.84261 5.7693992,-7.3074499 5.7693934,-7.7950612 5.5950812,-8.2063469 5.2464619,-8.5413084 4.8978322,-8.8762528 4.4432532,-9.0437293 3.8827236,-9.0437383 c -0.5924376,9e-6 -1.0663846,0.1777392 -1.4218424,0.5331909 -0.3554627,0.3554688 -0.5354715,0.8476445 -0.5400267,1.4765287 L 0.65623498,-7.1638985 C 0.7428208,-8.1072282 1.0686594,-8.8261238 1.6337517,-9.3205874 2.1988407,-9.8150325 2.9576116,-10.06226 3.9100668,-10.06227 c 0.9615616,10e-6 1.7226111,0.2666056 2.2831508,0.7997867 0.5605273,0.5331996 0.8407941,1.1939912 0.8408011,1.9823765 -7e-6,0.4010394 -0.082036,0.7952357 -0.2460881,1.1825901 -0.1640654,0.3873666 -0.4363571,0.7952345 -0.8168759,1.2236048 -0.3805307,0.4283801 -1.0128398,1.0162567 -1.8969292,1.7636315 -0.7382677,0.61978 -1.2122147,1.0401801 -1.4218425,1.2612016 -0.209633,0.2210252 -0.382806,0.4431879 -0.5195193,0.6664887 z" />
465 </g>
466 <path
467 inkscape:connector-curvature="0"
468 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
469 id="path3067"
470 d="m 164.8875,254.9671 h 129.325 v -28.34625 h -129.325 z" />
471 <path
472 inkscape:connector-curvature="0"
473 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
474 id="path3069"
475 d="m 164.8875,254.9671 h 129.325 v -28.34625 h -129.325 z" />
476 <g
477 id="text3071"
478 transform="matrix(1.25,0,0,1.25,188.6875,246.0421)">
479 <path
480 inkscape:connector-curvature="0"
481 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
482 id="path3715"
483 d="m 1.0800534,0 v -10.021255 h 3.7801869 c 0.6653438,10e-6 1.1734697,0.03191 1.5243792,0.095701 0.4921693,0.082039 0.9045944,0.2381228 1.2372764,0.468251 0.3326667,0.2301472 0.6004012,0.5525679 0.8032042,0.9672631 0.2027862,0.4147121 0.3041836,0.8704304 0.3041923,1.3671562 -8.7e-6,0.8522003 -0.2711611,1.5733744 -0.813458,2.1635247 -0.5423126,0.5901601 -1.5221069,0.8852377 -2.9393858,0.8852336 H 2.4061949 V 1e-7 Z m 1.3261415,-5.2567156 h 2.590761 c 0.8567454,5.2e-6 1.4651293,-0.1594962 1.8251536,-0.4785047 C 7.1821201,-6.0542174 7.3621288,-6.5030999 7.3621362,-7.0818692 7.3621288,-7.5011229 7.2561743,-7.860001 7.0442724,-8.1585047 6.8323563,-8.456992 6.5532289,-8.6540901 6.2068892,-8.7497997 5.983581,-8.8090344 5.571156,-8.838656 4.9696128,-8.8386649 H 2.4061949 Z" />
484 <path
485 inkscape:connector-curvature="0"
486 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
487 id="path3717"
488 d="m 10.233167,0 v -10.021255 h 1.230441 V 0 Z" />
489 <path
490 inkscape:connector-curvature="0"
491 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
492 id="path3719"
493 d="m 18.107963,-0.89548732 c -0.455724,0.38736144 -0.894353,0.66079241 -1.315888,0.82029373 -0.421544,0.15950147 -0.873844,0.23925217 -1.356903,0.23925233 -0.79751,-1.6e-7 -1.410451,-0.19481972 -1.838825,-0.58445927 -0.428376,-0.38963871 -0.642564,-0.88751097 -0.642563,-1.49361817 -1e-6,-0.3554583 0.08089,-0.6801576 0.24267,-0.9740988 0.161779,-0.2939354 0.373688,-0.5297696 0.635728,-0.7075033 0.262036,-0.1777266 0.557114,-0.3121635 0.885233,-0.4033111 0.241529,-0.063797 0.606103,-0.1253185 1.093725,-0.1845661 0.993463,-0.1184826 1.724891,-0.2597552 2.194286,-0.4238184 0.0046,-0.1686112 0.0068,-0.275705 0.0068,-0.3212817 -6e-6,-0.5012852 -0.116214,-0.8544669 -0.348625,-1.0595461 -0.314451,-0.2779822 -0.781562,-0.4169762 -1.401335,-0.4169826 -0.578766,6.4e-6 -1.006002,0.1014037 -1.281709,0.3041922 -0.275712,0.2028008 -0.479646,0.5616789 -0.611802,1.0766355 l -1.203098,-0.1640587 c 0.109372,-0.5149565 0.28938,-0.9307994 0.540027,-1.24753 0.250644,-0.3167178 0.61294,-0.5605271 1.086889,-0.7314286 0.473945,-0.1708872 1.023085,-0.2563344 1.647423,-0.2563418 0.619773,7.4e-6 1.123342,0.072922 1.510708,0.218745 0.387355,0.145837 0.672179,0.3292636 0.854472,0.5502804 0.182281,0.22103 0.309882,0.5001574 0.382804,0.8373831 0.04101,0.2096363 0.06151,0.5878824 0.06152,1.1347397 v 1.6405874 c -7e-6,1.143856 0.0262,1.8673087 0.07861,2.17036052 C 19.38055,-0.56850855 19.484226,-0.27798815 19.639178,0 H 18.354051 C 18.226444,-0.25520224 18.144415,-0.55369771 18.107963,-0.89548732 Z M 18.005426,-3.6434713 c -0.446609,0.182291 -1.116515,0.3372352 -2.00972,0.4648331 -0.50585,0.072918 -0.863589,0.1549474 -1.073217,0.2460881 -0.209633,0.091147 -0.371413,0.2244442 -0.485341,0.3998932 -0.113931,0.1754541 -0.170896,0.3702737 -0.170894,0.5844593 -2e-6,0.3281191 0.124181,0.6015501 0.37255,0.8202937 0.248364,0.21874593 0.611799,0.32811832 1.090307,0.32811752 0.473944,8e-7 0.895483,-0.10367511 1.264619,-0.31102802 0.369128,-0.2073507 0.64028,-0.4910354 0.813458,-0.8510548 0.132153,-0.2779861 0.198232,-0.6881326 0.198238,-1.2304405 z" />
494 <path
495 inkscape:connector-curvature="0"
496 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
497 id="path3721"
498 d="m 21.163683,-8.6062483 v -1.4150067 h 1.23044 v 1.4150067 z m 0,8.6062483 v -7.2595995 h 1.23044 V 0 Z" />
499 <path
500 inkscape:connector-curvature="0"
501 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
502 id="path3723"
503 d="M 24.267103,0 V -7.2595995 H 25.3745 v 1.032203 c 0.533188,-0.7975008 1.303352,-1.1962543 2.310494,-1.1962617 0.437485,7.4e-6 0.839656,0.078619 1.206515,0.2358344 0.366848,0.15723 0.641418,0.3634426 0.823712,0.6186382 0.18228,0.2552088 0.309882,0.5582615 0.382803,0.9091589 0.04556,0.2278648 0.06835,0.6266183 0.06836,1.1962617 V 0 h -1.23044 v -4.4159146 c -6e-6,-0.5012856 -0.04786,-0.8761139 -0.143552,-1.1244859 -0.09571,-0.248361 -0.265461,-0.4465984 -0.509266,-0.594713 -0.243814,-0.1481023 -0.529777,-0.2221565 -0.85789,-0.2221629 -0.52408,6.4e-6 -0.976381,0.1663436 -1.356903,0.4990121 -0.380527,0.3326802 -0.57079,0.96385 -0.570787,1.8935113 V 0 Z" />
504 <path
505 inkscape:connector-curvature="0"
506 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
507 id="path3725"
508 d="m 34.739644,-1.1005607 0.177731,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929667,0.10937249 -0.446606,-9e-8 -0.792952,-0.07063642 -1.039038,-0.21190921 C 32.70258,-0.25748083 32.529407,-0.44318603 32.42915,-0.67332443 32.328891,-0.90346149 32.278762,-1.3876622 32.278763,-2.1259279 V -6.3025901 H 31.37644 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540026,-0.04785 z" />
509 <path
510 inkscape:connector-curvature="0"
511 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
512 id="path3727"
513 d="m 40.912524,-2.3378371 1.271455,0.1572229 c -0.200523,0.742823 -0.571934,1.31930665 -1.114232,1.72945265 -0.542311,0.4101469 -1.235003,0.61522013 -2.078078,0.61522029 -1.061827,-1.6e-7 -1.903767,-0.32697803 -2.525821,-0.98093457 -0.622057,-0.65395487 -0.933084,-1.57108797 -0.933084,-2.75140187 0,-1.2213214 0.314445,-2.1692154 0.943338,-2.8436849 0.62889,-0.6744567 1.444625,-1.0116882 2.44721,-1.0116956 0.970676,7.4e-6 1.763625,0.3304032 2.378851,0.9911882 0.615214,0.660798 0.922824,1.5904633 0.922831,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 h -5.413939 c 0.04557,0.7975103 0.271151,1.4081728 0.676743,1.8319893 0.405587,0.4238195 0.911434,0.6357285 1.517543,0.63572765 0.451157,8.5e-7 0.836239,-0.1184859 1.155247,-0.35546065 0.318998,-0.2369723 0.571921,-0.6152184 0.758772,-1.1347396 z m -4.039947,-1.9892123 h 4.053618 c -0.05469,-0.6106582 -0.209636,-1.068655 -0.464833,-1.373992 -0.391923,-0.4739413 -0.900049,-0.7109148 -1.524379,-0.7109212 -0.565094,6.4e-6 -1.040181,0.1891295 -1.42526,0.5673698 -0.385085,0.378252 -0.598133,0.8840993 -0.639146,1.5175434 z" />
514 <path
515 inkscape:connector-curvature="0"
516 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
517 id="path3729"
518 d="m 42.908697,0 2.652283,-3.7733511 -2.454046,-3.4862484 h 1.538051 l 1.114232,1.7021095 c 0.209628,0.3235656 0.378244,0.5947179 0.505848,0.813458 0.200513,-0.3007694 0.385079,-0.5673646 0.553698,-0.7997864 l 1.223605,-1.7157811 h 1.469693 L 47.00333,-3.8417089 49.703463,0 H 48.192755 L 46.702555,-2.2558077 46.30608,-2.8641923 44.398897,0 Z" />
519 <path
520 inkscape:connector-curvature="0"
521 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
522 id="path3731"
523 d="m 53.415365,-1.1005607 0.17773,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 C 51.3783,-0.25748083 51.205127,-0.44318603 51.104871,-0.67332443 51.004611,-0.90346149 50.954482,-1.3876622 50.954483,-2.1259279 V -6.3025901 H 50.05216 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237277 v 0.9570094 h -1.237277 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.238111,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
524 </g>
525 <g
526 id="text3075"
527 transform="matrix(1.25,0,0,1.25,260.675,246.0421)">
528 <path
529 inkscape:connector-curvature="0"
530 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
531 id="path3734"
532 d="M 5.2157009,0 H 3.9852603 V -7.8406409 C 3.6890395,-7.5580877 3.3005396,-7.2755423 2.8197597,-6.993004 2.3389741,-6.7104517 1.907181,-6.4985427 1.5243792,-6.3572764 V -7.5467023 C 2.2125123,-7.8702547 2.8140604,-8.2621724 3.3290254,-8.7224566 3.8439837,-9.1827233 4.2085583,-9.6293273 4.4227503,-10.06227 h 0.7929506 z" />
533 </g>
534 <path
535 inkscape:connector-curvature="0"
536 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
537 id="path3079"
538 d="m 552.1625,754.5696 h 129.325 v -28.34625 h -129.325 z" />
539 <path
540 inkscape:connector-curvature="0"
541 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
542 id="path3081"
543 d="m 552.1625,754.5696 h 129.325 v -28.34625 h -129.325 z" />
544 <g
545 id="text3083"
546 transform="matrix(1.25,0,0,1.25,581.325,745.6471)">
547 <path
548 inkscape:connector-curvature="0"
549 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
550 id="path3737"
551 d="M -0.02050734,0 3.8280374,-10.021255 H 5.2567156 L 9.3581842,0 H 7.8474766 L 6.6785581,-3.0350868 H 2.4882243 L 1.3876636,0 Z M 2.871028,-4.1151402 H 6.2684112 L 5.2225367,-6.8904673 C 4.9035287,-7.7335392 4.6665552,-8.426231 4.5116155,-8.9685447 4.3840099,-8.325973 4.2040011,-7.6879674 3.9715888,-7.054526 Z" />
552 <path
553 inkscape:connector-curvature="0"
554 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
555 id="path3739"
556 d="m 15.018214,0 v -1.0663818 c -0.565096,0.82029393 -1.332982,1.23044038 -2.303658,1.23044054 -0.428379,-1.6e-7 -0.828272,-0.08202945 -1.19968,-0.24608811 -0.371412,-0.1640585 -0.647122,-0.37027102 -0.827129,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.230441 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241529,0.5776248 0.492177,0.7621896 0.250642,0.18456703 0.56053,0.27684998 0.929666,0.27684908 0.369128,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552553,-0.4466028 0.686996,-0.7724433 0.134431,-0.3258366 0.20165,-0.7986443 0.201655,-1.4184246 v -3.8895594 h 1.230441 V 0 Z" />
557 <path
558 inkscape:connector-curvature="0"
559 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
560 id="path3741"
561 d="m 20.733053,-1.1005607 0.17773,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.519519,-0.55711615 -0.10026,-0.23013706 -0.150389,-0.71433777 -0.150388,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237277 v 0.9570094 h -1.237277 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.238111,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
562 <path
563 inkscape:connector-curvature="0"
564 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
565 id="path3743"
566 d="m 21.936319,0 v -10.021255 h 1.230441 v 3.5956208 c 0.574203,-0.6653422 1.298795,-0.9980166 2.173778,-0.998024 0.537743,7.4e-6 1.004855,0.1059619 1.401335,0.3178638 0.396469,0.2119161 0.680154,0.5047151 0.851055,0.8783979 0.170888,0.3736952 0.256335,0.9159999 0.256342,1.6269159 V 0 h -1.230441 v -4.6004806 c -5e-6,-0.6152151 -0.133303,-1.0629583 -0.399893,-1.343231 -0.2666,-0.2802608 -0.643707,-0.4203942 -1.131322,-0.4204005 -0.364578,6.3e-6 -0.707506,0.094568 -1.028785,0.2836849 -0.321284,0.1891291 -0.550283,0.4454707 -0.686996,0.7690253 -0.136718,0.3235653 -0.205075,0.7701692 -0.205073,1.3398131 V 0 Z" />
567 <path
568 inkscape:connector-curvature="0"
569 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
570 id="path3745"
571 d="m 36.319096,0 v -8.8386649 h -3.301682 v -1.1825901 h 7.943178 v 1.1825901 H 37.645238 V 0 Z" />
572 <path
573 inkscape:connector-curvature="0"
574 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
575 id="path3747"
576 d="m 46.900761,-0.89548732 c -0.455724,0.38736144 -0.894353,0.66079241 -1.315888,0.82029373 -0.421544,0.15950147 -0.873844,0.23925217 -1.356903,0.23925233 -0.79751,-1.6e-7 -1.410451,-0.19481972 -1.838825,-0.58445927 -0.428376,-0.38963871 -0.642564,-0.88751097 -0.642563,-1.49361817 -10e-7,-0.3554583 0.08089,-0.6801576 0.24267,-0.9740988 0.161779,-0.2939354 0.373688,-0.5297696 0.635728,-0.7075033 0.262036,-0.1777266 0.557114,-0.3121635 0.885233,-0.4033111 0.241529,-0.063797 0.606103,-0.1253185 1.093725,-0.1845661 0.993463,-0.1184826 1.724891,-0.2597552 2.194286,-0.4238184 0.0046,-0.1686112 0.0068,-0.275705 0.0068,-0.3212817 -6e-6,-0.5012852 -0.116214,-0.8544669 -0.348625,-1.0595461 -0.314451,-0.2779822 -0.781562,-0.4169762 -1.401335,-0.4169826 -0.578766,6.4e-6 -1.006002,0.1014037 -1.281709,0.3041922 -0.275712,0.2028008 -0.479646,0.5616789 -0.611802,1.0766355 l -1.203098,-0.1640587 c 0.109372,-0.5149565 0.28938,-0.9307994 0.540027,-1.24753 0.250644,-0.3167178 0.61294,-0.5605271 1.086889,-0.7314286 0.473945,-0.1708872 1.023085,-0.2563344 1.647423,-0.2563418 0.619773,7.4e-6 1.123342,0.072922 1.510708,0.218745 0.387355,0.145837 0.672179,0.3292636 0.854472,0.5502804 0.182281,0.22103 0.309883,0.5001574 0.382804,0.8373831 0.04101,0.2096363 0.06151,0.5878824 0.06152,1.1347397 v 1.6405874 c -7e-6,1.143856 0.0262,1.8673087 0.07861,2.17036052 C 48.173348,-0.56850855 48.277024,-0.27798815 48.431976,0 H 47.146849 C 47.019242,-0.25520224 46.937213,-0.55369771 46.900761,-0.89548732 Z M 46.798224,-3.6434713 c -0.446609,0.182291 -1.116515,0.3372352 -2.00972,0.4648331 -0.50585,0.072918 -0.863589,0.1549474 -1.073217,0.2460881 -0.209633,0.091147 -0.371413,0.2244442 -0.485341,0.3998932 -0.113931,0.1754541 -0.170896,0.3702737 -0.170894,0.5844593 -2e-6,0.3281191 0.124181,0.6015501 0.37255,0.8202937 0.248364,0.21874593 0.6118,0.32811832 1.090307,0.32811752 0.473944,8e-7 0.895483,-0.10367511 1.264619,-0.31102802 0.369128,-0.2073507 0.64028,-0.4910354 0.813458,-0.8510548 0.132153,-0.2779861 0.198233,-0.6881326 0.198238,-1.2304405 z" />
577 <path
578 inkscape:connector-curvature="0"
579 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
580 id="path3749"
581 d="m 49.724067,0.60154873 1.196262,0.17773031 c 0.05013,0.36913106 0.189121,0.63800486 0.416982,0.80662216 0.305329,0.2278576 0.722311,0.3417871 1.250948,0.3417891 0.569645,-2e-6 1.009413,-0.1139315 1.319306,-0.3417891 0.309884,-0.2278607 0.519514,-0.5468635 0.628892,-0.95700934 0.06379,-0.25064569 0.09342,-0.7770003 0.08886,-1.57906542 C 54.087569,-0.3167242 53.417663,0 52.615602,0 c -0.998026,0 -1.770469,-0.36001744 -2.317329,-1.0800534 -0.546864,-0.7200338 -0.820295,-1.5836199 -0.820294,-2.590761 -10e-7,-0.6926881 0.125322,-1.331833 0.375968,-1.9174366 0.250644,-0.5855924 0.614079,-1.0378928 1.090307,-1.3569025 0.476224,-0.3189959 1.035618,-0.4784973 1.678184,-0.4785047 0.856747,7.4e-6 1.56311,0.3463533 2.119092,1.0390387 v -0.87498 h 1.13474 v 6.27524703 c -7e-6,1.13018232 -0.115076,1.9311072 -0.345207,2.40277707 -0.230144,0.471667 -0.594719,0.8442167 -1.093725,1.1176502 C 53.938321,2.8095032 53.324241,2.9462187 52.595095,2.9462216 51.729227,2.9462187 51.029699,2.7513991 50.49651,2.3617623 49.963318,1.9721209 49.705838,1.3853836 49.724067,0.60154873 Z m 1.018531,-4.36122833 c -10e-7,0.952455 0.189122,1.6474254 0.56737,2.0849132 0.378244,0.4374913 0.852191,0.656236 1.421843,0.656235 0.565087,1e-6 1.039034,-0.2176044 1.421842,-0.6528171 0.382798,-0.4352092 0.5742,-1.1176474 0.574206,-2.0473164 -6e-6,-0.8886469 -0.197104,-1.5585528 -0.591295,-2.0097196 -0.394202,-0.4511554 -0.869288,-0.6767359 -1.425261,-0.6767423 -0.546865,6.4e-6 -1.011698,0.222169 -1.394499,0.6664886 -0.382806,0.4443311 -0.574207,1.1039833 -0.574206,1.9789586 z" />
582 </g>
583 <path
584 inkscape:connector-curvature="0"
585 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
586 id="path3087"
587 d="M 435.95,538.4296 H 565.275 V 510.08335 H 435.95 Z" />
588 <path
589 inkscape:connector-curvature="0"
590 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
591 id="path3089"
592 d="M 435.95,538.4296 H 565.275 V 510.08335 H 435.95 Z" />
593 <g
594 id="text3091"
595 transform="matrix(1.25,0,0,1.25,444.0375,529.5046)">
596 <path
597 inkscape:connector-curvature="0"
598 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
599 id="path3752"
600 d="M 0.89548732,0 V -10.021255 H 2.1259279 V 0 Z" />
601 <path
602 inkscape:connector-curvature="0"
603 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
604 id="path3754"
605 d="m 9.0026992,-2.3378371 1.2714548,0.1572229 C 10.073631,-1.4377912 9.7022209,-0.86130755 9.1599222,-0.45116155 8.6176114,-0.04101465 7.9249196,0.16405858 7.0818447,0.16405874 6.0200172,0.16405858 5.1780777,-0.16291929 4.5560236,-0.81687583 3.9339667,-1.4708307 3.622939,-2.3879638 3.6229395,-3.5682777 c -5e-7,-1.2213214 0.3144451,-2.1692154 0.9433378,-2.8436849 0.6288898,-0.6744567 1.4446255,-1.0116882 2.4472096,-1.0116956 0.9706761,7.4e-6 1.7636259,0.3304032 2.3788518,0.9911882 0.6152133,0.660798 0.9228233,1.5904633 0.9228303,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 H 4.8944308 c 0.04557,0.7975103 0.2711506,1.4081728 0.6767423,1.8319893 0.4055868,0.4238195 0.9114341,0.6357285 1.5175434,0.63572765 0.4511571,8.5e-7 0.8362391,-0.1184859 1.155247,-0.35546065 0.3189977,-0.2369723 0.5719213,-0.6152184 0.7587717,-1.1347396 z M 4.9627526,-4.3270494 H 9.0163708 C 8.9616787,-4.9377076 8.8067345,-5.3957044 8.5515377,-5.7010414 8.1596145,-6.1749827 7.6514886,-6.4119562 7.0271585,-6.4119626 c -0.5650946,6.4e-6 -1.0401809,0.1891295 -1.4252604,0.5673698 -0.3850844,0.378252 -0.5981327,0.8840993 -0.6391455,1.5175434 z" />
606 <path
607 inkscape:connector-curvature="0"
608 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
609 id="path3756"
610 d="m 11.819166,0 v -7.2595995 h 1.107397 v 1.032203 c 0.533188,-0.7975008 1.303352,-1.1962543 2.310494,-1.1962617 0.437485,7.4e-6 0.839656,0.078619 1.206515,0.2358344 0.366848,0.15723 0.641418,0.3634426 0.823712,0.6186382 0.18228,0.2552088 0.309882,0.5582615 0.382803,0.9091589 0.04556,0.2278648 0.06835,0.6266183 0.06836,1.1962617 V 0 h -1.230441 v -4.4159146 c -5e-6,-0.5012856 -0.04786,-0.8761139 -0.143551,-1.1244859 -0.09571,-0.248361 -0.265461,-0.4465984 -0.509266,-0.594713 -0.243814,-0.1481023 -0.529777,-0.2221565 -0.85789,-0.2221629 -0.52408,6.4e-6 -0.976381,0.1663436 -1.356903,0.4990121 -0.380527,0.3326802 -0.57079,0.96385 -0.570787,1.8935113 V 0 Z" />
611 </g>
612 <g
613 id="text3095"
614 transform="matrix(1.25,0,0,1.25,467.4,529.5046)">
615 <path
616 inkscape:connector-curvature="0"
617 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
618 id="path3759"
619 d="M 3.2743391,2.9462216 C 2.5953156,2.0894683 2.0211106,1.0868881 1.5517223,-0.06152203 1.0823309,-1.209932 0.847636,-2.3993567 0.84763685,-3.6297997 0.847636,-4.7144056 1.0230875,-5.7534433 1.373992,-6.7469159 1.7841371,-7.8998764 2.4175855,-9.0482865 3.2743391,-10.19215 h 0.8818158 c -0.5514233,0.9479047 -0.9159979,1.6246463 -1.093725,2.0302274 -0.2779912,0.6288994 -0.496736,1.2851338 -0.656235,1.968705 -0.1959612,0.8521994 -0.2939407,1.7089497 -0.2939386,2.5702536 -2.1e-6,2.1920086 0.6812968,4.38173494 2.0438986,6.5691856 z" />
620 </g>
621 <g
622 id="text3099"
623 transform="matrix(1.25,0,0,1.25,473.225,529.5046)">
624 <path
625 inkscape:connector-curvature="0"
626 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
627 id="path3762"
628 d="M -0.02050734,0 3.8280374,-10.021255 H 5.2567156 L 9.3581842,0 H 7.8474766 L 6.6785581,-3.0350868 H 2.4882243 L 1.3876636,0 Z M 2.871028,-4.1151402 H 6.2684112 L 5.2225367,-6.8904673 C 4.9035287,-7.7335392 4.6665552,-8.426231 4.5116155,-8.9685447 4.3840099,-8.325973 4.2040011,-7.6879674 3.9715888,-7.054526 Z" />
629 </g>
630 <g
631 id="text3103"
632 transform="matrix(1.25,0,0,1.25,484.8875,529.5046)">
633 <path
634 inkscape:connector-curvature="0"
635 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
636 id="path3765"
637 d="M 1.7294526,2.9462216 H 0.84763685 C 2.2102337,0.75877094 2.8915325,-1.4309554 2.8915354,-3.622964 2.8915325,-4.4797107 2.7935531,-5.3296253 2.5975968,-6.1727103 2.44265,-6.8562815 2.2261838,-7.5125158 1.9481976,-8.1414152 1.7704655,-8.5515535 1.4036123,-9.2351309 0.84763685,-10.19215 H 1.7294526 c 0.8567486,1.1438635 1.490197,2.2922736 1.9003471,3.4452341 0.3508995,0.9934726 0.526351,2.0325103 0.5263552,3.1171162 -4.2e-6,1.230443 -0.2358384,2.4198677 -0.7075034,3.56827767 C 2.9769797,1.0868881 2.4039139,2.0894683 1.7294526,2.9462216 Z" />
638 </g>
639 <g
640 id="text3107"
641 transform="matrix(1.25,0,0,1.25,495.5875,529.5046)">
642 <path
643 inkscape:connector-curvature="0"
644 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
645 id="path3768"
646 d="M 1.2851268,2.9462216 V -10.19215 H 2.3583445 V 2.9462216 Z" />
647 <path
648 inkscape:connector-curvature="0"
649 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
650 id="path3770"
651 d="M 4.9218468,2.9462216 V -10.19215 H 5.9950644 V 2.9462216 Z" />
652 </g>
653 <g
654 id="text3111"
655 transform="matrix(1.25,0,0,1.25,509.5375,529.5046)">
656 <path
657 inkscape:connector-curvature="0"
658 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
659 id="path3773"
660 d="M 0.89548732,0 V -10.021255 H 2.1259279 V 0 Z" />
661 <path
662 inkscape:connector-curvature="0"
663 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
664 id="path3775"
665 d="m 9.0026992,-2.3378371 1.2714548,0.1572229 C 10.073631,-1.4377912 9.7022209,-0.86130755 9.1599222,-0.45116155 8.6176114,-0.04101465 7.9249196,0.16405858 7.0818447,0.16405874 6.0200172,0.16405858 5.1780777,-0.16291929 4.5560236,-0.81687583 3.9339667,-1.4708307 3.622939,-2.3879638 3.6229395,-3.5682777 c -5e-7,-1.2213214 0.3144451,-2.1692154 0.9433378,-2.8436849 0.6288898,-0.6744567 1.4446255,-1.0116882 2.4472096,-1.0116956 0.9706761,7.4e-6 1.7636259,0.3304032 2.3788518,0.9911882 0.6152133,0.660798 0.9228233,1.5904633 0.9228303,2.7889987 -7e-6,0.072919 -0.0023,0.182291 -0.0068,0.3281175 H 4.8944308 c 0.04557,0.7975103 0.2711506,1.4081728 0.6767423,1.8319893 0.4055868,0.4238195 0.9114341,0.6357285 1.5175434,0.63572765 0.4511571,8.5e-7 0.8362391,-0.1184859 1.155247,-0.35546065 0.3189977,-0.2369723 0.5719213,-0.6152184 0.7587717,-1.1347396 z M 4.9627526,-4.3270494 H 9.0163708 C 8.9616787,-4.9377076 8.8067345,-5.3957044 8.5515377,-5.7010414 8.1596145,-6.1749827 7.6514886,-6.4119562 7.0271585,-6.4119626 c -0.5650946,6.4e-6 -1.0401809,0.1891295 -1.4252604,0.5673698 -0.3850844,0.378252 -0.5981327,0.8840993 -0.6391455,1.5175434 z" />
666 <path
667 inkscape:connector-curvature="0"
668 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
669 id="path3777"
670 d="m 11.819166,0 v -7.2595995 h 1.107397 v 1.032203 c 0.533188,-0.7975008 1.303352,-1.1962543 2.310494,-1.1962617 0.437485,7.4e-6 0.839656,0.078619 1.206515,0.2358344 0.366848,0.15723 0.641418,0.3634426 0.823712,0.6186382 0.18228,0.2552088 0.309882,0.5582615 0.382803,0.9091589 0.04556,0.2278648 0.06835,0.6266183 0.06836,1.1962617 V 0 h -1.230441 v -4.4159146 c -5e-6,-0.5012856 -0.04786,-0.8761139 -0.143551,-1.1244859 -0.09571,-0.248361 -0.265461,-0.4465984 -0.509266,-0.594713 -0.243814,-0.1481023 -0.529777,-0.2221565 -0.85789,-0.2221629 -0.52408,6.4e-6 -0.976381,0.1663436 -1.356903,0.4990121 -0.380527,0.3326802 -0.57079,0.96385 -0.570787,1.8935113 V 0 Z" />
671 </g>
672 <g
673 id="text3115"
674 transform="matrix(1.25,0,0,1.25,532.8875,529.5046)">
675 <path
676 inkscape:connector-curvature="0"
677 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
678 id="path3780"
679 d="M 3.2743391,2.9462216 C 2.5953156,2.0894683 2.0211106,1.0868881 1.5517223,-0.06152203 1.0823309,-1.209932 0.847636,-2.3993567 0.84763685,-3.6297997 0.847636,-4.7144056 1.0230875,-5.7534433 1.373992,-6.7469159 1.7841371,-7.8998764 2.4175855,-9.0482865 3.2743391,-10.19215 h 0.8818158 c -0.5514233,0.9479047 -0.9159979,1.6246463 -1.093725,2.0302274 -0.2779912,0.6288994 -0.496736,1.2851338 -0.656235,1.968705 -0.1959612,0.8521994 -0.2939407,1.7089497 -0.2939386,2.5702536 -2.1e-6,2.1920086 0.6812968,4.38173494 2.0438986,6.5691856 z" />
680 </g>
681 <g
682 id="text3119"
683 transform="matrix(1.25,0,0,1.25,538.7125,529.5046)">
684 <path
685 inkscape:connector-curvature="0"
686 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
687 id="path3783"
688 d="m 8.2302804,-3.5135915 1.3261415,0.3349533 C 9.2784242,-2.0894683 8.7782734,-1.2589217 8.055968,-0.68699599 7.3336464,-0.11506887 6.4506923,0.17089436 5.4071028,0.17089453 4.3270451,0.17089436 3.4486481,-0.04898972 2.7719092,-0.48875834 2.0951648,-0.928526 1.5802031,-1.5653923 1.2270227,-2.3993591 0.8738398,-3.2333212 0.69724897,-4.1288076 0.69724967,-5.0858211 c -7e-7,-1.0435898 0.19937605,-1.953887 0.59813083,-2.7308945 0.3987522,-0.7769919 0.9661215,-1.367147 1.7021095,-1.7704673 0.735982,-0.4033011 1.5460213,-0.6049561 2.4301201,-0.6049671 1.0025748,1.1e-5 1.8456537,0.2552129 2.529239,0.7656079 0.6835695,0.5104139 1.1597951,1.2281702 1.4286783,2.1532711 L 8.0798932,-6.9656609 C 7.8474688,-7.6948032 7.5102373,-8.225715 7.0681976,-8.5583979 6.6261438,-8.8910636 6.0701675,-9.0574008 5.400267,-9.0574099 c -0.7701693,9.1e-6 -1.4138713,0.184575 -1.9311081,0.5536983 -0.5172437,0.3691403 -0.8806791,0.8647339 -1.0903071,1.4867824 -0.2096328,0.6220624 -0.314448,1.2634859 -0.3144459,1.9242723 -2.1e-6,0.8521983 0.1241811,1.5961584 0.37255,2.2318825 0.2483641,0.6357299 0.6345853,1.1108162 1.1586649,1.4252604 0.5240725,0.314447 1.0914417,0.47166984 1.7021095,0.47166887 0.7428155,9.7e-7 1.3717067,-0.21418667 1.8866756,-0.64256337 0.5149544,-0.4283736 0.8635789,-1.0641006 1.0458745,-1.907183 z" />
689 </g>
690 <g
691 id="text3123"
692 transform="matrix(1.25,0,0,1.25,551.35,529.5046)">
693 <path
694 inkscape:connector-curvature="0"
695 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
696 id="path3786"
697 d="M 1.7294526,2.9462216 H 0.84763685 C 2.2102337,0.75877094 2.8915325,-1.4309554 2.8915354,-3.622964 2.8915325,-4.4797107 2.7935531,-5.3296253 2.5975968,-6.1727103 2.44265,-6.8562815 2.2261838,-7.5125158 1.9481976,-8.1414152 1.7704655,-8.5515535 1.4036123,-9.2351309 0.84763685,-10.19215 H 1.7294526 c 0.8567486,1.1438635 1.490197,2.2922736 1.9003471,3.4452341 0.3508995,0.9934726 0.526351,2.0325103 0.5263552,3.1171162 -4.2e-6,1.230443 -0.2358384,2.4198677 -0.7075034,3.56827767 C 2.9769797,1.0868881 2.4039139,2.0894683 1.7294526,2.9462216 Z" />
698 </g>
699 <path
700 inkscape:connector-curvature="0"
701 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
702 id="path3127"
703 d="m 21.38,188.6546 h 115.1575 c 5.875,0 10.625,-4.75 10.625,-10.625 0,0 0,0 0,0 v 0 -30.3875 c 0,-5.8625 -4.75,-10.625 -10.625,-10.625 H 21.38 c -5.87125,0 -10.63,4.7625 -10.63,10.625 v 0 30.3875 c 0,5.875 4.75875,10.625 10.63,10.625 z" />
704 <path
705 inkscape:connector-curvature="0"
706 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
707 id="path3129"
708 d="m 21.38,188.6546 h 115.1575 c 5.875,0 10.625,-4.75 10.625,-10.625 0,0 0,0 0,0 v 0 -30.3875 c 0,-5.8625 -4.75,-10.625 -10.625,-10.625 H 21.38 c -5.87125,0 -10.63,4.7625 -10.63,10.625 v 0 30.3875 c 0,5.875 4.75875,10.625 10.63,10.625 z" />
709 <g
710 id="text3131"
711 transform="matrix(1.25,0,0,1.25,66.89875,168.0921)">
712 <path
713 inkscape:connector-curvature="0"
714 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
715 id="path3789"
716 d="M 0.62889186,0 2.7274766,-10.021255 H 9.959733 L 9.7204806,-8.8796796 H 3.8280374 l -0.656235,3.1171162 H 8.9138585 L 8.6746061,-4.620988 H 2.9325501 L 2.2079573,-1.1347397 H 8.5173832 L 8.2781308,0 Z" />
717 </g>
718 <g
719 id="text3135"
720 transform="matrix(1.25,0,0,1.25,83.4375,170.5046)">
721 <path
722 inkscape:connector-curvature="0"
723 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:9.09864044px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
724 id="path3792"
725 d="M 0.40428529,0 1.7637501,-6.5129916 h 0.8707683 l -0.6530762,3.136543 3.5363856,-3.136543 h 1.226184 L 3.7185362,-3.8607024 5.9354412,0 H 4.9624909 L 3.0832307,-3.3009228 1.7193232,-2.1147231 1.2750536,0 Z" />
726 </g>
727 <path
728 inkscape:connector-curvature="0"
729 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
730 id="path3139"
731 d="m 289.7875,188.6546 h 115.15 c 5.875,0 10.6375,-4.75 10.6375,-10.625 0,0 0,0 0,0 v -30.3875 c 0,-5.8625 -4.7625,-10.625 -10.6375,-10.625 h -115.15 c -5.875,0 -10.6375,4.7625 -10.6375,10.625 v 0 30.3875 c 0,5.875 4.7625,10.625 10.6375,10.625 z" />
732 <path
733 inkscape:connector-curvature="0"
734 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
735 id="path3141"
736 d="m 289.7875,188.6546 h 115.15 c 5.875,0 10.6375,-4.75 10.6375,-10.625 0,0 0,0 0,0 v -30.3875 c 0,-5.8625 -4.7625,-10.625 -10.6375,-10.625 h -115.15 c -5.875,0 -10.6375,4.7625 -10.6375,10.625 v 0 30.3875 c 0,5.875 4.7625,10.625 10.6375,10.625 z" />
737 <g
738 id="text3143"
739 transform="matrix(1.25,0,0,1.25,335.3,168.0921)">
740 <path
741 inkscape:connector-curvature="0"
742 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
743 id="path3795"
744 d="M 0.62889186,0 2.7274766,-10.021255 H 9.959733 L 9.7204806,-8.8796796 H 3.8280374 l -0.656235,3.1171162 H 8.9138585 L 8.6746061,-4.620988 H 2.9325501 L 2.2079573,-1.1347397 H 8.5173832 L 8.2781308,0 Z" />
745 </g>
746 <g
747 id="text3147"
748 transform="matrix(1.25,0,0,1.25,351.8375,170.5046)">
749 <path
750 inkscape:connector-curvature="0"
751 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:9.09864044px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
752 id="path3798"
753 d="M 0.40428529,0 1.7637501,-6.5129916 h 0.8707683 l -0.6530762,3.136543 3.5363856,-3.136543 h 1.226184 L 3.7185362,-3.8607024 5.9354412,0 H 4.9624909 L 3.0832307,-3.3009228 1.7193232,-2.1147231 1.2750536,0 Z" />
754 </g>
755 <path
756 inkscape:connector-curvature="0"
757 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
758 id="path3151"
759 d="m 559.075,188.6546 h 115.1625 c 5.8625,0 10.625,-4.75 10.625,-10.625 0,0 0,0 0,0 v 0 -30.3875 c 0,-5.8625 -4.7625,-10.625 -10.625,-10.625 H 559.075 c -5.875,0 -10.625,4.7625 -10.625,10.625 v 0 30.3875 c 0,5.875 4.75,10.625 10.625,10.625 z" />
760 <path
761 inkscape:connector-curvature="0"
762 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
763 id="path3153"
764 d="m 559.075,188.6546 h 115.1625 c 5.8625,0 10.625,-4.75 10.625,-10.625 0,0 0,0 0,0 v 0 -30.3875 c 0,-5.8625 -4.7625,-10.625 -10.625,-10.625 H 559.075 c -5.875,0 -10.625,4.7625 -10.625,10.625 v 0 30.3875 c 0,5.875 4.75,10.625 10.625,10.625 z" />
765 <g
766 id="text3155"
767 transform="matrix(1.25,0,0,1.25,604.6,168.0921)">
768 <path
769 inkscape:connector-curvature="0"
770 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
771 id="path3801"
772 d="M 0.62889186,0 2.7274766,-10.021255 H 9.959733 L 9.7204806,-8.8796796 H 3.8280374 l -0.656235,3.1171162 H 8.9138585 L 8.6746061,-4.620988 H 2.9325501 L 2.2079573,-1.1347397 H 8.5173832 L 8.2781308,0 Z" />
773 </g>
774 <g
775 id="text3159"
776 transform="matrix(1.25,0,0,1.25,621.125,170.5046)">
777 <path
778 inkscape:connector-curvature="0"
779 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:9.09864044px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
780 id="path3804"
781 d="M 0.40428529,0 1.7637501,-6.5129916 h 0.8707683 l -0.6530762,3.136543 3.5363856,-3.136543 h 1.226184 L 3.7185362,-3.8607024 5.9354412,0 H 4.9624909 L 3.0832307,-3.3009228 1.7193232,-2.1147231 1.2750536,0 Z" />
782 </g>
783 <path
784 inkscape:connector-curvature="0"
785 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
786 id="path3163"
787 d="M 127.675,472.1296 H 235.75 c 5.875,0 10.625,-4.7625 10.625,-10.6375 0,0 0,0 0,0 v -30.3875 c 0,-5.8625 -4.75,-10.625 -10.625,-10.625 v 0 H 127.675 c -5.8625,0 -10.625,4.7625 -10.625,10.625 v 0 30.3875 c 0,5.875 4.7625,10.6375 10.625,10.6375 z" />
788 <path
789 inkscape:connector-curvature="0"
790 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
791 id="path3165"
792 d="M 127.675,472.1296 H 235.75 c 5.875,0 10.625,-4.7625 10.625,-10.6375 0,0 0,0 0,0 v -30.3875 c 0,-5.8625 -4.75,-10.625 -10.625,-10.625 v 0 H 127.675 c -5.8625,0 -10.625,4.7625 -10.625,10.625 v 0 30.3875 c 0,5.875 4.7625,10.6375 10.625,10.6375 z" />
793 <g
794 id="text3167"
795 transform="matrix(1.25,0,0,1.25,158.65,451.5671)">
796 <path
797 inkscape:connector-curvature="0"
798 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
799 id="path3807"
800 d="M 0.92283044,0 V -7.2595995 H 2.0233912 v 1.0185314 c 0.2278571,-0.355454 0.5309098,-0.6414172 0.9091589,-0.8578905 0.3782432,-0.2164591 0.808897,-0.3246922 1.2919626,-0.3246996 0.5377433,7.4e-6 0.9786508,0.1116584 1.3227236,0.3349533 0.3440618,0.223309 0.5867318,0.535476 0.7280107,0.936502 0.5741988,-0.8476299 1.3215767,-1.2714479 2.2421362,-1.2714553 0.7200263,7.4e-6 1.273724,0.1993842 1.6610948,0.5981308 0.38735,0.3987604 0.581031,1.0128407 0.581041,1.842243 V 0 H 9.5359145 V -4.5731375 C 9.535905,-5.0653087 9.4960297,-5.4196296 9.4162884,-5.6361015 9.3365283,-5.852562 9.1918377,-6.0268743 8.9822163,-6.1590387 8.7725769,-6.2911909 8.526489,-6.35727 8.2439519,-6.3572764 c -0.5104127,6.4e-6 -0.9342307,0.1697615 -1.2714552,0.5092657 -0.3372385,0.339516 -0.5058543,0.88296 -0.5058478,1.6303338 V 0 H 5.2362083 V -4.7166889 C 5.236203,-5.2635461 5.135945,-5.6736926 4.9354339,-5.9471295 4.7349129,-6.2205545 4.4067958,-6.35727 3.9510814,-6.3572764 3.6047316,-6.35727 3.2845895,-6.2661264 2.9906542,-6.0838451 2.6967129,-5.9015517 2.4836646,-5.6349565 2.3515087,-5.2840587 2.219348,-4.9331504 2.1532689,-4.4273031 2.153271,-3.7665154 V 0 Z" />
801 <path
802 inkscape:connector-curvature="0"
803 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
804 id="path3809"
805 d="m 17.342374,0 v -1.0663818 c -0.565096,0.82029393 -1.332981,1.23044038 -2.303658,1.23044054 -0.428378,-1.6e-7 -0.828271,-0.08202945 -1.199679,-0.24608811 -0.371413,-0.1640585 -0.647122,-0.37027102 -0.82713,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.23044 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241528,0.5776248 0.492176,0.7621896 0.250643,0.18456703 0.560531,0.27684998 0.929666,0.27684908 0.369129,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552554,-0.4466028 0.686996,-0.7724433 0.134432,-0.3258366 0.20165,-0.7986443 0.201656,-1.4184246 v -3.8895594 h 1.23044 V 0 Z" />
806 <path
807 inkscape:connector-curvature="0"
808 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
809 id="path3811"
810 d="m 20.343407,0 v -10.021255 h 1.230441 V 0 Z" />
811 <path
812 inkscape:connector-curvature="0"
813 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
814 id="path3813"
815 d="m 26.167468,-1.1005607 0.177731,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.51952,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540026,-0.04785 z" />
816 </g>
817 <g
818 id="text3171"
819 transform="matrix(1.25,0,0,1.25,196.5625,453.9796)">
820 <path
821 inkscape:connector-curvature="0"
822 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:9.09864044px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
823 id="path3816"
824 d="M 0.38207182,0 1.7459793,-6.5129916 H 2.612305 L 2.0480826,-3.8073901 H 5.4245312 L 5.9887536,-6.5129916 H 6.8595219 L 5.5000571,0 H 4.6292887 L 5.2690369,-3.0699026 H 1.897031 L 1.2528401,0 Z" />
825 </g>
826 <path
827 inkscape:connector-curvature="0"
828 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
829 id="path3175"
830 d="M 293.325,472.1296 H 401.4 c 5.875,0 10.625,-4.7625 10.625,-10.6375 0,0 0,0 0,0 v 0 -30.3875 c 0,-5.8625 -4.75,-10.625 -10.625,-10.625 v 0 H 293.325 c -5.8625,0 -10.625,4.7625 -10.625,10.625 v 0 30.3875 c 0,5.875 4.7625,10.6375 10.625,10.6375 z" />
831 <path
832 inkscape:connector-curvature="0"
833 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
834 id="path3177"
835 d="M 293.325,472.1296 H 401.4 c 5.875,0 10.625,-4.7625 10.625,-10.6375 0,0 0,0 0,0 v 0 -30.3875 c 0,-5.8625 -4.75,-10.625 -10.625,-10.625 v 0 H 293.325 c -5.8625,0 -10.625,4.7625 -10.625,10.625 v 0 30.3875 c 0,5.875 4.7625,10.6375 10.625,10.6375 z" />
836 <g
837 id="text3179"
838 transform="matrix(1.25,0,0,1.25,324.3,451.5671)">
839 <path
840 inkscape:connector-curvature="0"
841 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
842 id="path3819"
843 d="M 0.92283044,0 V -7.2595995 H 2.0233912 v 1.0185314 c 0.2278571,-0.355454 0.5309098,-0.6414172 0.9091589,-0.8578905 0.3782432,-0.2164591 0.808897,-0.3246922 1.2919626,-0.3246996 0.5377433,7.4e-6 0.9786508,0.1116584 1.3227236,0.3349533 0.3440618,0.223309 0.5867318,0.535476 0.7280107,0.936502 0.5741988,-0.8476299 1.3215767,-1.2714479 2.2421362,-1.2714553 0.7200263,7.4e-6 1.273724,0.1993842 1.6610948,0.5981308 0.38735,0.3987604 0.581031,1.0128407 0.581041,1.842243 V 0 H 9.5359145 V -4.5731375 C 9.535905,-5.0653087 9.4960297,-5.4196296 9.4162884,-5.6361015 9.3365283,-5.852562 9.1918377,-6.0268743 8.9822163,-6.1590387 8.7725769,-6.2911909 8.526489,-6.35727 8.2439519,-6.3572764 c -0.5104127,6.4e-6 -0.9342307,0.1697615 -1.2714552,0.5092657 -0.3372385,0.339516 -0.5058543,0.88296 -0.5058478,1.6303338 V 0 H 5.2362083 V -4.7166889 C 5.236203,-5.2635461 5.135945,-5.6736926 4.9354339,-5.9471295 4.7349129,-6.2205545 4.4067958,-6.35727 3.9510814,-6.3572764 3.6047316,-6.35727 3.2845895,-6.2661264 2.9906542,-6.0838451 2.6967129,-5.9015517 2.4836646,-5.6349565 2.3515087,-5.2840587 2.219348,-4.9331504 2.1532689,-4.4273031 2.153271,-3.7665154 V 0 Z" />
844 <path
845 inkscape:connector-curvature="0"
846 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
847 id="path3821"
848 d="m 17.342374,0 v -1.0663818 c -0.565096,0.82029393 -1.332981,1.23044038 -2.303658,1.23044054 -0.428378,-1.6e-7 -0.828271,-0.08202945 -1.199679,-0.24608811 -0.371413,-0.1640585 -0.647122,-0.37027102 -0.82713,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.23044 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241528,0.5776248 0.492176,0.7621896 0.250643,0.18456703 0.560531,0.27684998 0.929666,0.27684908 0.369129,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552554,-0.4466028 0.686996,-0.7724433 0.134432,-0.3258366 0.20165,-0.7986443 0.201656,-1.4184246 v -3.8895594 h 1.23044 V 0 Z" />
849 <path
850 inkscape:connector-curvature="0"
851 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
852 id="path3823"
853 d="m 20.343407,0 v -10.021255 h 1.230441 V 0 Z" />
854 <path
855 inkscape:connector-curvature="0"
856 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
857 id="path3825"
858 d="m 26.167468,-1.1005607 0.177731,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.51952,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540026,-0.04785 z" />
859 </g>
860 <g
861 id="text3183"
862 transform="matrix(1.25,0,0,1.25,362.2125,453.9796)">
863 <path
864 inkscape:connector-curvature="0"
865 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:9.09864044px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
866 id="path3828"
867 d="M 0.38207182,0 1.7459793,-6.5129916 H 2.612305 L 2.0480826,-3.8073901 H 5.4245312 L 5.9887536,-6.5129916 H 6.8595219 L 5.5000571,0 H 4.6292887 L 5.2690369,-3.0699026 H 1.897031 L 1.2528401,0 Z" />
868 </g>
869 <path
870 inkscape:connector-curvature="0"
871 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
872 id="path3187"
873 d="m 562.625,472.1296 h 108.0625 c 5.875,0 10.6375,-4.7625 10.6375,-10.6375 0,0 0,0 0,0 v -30.3875 c 0,-5.8625 -4.7625,-10.625 -10.6375,-10.625 v 0 H 562.625 c -5.875,0 -10.6375,4.7625 -10.6375,10.625 v 30.3875 c 0,5.875 4.7625,10.6375 10.6375,10.6375 z" />
874 <path
875 inkscape:connector-curvature="0"
876 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
877 id="path3189"
878 d="m 562.625,472.1296 h 108.0625 c 5.875,0 10.6375,-4.7625 10.6375,-10.6375 0,0 0,0 0,0 v -30.3875 c 0,-5.8625 -4.7625,-10.625 -10.6375,-10.625 v 0 H 562.625 c -5.875,0 -10.6375,4.7625 -10.6375,10.625 v 30.3875 c 0,5.875 4.7625,10.6375 10.6375,10.6375 z" />
879 <g
880 id="text3191"
881 transform="matrix(1.25,0,0,1.25,593.5875,451.5671)">
882 <path
883 inkscape:connector-curvature="0"
884 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
885 id="path3831"
886 d="M 0.92283044,0 V -7.2595995 H 2.0233912 v 1.0185314 c 0.2278571,-0.355454 0.5309098,-0.6414172 0.9091589,-0.8578905 0.3782432,-0.2164591 0.808897,-0.3246922 1.2919626,-0.3246996 0.5377433,7.4e-6 0.9786508,0.1116584 1.3227236,0.3349533 0.3440618,0.223309 0.5867318,0.535476 0.7280107,0.936502 0.5741988,-0.8476299 1.3215767,-1.2714479 2.2421362,-1.2714553 0.7200263,7.4e-6 1.273724,0.1993842 1.6610948,0.5981308 0.38735,0.3987604 0.581031,1.0128407 0.581041,1.842243 V 0 H 9.5359145 V -4.5731375 C 9.535905,-5.0653087 9.4960297,-5.4196296 9.4162884,-5.6361015 9.3365283,-5.852562 9.1918377,-6.0268743 8.9822163,-6.1590387 8.7725769,-6.2911909 8.526489,-6.35727 8.2439519,-6.3572764 c -0.5104127,6.4e-6 -0.9342307,0.1697615 -1.2714552,0.5092657 -0.3372385,0.339516 -0.5058543,0.88296 -0.5058478,1.6303338 V 0 H 5.2362083 V -4.7166889 C 5.236203,-5.2635461 5.135945,-5.6736926 4.9354339,-5.9471295 4.7349129,-6.2205545 4.4067958,-6.35727 3.9510814,-6.3572764 3.6047316,-6.35727 3.2845895,-6.2661264 2.9906542,-6.0838451 2.6967129,-5.9015517 2.4836646,-5.6349565 2.3515087,-5.2840587 2.219348,-4.9331504 2.1532689,-4.4273031 2.153271,-3.7665154 V 0 Z" />
887 <path
888 inkscape:connector-curvature="0"
889 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
890 id="path3833"
891 d="m 17.342374,0 v -1.0663818 c -0.565096,0.82029393 -1.332981,1.23044038 -2.303658,1.23044054 -0.428378,-1.6e-7 -0.828271,-0.08202945 -1.199679,-0.24608811 -0.371413,-0.1640585 -0.647122,-0.37027102 -0.82713,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.23044 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241528,0.5776248 0.492176,0.7621896 0.250643,0.18456703 0.560531,0.27684998 0.929666,0.27684908 0.369129,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552554,-0.4466028 0.686996,-0.7724433 0.134432,-0.3258366 0.20165,-0.7986443 0.201656,-1.4184246 v -3.8895594 h 1.23044 V 0 Z" />
892 <path
893 inkscape:connector-curvature="0"
894 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
895 id="path3835"
896 d="m 20.343407,0 v -10.021255 h 1.230441 V 0 Z" />
897 <path
898 inkscape:connector-curvature="0"
899 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
900 id="path3837"
901 d="m 26.167468,-1.1005607 0.177731,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.51952,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540026,-0.04785 z" />
902 </g>
903 <g
904 id="text3195"
905 transform="matrix(1.25,0,0,1.25,631.5125,453.9796)">
906 <path
907 inkscape:connector-curvature="0"
908 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:9.09864044px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
909 id="path3840"
910 d="M 0.38207182,0 1.7459793,-6.5129916 H 2.612305 L 2.0480826,-3.8073901 H 5.4245312 L 5.9887536,-6.5129916 H 6.8595219 L 5.5000571,0 H 4.6292887 L 5.2690369,-3.0699026 H 1.897031 L 1.2528401,0 Z" />
911 </g>
912 <path
913 inkscape:connector-curvature="0"
914 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
915 id="path3199"
916 d="m 562.625,625.5046 h 108.0625 c 5.875,0 10.6375,-4.7625 10.6375,-10.625 0,0 0,0 0,0 v -30.3875 c 0,-5.875 -4.7625,-10.625 -10.6375,-10.625 H 562.625 c -5.875,0 -10.6375,4.75 -10.6375,10.625 v 30.3875 c 0,5.8625 4.7625,10.625 10.6375,10.625 z" />
917 <path
918 inkscape:connector-curvature="0"
919 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
920 id="path3201"
921 d="m 562.625,625.5046 h 108.0625 c 5.875,0 10.6375,-4.7625 10.6375,-10.625 0,0 0,0 0,0 v -30.3875 c 0,-5.875 -4.7625,-10.625 -10.6375,-10.625 H 562.625 c -5.875,0 -10.6375,4.75 -10.6375,10.625 v 30.3875 c 0,5.8625 4.7625,10.625 10.6375,10.625 z" />
922 <g
923 id="text3203"
924 transform="matrix(1.25,0,0,1.25,593.5875,604.9421)">
925 <path
926 inkscape:connector-curvature="0"
927 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
928 id="path3843"
929 d="M 0.92283044,0 V -7.2595995 H 2.0233912 v 1.0185314 c 0.2278571,-0.355454 0.5309098,-0.6414172 0.9091589,-0.8578905 0.3782432,-0.2164591 0.808897,-0.3246922 1.2919626,-0.3246996 0.5377433,7.4e-6 0.9786508,0.1116584 1.3227236,0.3349533 0.3440618,0.223309 0.5867318,0.535476 0.7280107,0.936502 0.5741988,-0.8476299 1.3215767,-1.2714479 2.2421362,-1.2714553 0.7200263,7.4e-6 1.273724,0.1993842 1.6610948,0.5981308 0.38735,0.3987604 0.581031,1.0128407 0.581041,1.842243 V 0 H 9.5359145 V -4.5731375 C 9.535905,-5.0653087 9.4960297,-5.4196296 9.4162884,-5.6361015 9.3365283,-5.852562 9.1918377,-6.0268743 8.9822163,-6.1590387 8.7725769,-6.2911909 8.526489,-6.35727 8.2439519,-6.3572764 c -0.5104127,6.4e-6 -0.9342307,0.1697615 -1.2714552,0.5092657 -0.3372385,0.339516 -0.5058543,0.88296 -0.5058478,1.6303338 V 0 H 5.2362083 V -4.7166889 C 5.236203,-5.2635461 5.135945,-5.6736926 4.9354339,-5.9471295 4.7349129,-6.2205545 4.4067958,-6.35727 3.9510814,-6.3572764 3.6047316,-6.35727 3.2845895,-6.2661264 2.9906542,-6.0838451 2.6967129,-5.9015517 2.4836646,-5.6349565 2.3515087,-5.2840587 2.219348,-4.9331504 2.1532689,-4.4273031 2.153271,-3.7665154 V 0 Z" />
930 <path
931 inkscape:connector-curvature="0"
932 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
933 id="path3845"
934 d="m 17.342374,0 v -1.0663818 c -0.565096,0.82029393 -1.332981,1.23044038 -2.303658,1.23044054 -0.428378,-1.6e-7 -0.828271,-0.08202945 -1.199679,-0.24608811 -0.371413,-0.1640585 -0.647122,-0.37027102 -0.82713,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.23044 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241528,0.5776248 0.492176,0.7621896 0.250643,0.18456703 0.560531,0.27684998 0.929666,0.27684908 0.369129,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552554,-0.4466028 0.686996,-0.7724433 0.134432,-0.3258366 0.20165,-0.7986443 0.201656,-1.4184246 v -3.8895594 h 1.23044 V 0 Z" />
935 <path
936 inkscape:connector-curvature="0"
937 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
938 id="path3847"
939 d="m 20.343407,0 v -10.021255 h 1.230441 V 0 Z" />
940 <path
941 inkscape:connector-curvature="0"
942 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
943 id="path3849"
944 d="m 26.167468,-1.1005607 0.177731,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.51952,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540026,-0.04785 z" />
945 </g>
946 <g
947 id="text3207"
948 transform="matrix(1.25,0,0,1.25,631.5125,607.3671)">
949 <path
950 inkscape:connector-curvature="0"
951 style="font-style:italic;font-variant:normal;font-weight:normal;font-size:9.09864044px;font-family:Arial;-inkscape-font-specification:'Arial Italic';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
952 id="path3852"
953 d="M 0.38207182,0 1.7459793,-6.5129916 H 2.612305 L 2.0480826,-3.8073901 H 5.4245312 L 5.9887536,-6.5129916 H 6.8595219 L 5.5000571,0 H 4.6292887 L 5.2690369,-3.0699026 H 1.897031 L 1.2528401,0 Z" />
954 </g>
955 <path
956 inkscape:connector-curvature="0"
957 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
958 id="path3211"
959 d="M 117.05,538.4296 H 246.375 V 510.08335 H 117.05 Z" />
960 <path
961 inkscape:connector-curvature="0"
962 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
963 id="path3213"
964 d="M 117.05,538.4296 H 246.375 V 510.08335 H 117.05 Z" />
965 <g
966 id="text3215"
967 transform="matrix(1.25,0,0,1.25,135.5,529.5046)">
968 <path
969 inkscape:connector-curvature="0"
970 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
971 id="path3855"
972 d="M -0.02050734,0 3.8280374,-10.021255 H 5.2567156 L 9.3581842,0 H 7.8474766 L 6.6785581,-3.0350868 H 2.4882243 L 1.3876636,0 Z M 2.871028,-4.1151402 H 6.2684112 L 5.2225367,-6.8904673 C 4.9035287,-7.7335392 4.6665552,-8.426231 4.5116155,-8.9685447 4.3840099,-8.325973 4.2040011,-7.6879674 3.9715888,-7.054526 Z" />
973 <path
974 inkscape:connector-curvature="0"
975 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
976 id="path3857"
977 d="m 15.018214,0 v -1.0663818 c -0.565096,0.82029393 -1.332982,1.23044038 -2.303658,1.23044054 -0.428379,-1.6e-7 -0.828272,-0.08202945 -1.19968,-0.24608811 -0.371412,-0.1640585 -0.647122,-0.37027102 -0.827129,-0.61863819 -0.18001,-0.24836576 -0.306472,-0.55255774 -0.379386,-0.91257674 -0.05013,-0.2415291 -0.07519,-0.6243325 -0.07519,-1.1484112 v -4.497944 h 1.230441 v 4.0262751 c -2e-6,0.642566 0.02506,1.0754983 0.07519,1.2987984 0.07747,0.3235619 0.241529,0.5776248 0.492177,0.7621896 0.250642,0.18456703 0.56053,0.27684998 0.929666,0.27684908 0.369128,9e-7 0.715474,-0.0945606 1.039039,-0.28368488 0.323555,-0.1891219 0.552553,-0.4466028 0.686996,-0.7724433 0.134431,-0.3258366 0.20165,-0.7986443 0.201655,-1.4184246 v -3.8895594 h 1.230441 V 0 Z" />
978 <path
979 inkscape:connector-curvature="0"
980 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
981 id="path3859"
982 d="m 20.733053,-1.1005607 0.17773,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.519519,-0.55711615 -0.10026,-0.23013706 -0.150389,-0.71433777 -0.150388,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237277 v 0.9570094 h -1.237277 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.238111,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540027,-0.04785 z" />
983 <path
984 inkscape:connector-curvature="0"
985 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
986 id="path3861"
987 d="m 21.936319,0 v -10.021255 h 1.230441 v 3.5956208 c 0.574203,-0.6653422 1.298795,-0.9980166 2.173778,-0.998024 0.537743,7.4e-6 1.004855,0.1059619 1.401335,0.3178638 0.396469,0.2119161 0.680154,0.5047151 0.851055,0.8783979 0.170888,0.3736952 0.256335,0.9159999 0.256342,1.6269159 V 0 h -1.230441 v -4.6004806 c -5e-6,-0.6152151 -0.133303,-1.0629583 -0.399893,-1.343231 -0.2666,-0.2802608 -0.643707,-0.4203942 -1.131322,-0.4204005 -0.364578,6.3e-6 -0.707506,0.094568 -1.028785,0.2836849 -0.321284,0.1891291 -0.550283,0.4454707 -0.686996,0.7690253 -0.136718,0.3235653 -0.205075,0.7701692 -0.205073,1.3398131 V 0 Z" />
988 <path
989 inkscape:connector-curvature="0"
990 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
991 id="path3863"
992 d="m 33.76935,0 v -10.021255 h 3.45207 c 0.779273,10e-6 1.373986,0.04786 1.784138,0.1435514 0.574199,0.1321682 1.064096,0.3714203 1.469693,0.717757 0.528626,0.4466131 0.923961,1.0174002 1.186008,1.7123632 0.262029,0.6949778 0.393048,1.4890669 0.393058,2.3822697 -10e-6,0.7610545 -0.08887,1.4355176 -0.266596,2.0233911 -0.177739,0.5878797 -0.405598,1.0743589 -0.683578,1.4594393 -0.277996,0.3850835 -0.582188,0.68813618 -0.912577,0.90915887 -0.330403,0.22102404 -0.729156,0.3885005 -1.196261,0.5024299 C 38.528187,-0.05696479 37.991579,0 37.385478,0 Z m 1.326142,-1.1825901 h 2.139599 c 0.660787,1.2e-6 1.179167,-0.061521 1.55514,-0.1845661 0.375962,-0.1230426 0.675597,-0.2962155 0.898906,-0.5195194 0.314438,-0.3144437 0.559387,-0.7371224 0.734846,-1.2680373 0.175444,-0.5309087 0.26317,-1.1746108 0.263178,-1.9311082 -8e-6,-1.048147 -0.172042,-1.853629 -0.516102,-2.4164486 C 39.826984,-8.0650743 39.408863,-8.4421811 38.916693,-8.6335915 38.561227,-8.7702983 37.9893,-8.838656 37.200912,-8.8386649 h -2.10542 z" />
993 <path
994 inkscape:connector-curvature="0"
995 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
996 id="path3865"
997 d="m 48.459564,-0.89548732 c -0.455724,0.38736144 -0.894352,0.66079241 -1.315887,0.82029373 -0.421544,0.15950147 -0.873845,0.23925217 -1.356903,0.23925233 -0.79751,-1.6e-7 -1.410451,-0.19481972 -1.838825,-0.58445927 -0.428376,-0.38963871 -0.642564,-0.88751097 -0.642564,-1.49361817 0,-0.3554583 0.08089,-0.6801576 0.242671,-0.9740988 0.161779,-0.2939354 0.373688,-0.5297696 0.635727,-0.7075033 0.262037,-0.1777266 0.557115,-0.3121635 0.885234,-0.4033111 0.241528,-0.063797 0.606103,-0.1253185 1.093725,-0.1845661 0.993462,-0.1184826 1.72489,-0.2597552 2.194286,-0.4238184 0.0046,-0.1686112 0.0068,-0.275705 0.0068,-0.3212817 -5e-6,-0.5012852 -0.116213,-0.8544669 -0.348624,-1.0595461 -0.314451,-0.2779822 -0.781562,-0.4169762 -1.401336,-0.4169826 -0.578766,6.4e-6 -1.006001,0.1014037 -1.281708,0.3041922 -0.275713,0.2028008 -0.479646,0.5616789 -0.611803,1.0766355 L 43.51726,-5.1883578 c 0.109371,-0.5149565 0.28938,-0.9307994 0.540026,-1.24753 0.250644,-0.3167178 0.61294,-0.5605271 1.08689,-0.7314286 0.473944,-0.1708872 1.023085,-0.2563344 1.647423,-0.2563418 0.619773,7.4e-6 1.123341,0.072922 1.510707,0.218745 0.387355,0.145837 0.672179,0.3292636 0.854473,0.5502804 0.182281,0.22103 0.309882,0.5001574 0.382804,0.8373831 0.04101,0.2096363 0.06151,0.5878824 0.06152,1.1347397 v 1.6405874 c -7e-6,1.143856 0.0262,1.8673087 0.07861,2.17036052 C 49.732152,-0.56850855 49.835828,-0.27798815 49.990779,0 H 48.705652 C 48.578045,-0.25520224 48.496016,-0.55369771 48.459564,-0.89548732 Z M 48.357028,-3.6434713 c -0.44661,0.182291 -1.116516,0.3372352 -2.00972,0.4648331 -0.505851,0.072918 -0.86359,0.1549474 -1.073218,0.2460881 -0.209632,0.091147 -0.371412,0.2244442 -0.48534,0.3998932 -0.113932,0.1754541 -0.170896,0.3702737 -0.170895,0.5844593 -10e-7,0.3281191 0.124182,0.6015501 0.37255,0.8202937 0.248365,0.21874593 0.6118,0.32811832 1.090308,0.32811752 0.473943,8e-7 0.895483,-0.10367511 1.264619,-0.31102802 0.369127,-0.2073507 0.64028,-0.4910354 0.813458,-0.8510548 0.132153,-0.2779861 0.198232,-0.6881326 0.198238,-1.2304405 z" />
998 <path
999 inkscape:connector-curvature="0"
1000 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1001 id="path3867"
1002 d="m 54.194909,-1.1005607 0.177731,1.08688914 c -0.34635,0.07291494 -0.656238,0.1093724 -0.929666,0.10937249 -0.446607,-9e-8 -0.792953,-0.07063642 -1.039039,-0.21190921 -0.24609,-0.14127255 -0.419263,-0.32697775 -0.51952,-0.55711615 -0.100259,-0.23013706 -0.150388,-0.71433777 -0.150387,-1.45260347 v -4.1766622 h -0.902323 v -0.9570094 h 0.902323 v -1.7978104 l 1.223605,-0.7382643 v 2.5360747 h 1.237276 v 0.9570094 h -1.237276 v 4.24502 c -2e-6,0.3509051 0.02164,0.5764857 0.06494,0.6767423 0.04329,0.1002594 0.113927,0.1800101 0.211909,0.2392524 0.09798,0.059244 0.23811,0.088866 0.420401,0.088865 0.136712,1.1e-6 0.316721,-0.015949 0.540026,-0.04785 z" />
1003 <path
1004 inkscape:connector-curvature="0"
1005 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1006 id="path3869"
1007 d="m 60.135372,-0.89548732 c -0.455724,0.38736144 -0.894352,0.66079241 -1.315888,0.82029373 -0.421543,0.15950147 -0.873844,0.23925217 -1.356902,0.23925233 -0.79751,-1.6e-7 -1.410451,-0.19481972 -1.838825,-0.58445927 -0.428377,-0.38963871 -0.642564,-0.88751097 -0.642564,-1.49361817 0,-0.3554583 0.08089,-0.6801576 0.242671,-0.9740988 0.161779,-0.2939354 0.373688,-0.5297696 0.635727,-0.7075033 0.262037,-0.1777266 0.557114,-0.3121635 0.885234,-0.4033111 0.241528,-0.063797 0.606103,-0.1253185 1.093725,-0.1845661 0.993462,-0.1184826 1.72489,-0.2597552 2.194286,-0.4238184 0.0046,-0.1686112 0.0068,-0.275705 0.0068,-0.3212817 -5e-6,-0.5012852 -0.116213,-0.8544669 -0.348624,-1.0595461 -0.314451,-0.2779822 -0.781563,-0.4169762 -1.401336,-0.4169826 -0.578766,6.4e-6 -1.006001,0.1014037 -1.281709,0.3041922 -0.275712,0.2028008 -0.479646,0.5616789 -0.611802,1.0766355 l -1.203097,-0.1640587 c 0.109371,-0.5149565 0.28938,-0.9307994 0.540026,-1.24753 0.250644,-0.3167178 0.61294,-0.5605271 1.08689,-0.7314286 0.473944,-0.1708872 1.023085,-0.2563344 1.647423,-0.2563418 0.619773,7.4e-6 1.123341,0.072922 1.510707,0.218745 0.387355,0.145837 0.672179,0.3292636 0.854473,0.5502804 0.182281,0.22103 0.309882,0.5001574 0.382804,0.8373831 0.04101,0.2096363 0.06151,0.5878824 0.06152,1.1347397 v 1.6405874 c -7e-6,1.143856 0.0262,1.8673087 0.07861,2.17036052 C 61.40796,-0.56850855 61.511636,-0.27798815 61.666587,0 H 60.38146 C 60.253853,-0.25520224 60.171824,-0.55369771 60.135372,-0.89548732 Z M 60.032836,-3.6434713 c -0.44661,0.182291 -1.116516,0.3372352 -2.00972,0.4648331 -0.505851,0.072918 -0.86359,0.1549474 -1.073218,0.2460881 -0.209633,0.091147 -0.371413,0.2244442 -0.48534,0.3998932 -0.113932,0.1754541 -0.170896,0.3702737 -0.170895,0.5844593 -1e-6,0.3281191 0.124182,0.6015501 0.37255,0.8202937 0.248365,0.21874593 0.6118,0.32811832 1.090308,0.32811752 0.473943,8e-7 0.895483,-0.10367511 1.264619,-0.31102802 0.369127,-0.2073507 0.64028,-0.4910354 0.813458,-0.8510548 0.132153,-0.2779861 0.198232,-0.6881326 0.198238,-1.2304405 z" />
1008 </g>
1009 <g
1010 id="text3219"
1011 transform="matrix(1.25,0,0,1.25,218.1875,529.5046)">
1012 <path
1013 inkscape:connector-curvature="0"
1014 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1015 id="path3872"
1016 d="M 5.2157009,0 H 3.9852603 V -7.8406409 C 3.6890395,-7.5580877 3.3005396,-7.2755423 2.8197597,-6.993004 2.3389741,-6.7104517 1.907181,-6.4985427 1.5243792,-6.3572764 V -7.5467023 C 2.2125123,-7.8702547 2.8140604,-8.2621724 3.3290254,-8.7224566 3.8439837,-9.1827233 4.2085583,-9.6293273 4.4227503,-10.06227 h 0.7929506 z" />
1017 </g>
1018 <path
1019 inkscape:connector-curvature="0"
1020 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1021 id="path3223"
1022 d="m 187.9125,102.0046 h 50.5 c 5.8625,0 10.625,-4.75 10.625,-10.625 0,0 0,0 0,0 v -5.9 c 0,-5.875 -4.7625,-10.6375 -10.625,-10.6375 h -50.5 c -5.8625,0 -10.625,4.7625 -10.625,10.6375 v 0 5.9 c 0,5.875 4.7625,10.625 10.625,10.625 z" />
1023 <path
1024 inkscape:connector-curvature="0"
1025 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1026 id="path3225"
1027 d="m 187.9125,102.0046 h 50.5 c 5.8625,0 10.625,-4.75 10.625,-10.625 0,0 0,0 0,0 v -5.9 c 0,-5.875 -4.7625,-10.6375 -10.625,-10.6375 h -50.5 c -5.8625,0 -10.625,4.7625 -10.625,10.6375 v 0 5.9 c 0,5.875 4.7625,10.625 10.625,10.625 z" />
1028 <g
1029 id="text3227"
1030 transform="matrix(1.25,0,0,1.25,199.0625,93.6796)">
1031 <path
1032 inkscape:connector-curvature="0"
1033 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1034 id="path3875"
1035 d="M 0.92966622,-8.6062483 V -10.021255 H 2.1601068 v 1.4150067 z m 0,8.6062483 V -7.2595995 H 2.1601068 V 0 Z" />
1036 <path
1037 inkscape:connector-curvature="0"
1038 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1039 id="path3877"
1040 d="m 4.0330864,0 v -7.2595995 h 1.1073965 v 1.032203 c 0.5331884,-0.7975008 1.3033523,-1.1962543 2.310494,-1.1962617 0.4374852,7.4e-6 0.8396566,0.078619 1.2065154,0.2358344 0.3668476,0.15723 0.6414179,0.3634426 0.8237116,0.6186382 0.1822809,0.2552088 0.309882,0.5582615 0.3828037,0.9091589 0.045565,0.2278648 0.068351,0.6266183 0.068358,1.1962617 V 0 H 8.701925 V -4.4159146 C 8.7019193,-4.9172002 8.6540688,-5.2920285 8.5583734,-5.5404005 8.4626672,-5.7887615 8.2929121,-5.9869989 8.0491078,-6.1351135 7.8052935,-6.2832158 7.5193303,-6.35727 7.1912172,-6.3572764 6.6671371,-6.35727 6.2148367,-6.1909328 5.8343147,-5.8582643 5.4537872,-5.5255841 5.2635248,-4.8944143 5.263527,-3.964753 V 0 Z" />
1041 <path
1042 inkscape:connector-curvature="0"
1043 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1044 id="path3879"
1045 d="m 16.556362,-2.6591188 1.209934,0.1572229 c -0.132166,0.833967 -0.470536,1.4867834 -1.015114,1.95845131 -0.544589,0.47166896 -1.213356,0.70750317 -2.006302,0.70750333 -0.993469,-1.6e-7 -1.792116,-0.32469943 -2.395941,-0.97409879 -0.603828,-0.64939775 -0.905741,-1.58020235 -0.905741,-2.79241655 0,-0.7838318 0.129879,-1.4696879 0.38964,-2.0575701 0.259758,-0.5878709 0.655094,-1.0287784 1.186008,-1.3227236 0.530909,-0.2939313 1.108532,-0.4409005 1.73287,-0.4409079 0.788389,7.4e-6 1.43323,0.1993842 1.934526,0.5981308 0.501284,0.3987604 0.822566,0.9649903 0.963845,1.6986916 l -1.196261,0.1845661 c -0.113936,-0.4876136 -0.315591,-0.8544668 -0.604967,-1.1005607 -0.289386,-0.2460819 -0.63915,-0.3691258 -1.049292,-0.3691322 -0.619781,6.4e-6 -1.12335,0.2221691 -1.510708,0.6664886 -0.387363,0.4443311 -0.581043,1.1472766 -0.581041,2.1088385 -2e-6,0.9752407 0.186842,1.6838827 0.560534,2.1259279 0.373686,0.4420482 0.861305,0.6630716 1.462857,0.66307075 0.483057,8.5e-7 0.886368,-0.14810759 1.209933,-0.44432575 0.323555,-0.2962156 0.528628,-0.7519339 0.61522,-1.3671562 z" />
1046 <path
1047 inkscape:connector-curvature="0"
1048 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1049 id="path3881"
1050 d="m 18.805407,0 v -7.2595995 h 1.107396 v 1.1005608 c 0.282544,-0.5149555 0.543442,-0.8544656 0.782697,-1.0185314 0.239249,-0.1640514 0.502427,-0.2460807 0.789533,-0.2460881 0.4147,7.4e-6 0.836239,0.1321657 1.264619,0.3964753 l -0.423818,1.1415754 c -0.300779,-0.1777242 -0.601553,-0.2665893 -0.902323,-0.2665954 -0.268877,6.1e-6 -0.510408,0.080896 -0.724593,0.2426702 -0.21419,0.1617859 -0.366856,0.3862271 -0.457997,0.6733244 -0.136718,0.4374948 -0.205076,0.915999 -0.205074,1.435514 V 0 Z" />
1051 </g>
1052 <path
1053 inkscape:connector-curvature="0"
1054 style="fill:#66ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1055 id="path3231"
1056 d="M 459.8625,102.0046 H 510.35 c 5.875,0 10.6375,-4.75 10.6375,-10.625 0,0 0,0 0,0 v -5.9 c 0,-5.875 -4.7625,-10.6375 -10.6375,-10.6375 h -50.4875 c -5.875,0 -10.625,4.7625 -10.625,10.6375 v 0 5.9 c 0,5.875 4.75,10.625 10.625,10.625 z" />
1057 <path
1058 inkscape:connector-curvature="0"
1059 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1060 id="path3233"
1061 d="M 459.8625,102.0046 H 510.35 c 5.875,0 10.6375,-4.75 10.6375,-10.625 0,0 0,0 0,0 v -5.9 c 0,-5.875 -4.7625,-10.6375 -10.6375,-10.6375 h -50.4875 c -5.875,0 -10.625,4.7625 -10.625,10.6375 v 0 5.9 c 0,5.875 4.75,10.625 10.625,10.625 z" />
1062 <g
1063 id="text3235"
1064 transform="matrix(1.25,0,0,1.25,471.0125,93.6796)">
1065 <path
1066 inkscape:connector-curvature="0"
1067 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1068 id="path3884"
1069 d="M 0.92966622,-8.6062483 V -10.021255 H 2.1601068 v 1.4150067 z m 0,8.6062483 V -7.2595995 H 2.1601068 V 0 Z" />
1070 <path
1071 inkscape:connector-curvature="0"
1072 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1073 id="path3886"
1074 d="m 4.0330864,0 v -7.2595995 h 1.1073965 v 1.032203 c 0.5331884,-0.7975008 1.3033523,-1.1962543 2.310494,-1.1962617 0.4374852,7.4e-6 0.8396566,0.078619 1.2065154,0.2358344 0.3668476,0.15723 0.6414179,0.3634426 0.8237116,0.6186382 0.1822809,0.2552088 0.309882,0.5582615 0.3828037,0.9091589 0.045565,0.2278648 0.068351,0.6266183 0.068358,1.1962617 V 0 H 8.701925 V -4.4159146 C 8.7019193,-4.9172002 8.6540688,-5.2920285 8.5583734,-5.5404005 8.4626672,-5.7887615 8.2929121,-5.9869989 8.0491078,-6.1351135 7.8052935,-6.2832158 7.5193303,-6.35727 7.1912172,-6.3572764 6.6671371,-6.35727 6.2148367,-6.1909328 5.8343147,-5.8582643 5.4537872,-5.5255841 5.2635248,-4.8944143 5.263527,-3.964753 V 0 Z" />
1075 <path
1076 inkscape:connector-curvature="0"
1077 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1078 id="path3888"
1079 d="m 16.556362,-2.6591188 1.209934,0.1572229 c -0.132166,0.833967 -0.470536,1.4867834 -1.015114,1.95845131 -0.544589,0.47166896 -1.213356,0.70750317 -2.006302,0.70750333 -0.993469,-1.6e-7 -1.792116,-0.32469943 -2.395941,-0.97409879 -0.603828,-0.64939775 -0.905741,-1.58020235 -0.905741,-2.79241655 0,-0.7838318 0.129879,-1.4696879 0.38964,-2.0575701 0.259758,-0.5878709 0.655094,-1.0287784 1.186008,-1.3227236 0.530909,-0.2939313 1.108532,-0.4409005 1.73287,-0.4409079 0.788389,7.4e-6 1.43323,0.1993842 1.934526,0.5981308 0.501284,0.3987604 0.822566,0.9649903 0.963845,1.6986916 l -1.196261,0.1845661 c -0.113936,-0.4876136 -0.315591,-0.8544668 -0.604967,-1.1005607 -0.289386,-0.2460819 -0.63915,-0.3691258 -1.049292,-0.3691322 -0.619781,6.4e-6 -1.12335,0.2221691 -1.510708,0.6664886 -0.387363,0.4443311 -0.581043,1.1472766 -0.581041,2.1088385 -2e-6,0.9752407 0.186842,1.6838827 0.560534,2.1259279 0.373686,0.4420482 0.861305,0.6630716 1.462857,0.66307075 0.483057,8.5e-7 0.886368,-0.14810759 1.209933,-0.44432575 0.323555,-0.2962156 0.528628,-0.7519339 0.61522,-1.3671562 z" />
1080 <path
1081 inkscape:connector-curvature="0"
1082 style="font-variant:normal;font-weight:normal;font-size:13.99967957px;font-family:Arial;-inkscape-font-specification:Arial;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
1083 id="path3890"
1084 d="m 18.805407,0 v -7.2595995 h 1.107396 v 1.1005608 c 0.282544,-0.5149555 0.543442,-0.8544656 0.782697,-1.0185314 0.239249,-0.1640514 0.502427,-0.2460807 0.789533,-0.2460881 0.4147,7.4e-6 0.836239,0.1321657 1.264619,0.3964753 l -0.423818,1.1415754 c -0.300779,-0.1777242 -0.601553,-0.2665893 -0.902323,-0.2665954 -0.268877,6.1e-6 -0.510408,0.080896 -0.724593,0.2426702 -0.21419,0.1617859 -0.366856,0.3862271 -0.457997,0.6733244 -0.136718,0.4374948 -0.205076,0.915999 -0.205074,1.435514 V 0 Z" />
1085 </g>
1086 <path
1087 inkscape:connector-curvature="0"
1088 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1089 id="path3239"
1090 d="m 333.1875,240.7921 c 0,-7.825 6.35,-14.175 14.175,-14.175 7.825,0 14.175,6.35 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.35,14.175 -14.175,14.175 -7.825,0 -14.175,-6.35 -14.175,-14.175 z" />
1091 <path
1092 inkscape:connector-curvature="0"
1093 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1094 id="path3241"
1095 d="m 333.1875,240.7921 c 0,-7.825 6.35,-14.175 14.175,-14.175 7.825,0 14.175,6.35 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.35,14.175 -14.175,14.175 -7.825,0 -14.175,-6.35 -14.175,-14.175 z" />
1096 <path
1097 inkscape:connector-curvature="0"
1098 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1099 id="path3243"
1100 d="M 361.5375,240.7921 H 352.575 344.8625 338.4 333.1875" />
1101 <path
1102 inkscape:connector-curvature="0"
1103 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1104 id="path3245"
1105 d="m 347.3625,226.6171 v 8.9625 7.7125 6.4625 5.2125" />
1106 <path
1107 inkscape:connector-curvature="0"
1108 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1109 id="path3247"
1110 d="m 333.1875,368.3546 c 0,-7.8375 6.35,-14.175 14.175,-14.175 7.825,0 14.175,6.3375 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.35,14.1625 -14.175,14.1625 -7.825,0 -14.175,-6.3375 -14.175,-14.1625 z" />
1111 <path
1112 inkscape:connector-curvature="0"
1113 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1114 id="path3249"
1115 d="m 333.1875,368.3546 c 0,-7.8375 6.35,-14.175 14.175,-14.175 7.825,0 14.175,6.3375 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.35,14.1625 -14.175,14.1625 -7.825,0 -14.175,-6.3375 -14.175,-14.1625 z" />
1116 <path
1117 inkscape:connector-curvature="0"
1118 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1119 id="path3251"
1120 d="M 361.5375,368.3546 H 352.575 344.8625 338.4 333.1875" />
1121 <path
1122 inkscape:connector-curvature="0"
1123 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1124 id="path3253"
1125 d="m 347.3625,354.1796 v 8.9625 7.7125 6.4625 5.2" />
1126 <path
1127 inkscape:connector-curvature="0"
1128 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1129 id="path3255"
1130 d="m 602.4875,240.7921 c 0,-7.825 6.3375,-14.175 14.1625,-14.175 7.8375,0 14.175,6.35 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.3375,14.175 -14.175,14.175 -7.825,0 -14.1625,-6.35 -14.1625,-14.175 z" />
1131 <path
1132 inkscape:connector-curvature="0"
1133 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1134 id="path3257"
1135 d="m 602.4875,240.7921 c 0,-7.825 6.3375,-14.175 14.1625,-14.175 7.8375,0 14.175,6.35 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.3375,14.175 -14.175,14.175 -7.825,0 -14.1625,-6.35 -14.1625,-14.175 z" />
1136 <path
1137 inkscape:connector-curvature="0"
1138 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1139 id="path3259"
1140 d="m 630.825,240.7921 h -8.9625 -7.7125 -6.4625 -5.2" />
1141 <path
1142 inkscape:connector-curvature="0"
1143 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1144 id="path3261"
1145 d="m 616.65,226.6171 v 8.9625 7.7125 6.4625 5.2125" />
1146 <path
1147 inkscape:connector-curvature="0"
1148 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1149 id="path3263"
1150 d="m 602.4875,368.3546 c 0,-7.8375 6.3375,-14.175 14.1625,-14.175 7.8375,0 14.175,6.3375 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.3375,14.1625 -14.175,14.1625 -7.825,0 -14.1625,-6.3375 -14.1625,-14.1625 z" />
1151 <path
1152 inkscape:connector-curvature="0"
1153 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1154 id="path3265"
1155 d="m 602.4875,368.3546 c 0,-7.8375 6.3375,-14.175 14.1625,-14.175 7.8375,0 14.175,6.3375 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.3375,14.1625 -14.175,14.1625 -7.825,0 -14.1625,-6.3375 -14.1625,-14.1625 z" />
1156 <path
1157 inkscape:connector-curvature="0"
1158 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1159 id="path3267"
1160 d="m 630.825,368.3546 h -8.9625 -7.7125 -6.4625 -5.2" />
1161 <path
1162 inkscape:connector-curvature="0"
1163 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1164 id="path3269"
1165 d="m 616.65,354.1796 v 8.9625 7.7125 6.4625 5.2" />
1166 <path
1167 inkscape:connector-curvature="0"
1168 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1169 id="path3271"
1170 d="m 602.4875,524.2546 c 0,-7.825 6.3375,-14.175 14.1625,-14.175 7.8375,0 14.175,6.35 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.3375,14.175 -14.175,14.175 -7.825,0 -14.1625,-6.35 -14.1625,-14.175 z" />
1171 <path
1172 inkscape:connector-curvature="0"
1173 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1174 id="path3273"
1175 d="m 602.4875,524.2546 c 0,-7.825 6.3375,-14.175 14.1625,-14.175 7.8375,0 14.175,6.35 14.175,14.175 0,0 0,0 0,0 0,7.825 -6.3375,14.175 -14.175,14.175 -7.825,0 -14.1625,-6.35 -14.1625,-14.175 z" />
1176 <path
1177 inkscape:connector-curvature="0"
1178 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1179 id="path3275"
1180 d="m 630.825,524.2546 h -8.9625 -7.7125 -6.4625 -5.2" />
1181 <path
1182 inkscape:connector-curvature="0"
1183 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1184 id="path3277"
1185 d="m 616.65,510.0796 v 8.9625 7.7125 6.4625 5.2125" />
1186 <path
1187 inkscape:connector-curvature="0"
1188 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1189 id="path3279"
1190 d="m 602.4875,676.6171 c 0,-7.825 6.3375,-14.175 14.1625,-14.175 7.8375,0 14.175,6.35 14.175,14.175 0,0 0,0 0,0 0,7.8275 -6.3375,14.17375 -14.175,14.17375 -7.825,0 -14.1625,-6.34625 -14.1625,-14.17375 z" />
1191 <path
1192 inkscape:connector-curvature="0"
1193 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1194 id="path3281"
1195 d="m 602.4875,676.6171 c 0,-7.825 6.3375,-14.175 14.1625,-14.175 7.8375,0 14.175,6.35 14.175,14.175 0,0 0,0 0,0 0,7.8275 -6.3375,14.17375 -14.175,14.17375 -7.825,0 -14.1625,-6.34625 -14.1625,-14.17375 z" />
1196 <path
1197 inkscape:connector-curvature="0"
1198 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1199 id="path3283"
1200 d="m 630.825,676.6171 h -8.9625 -7.7125 -6.4625 -5.2" />
1201 <path
1202 inkscape:connector-curvature="0"
1203 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1204 id="path3285"
1205 d="m 616.65,662.4421 v 8.9625 7.7125 6.4625 5.21125" />
1206 <path
1207 inkscape:connector-curvature="0"
1208 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1209 id="path3287"
1210 d="m 78.95875,128.8796 v -8.45 -7.2 -5.9375 -4.6875" />
1211 <path
1212 inkscape:connector-curvature="0"
1213 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1214 id="path3289"
1215 d="m 83.6125,127.7171 -4.65375,9.3 -4.65,-9.3 z" />
1216 <path
1217 inkscape:connector-curvature="0"
1218 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1219 id="path3291"
1220 d="m 169.15,88.4296 h -8.2125 -6.9875 -5.775 -4.55" />
1221 <path
1222 inkscape:connector-curvature="0"
1223 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1224 id="path3293"
1225 d="m 167.9875,93.0796 9.3,-4.65 -9.3,-4.65 z" />
1226 <path
1227 inkscape:connector-curvature="0"
1228 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1229 id="path3295"
1230 d="M 274.5625,88.4296 H 266.35 259.3625 253.6 249.0375" />
1231 <path
1232 inkscape:connector-curvature="0"
1233 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1234 id="path3297"
1235 d="m 273.4,93.0796 9.3,-4.65 -9.3,-4.65 z" />
1236 <path
1237 inkscape:connector-curvature="0"
1238 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1239 id="path3299"
1240 d="m 441.1,88.4296 h -9.375 -7.975 -6.5625 -5.1625" />
1241 <path
1242 inkscape:connector-curvature="0"
1243 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1244 id="path3301"
1245 d="m 439.9375,93.0796 9.3,-4.65 -9.3,-4.65 z" />
1246 <path
1247 inkscape:connector-curvature="0"
1248 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1249 id="path3303"
1250 d="m 543.85,88.4296 h -7.325 -6.2625 -5.175 -4.1" />
1251 <path
1252 inkscape:connector-curvature="0"
1253 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1254 id="path3305"
1255 d="m 542.6875,93.0796 9.3,-4.65 -9.3,-4.65 z" />
1256 <path
1257 inkscape:connector-curvature="0"
1258 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1259 id="path3307"
1260 d="m 616.65,128.8796 v -8.45 -7.2 -5.9375 -4.6875" />
1261 <path
1262 inkscape:connector-curvature="0"
1263 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1264 id="path3309"
1265 d="m 621.3,127.7171 -4.65,9.3 -4.65,-9.3 z" />
1266 <path
1267 inkscape:connector-curvature="0"
1268 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1269 id="path3311"
1270 d="m 616.65,218.4796 v -9.625 -8.175 -6.725 -5.3" />
1271 <path
1272 inkscape:connector-curvature="0"
1273 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1274 id="path3313"
1275 d="m 621.3,217.3171 -4.65,9.3 -4.65,-9.3 z" />
1276 <path
1277 inkscape:connector-curvature="0"
1278 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1279 id="path3315"
1280 d="M 594.35,240.7921 H 584.975 577 570.4375 565.275" />
1281 <path
1282 inkscape:connector-curvature="0"
1283 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1284 id="path3317"
1285 d="m 593.1875,245.4421 9.3,-4.65 -9.3,-4.65 z" />
1286 <path
1287 inkscape:connector-curvature="0"
1288 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1289 id="path3319"
1290 d="m 616.65,282.2546 v -8.7875 -7.475 -6.175 -4.85" />
1291 <path
1292 inkscape:connector-curvature="0"
1293 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1294 id="path3321"
1295 d="m 621.3,281.0921 -4.65,9.3 -4.65,-9.3 z" />
1296 <path
1297 inkscape:connector-curvature="0"
1298 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1299 id="path3323"
1300 d="m 347.3625,282.2546 v -8.7875 -7.475 -6.175 -4.85" />
1301 <path
1302 inkscape:connector-curvature="0"
1303 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1304 id="path3325"
1305 d="m 352.0125,281.0921 -4.65,9.3 -4.65,-9.3 z" />
1306 <path
1307 inkscape:connector-curvature="0"
1308 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1309 id="path3327"
1310 d="m 347.3625,218.4796 v -9.625 -8.175 -6.725 -5.3" />
1311 <path
1312 inkscape:connector-curvature="0"
1313 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1314 id="path3329"
1315 d="m 352.0125,217.3171 -4.65,9.3 -4.65,-9.3 z" />
1316 <path
1317 inkscape:connector-curvature="0"
1318 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1319 id="path3331"
1320 d="m 325.05,240.7921 h -9.95 -8.4625 -6.9625 -5.4625" />
1321 <path
1322 inkscape:connector-curvature="0"
1323 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1324 id="path3333"
1325 d="m 323.8875,245.4421 9.3,-4.65 -9.3,-4.65 z" />
1326 <path
1327 inkscape:connector-curvature="0"
1328 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1329 id="path3335"
1330 d="M 325.05,368.3546 H 181.7125 v 52.125" />
1331 <path
1332 inkscape:connector-curvature="0"
1333 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1334 id="path3337"
1335 d="m 323.8875,363.7046 9.3,4.65 -9.3,4.65 z" />
1336 <path
1337 inkscape:connector-curvature="0"
1338 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1339 id="path3339"
1340 d="M 594.35,368.3546 H 492.6375 v 77.95 H 412.025" />
1341 <path
1342 inkscape:connector-curvature="0"
1343 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1344 id="path3341"
1345 d="m 593.1875,363.7046 9.3,4.65 -9.3,4.65 z" />
1346 <path
1347 inkscape:connector-curvature="0"
1348 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1349 id="path3343"
1350 d="M 594.35,676.6171 H 78.95875 V 188.6546" />
1351 <path
1352 inkscape:connector-curvature="0"
1353 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1354 id="path3345"
1355 d="m 593.1875,671.9671 9.3,4.65 -9.3,4.65 z" />
1356 <path
1357 inkscape:connector-curvature="0"
1358 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1359 id="path3347"
1360 d="m 347.3625,128.8796 v -8.45 -7.2 -5.9375 -4.6875" />
1361 <path
1362 inkscape:connector-curvature="0"
1363 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1364 id="path3349"
1365 d="m 352.0125,127.7171 -4.65,9.3 -4.65,-9.3 z" />
1366 <path
1367 inkscape:connector-curvature="0"
1368 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1369 id="path3351"
1370 d="m 347.3625,346.0421 v -8.7875 -7.4875 -6.1625 -4.8625" />
1371 <path
1372 inkscape:connector-curvature="0"
1373 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1374 id="path3353"
1375 d="m 352.0125,344.8796 -4.65,9.3 -4.65,-9.3 z" />
1376 <path
1377 inkscape:connector-curvature="0"
1378 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1379 id="path3355"
1380 d="m 616.65,346.0421 v -8.7875 -7.4875 -6.1625 -4.8625" />
1381 <path
1382 inkscape:connector-curvature="0"
1383 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1384 id="path3357"
1385 d="m 621.3,344.8796 -4.65,9.3 -4.65,-9.3 z" />
1386 <path
1387 inkscape:connector-curvature="0"
1388 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1389 id="path3359"
1390 d="m 616.65,412.3421 v -9.625 -8.175 -6.725 -5.3" />
1391 <path
1392 inkscape:connector-curvature="0"
1393 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1394 id="path3361"
1395 d="m 621.3,411.1796 -4.65,9.3 -4.65,-9.3 z" />
1396 <path
1397 inkscape:connector-curvature="0"
1398 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1399 id="path3363"
1400 d="m 347.3625,412.3421 v -9.625 -8.175 -6.725 -5.3" />
1401 <path
1402 inkscape:connector-curvature="0"
1403 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1404 id="path3365"
1405 d="m 352.0125,411.1796 -4.65,9.3 -4.65,-9.3 z" />
1406 <path
1407 inkscape:connector-curvature="0"
1408 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1409 id="path3367"
1410 d="m 181.7125,480.2671 v 9.6125 8.175 6.7375 5.2875" />
1411 <path
1412 inkscape:connector-curvature="0"
1413 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1414 id="path3369"
1415 d="m 186.3625,481.4296 -4.65,-9.3 -4.65,9.3 z" />
1416 <path
1417 inkscape:connector-curvature="0"
1418 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1419 id="path3371"
1420 d="m 616.65,501.9421 v -9.6125 -8.1875 -6.725 -5.2875" />
1421 <path
1422 inkscape:connector-curvature="0"
1423 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1424 id="path3373"
1425 d="m 621.3,500.7796 -4.65,9.3 -4.65,-9.3 z" />
1426 <path
1427 inkscape:connector-curvature="0"
1428 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1429 id="path3375"
1430 d="M 594.35,524.2546 H 584.975 577 570.4375 565.275" />
1431 <path
1432 inkscape:connector-curvature="0"
1433 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1434 id="path3377"
1435 d="m 593.1875,528.9046 9.3,-4.65 -9.3,-4.65 z" />
1436 <path
1437 inkscape:connector-curvature="0"
1438 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1439 id="path3379"
1440 d="m 616.65,565.7296 v -8.8 -7.475 -6.1625 -4.8625" />
1441 <path
1442 inkscape:connector-curvature="0"
1443 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1444 id="path3381"
1445 d="m 621.3,564.5671 -4.65,9.3 -4.65,-9.3 z" />
1446 <path
1447 inkscape:connector-curvature="0"
1448 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1449 id="path3383"
1450 d="m 616.65,654.3046 v -9.2875 -7.8875 -6.5125 -5.1125" />
1451 <path
1452 inkscape:connector-curvature="0"
1453 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1454 id="path3385"
1455 d="m 621.3,653.1421 -4.65,9.3 -4.65,-9.3 z" />
1456 <path
1457 inkscape:connector-curvature="0"
1458 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1459 id="path3387"
1460 d="m 616.7875,718.08585 -0.0375,-8.7875 -0.0375,-7.47875 -0.0375,-6.17 -0.025,-4.85875" />
1461 <path
1462 inkscape:connector-curvature="0"
1463 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1464 id="path3389"
1465 d="m 621.4375,716.90085 -4.6,9.3225 -4.7,-9.27625 9.3,-0.0463 z" />
1466 <path
1467 inkscape:connector-curvature="0"
1468 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
1469 id="path2995-7"
1470 d="M 14.034651,39.09625 H 143.35965 V 10.75 H 14.034651 Z" />
1471 <path
1472 inkscape:connector-curvature="0"
1473 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1474 id="path2997-5"
1475 d="M 14.034651,39.09625 H 143.35965 V 10.75 H 14.034651 Z" />
1476 <path
1477 inkscape:connector-curvature="0"
1478 style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
1479 id="path3287-3"
1480 d="m 78.984461,66.015963 v -8.45 -7.200001 -5.9375 -4.6875" />
1481 <path
1482 inkscape:connector-curvature="0"
1483 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
1484 id="path3289-6"
1485 d="m 83.638211,64.853463 -4.65375,9.3 -4.65,-9.3 z" />
1486 <g
1487 aria-label="iv"
1488 style="font-style:normal;font-weight:normal;font-size:17.33333397px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
1489 id="text4422"
1490 transform="translate(-10,53.50835)">
1491 <path
1492 d="m 83.545802,-32.44836 h 1.557292 v 9.479167 h -1.557292 z m 0,-3.690104 h 1.557292 v 1.972005 h -1.557292 z"
1493 id="path5024"
1494 inkscape:connector-curvature="0" />
1495 <path
1496 d="m 87.235906,-32.44836 h 1.650391 l 2.96224,7.95573 2.962239,-7.95573 h 1.650391 l -3.554688,9.479167 h -2.115885 z"
1497 id="path5026"
1498 inkscape:connector-curvature="0" />
1499 </g>
1500</svg>
diff --git a/reveal.js/images/cryptographic_primitives/hmac.svg b/reveal.js/images/cryptographic_primitives/hmac.svg
new file mode 100644
index 0000000..9f6d2f8
--- /dev/null
+++ b/reveal.js/images/cryptographic_primitives/hmac.svg
@@ -0,0 +1,165 @@
1<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="58.931ex" height="10.843ex" style="vertical-align: -4.838ex;" viewBox="0 -2585.3 25373 4668.3" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
2<title id="MathJax-SVG-1-Title">{\displaystyle {\begin{aligned}\operatorname {HMAC} (K,m)&amp;=\operatorname {H} {\Bigl (}{\bigl (}K'\oplus opad{\bigr )}\parallel \operatorname {H} {\bigl (}\left(K'\oplus ipad\right)\parallel m{\bigr )}{\Bigr )}\\K'&amp;={\begin{cases}\operatorname {H} \left(K\right)&amp;{\text{if}}\ K{\text{ is larger than block size}}\\K&amp;{\text{otherwise}}\end{cases}}\end{aligned}}}</title>
3<defs aria-hidden="true">
4<path stroke-width="1" id="E1-MJMAIN-48" d="M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622Z"></path>
5<path stroke-width="1" id="E1-MJMAIN-4D" d="M132 622Q125 629 121 631T105 634T62 637H29V683H135Q221 683 232 682T249 675Q250 674 354 398L458 124L562 398Q666 674 668 675Q671 681 683 682T781 683H887V637H854Q814 636 803 634T785 622V61Q791 51 802 49T854 46H887V0H876Q855 3 736 3Q605 3 596 0H585V46H618Q660 47 669 49T688 61V347Q688 424 688 461T688 546T688 613L687 632Q454 14 450 7Q446 1 430 1T410 7Q409 9 292 316L176 624V606Q175 588 175 543T175 463T175 356L176 86Q187 50 261 46H278V0H269Q254 3 154 3Q52 3 37 0H29V46H46Q78 48 98 56T122 69T132 86V622Z"></path>
6<path stroke-width="1" id="E1-MJMAIN-41" d="M255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447Z"></path>
7<path stroke-width="1" id="E1-MJMAIN-43" d="M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z"></path>
8<path stroke-width="1" id="E1-MJMAIN-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path>
9<path stroke-width="1" id="E1-MJMATHI-4B" d="M285 628Q285 635 228 637Q205 637 198 638T191 647Q191 649 193 661Q199 681 203 682Q205 683 214 683H219Q260 681 355 681Q389 681 418 681T463 682T483 682Q500 682 500 674Q500 669 497 660Q496 658 496 654T495 648T493 644T490 641T486 639T479 638T470 637T456 637Q416 636 405 634T387 623L306 305Q307 305 490 449T678 597Q692 611 692 620Q692 635 667 637Q651 637 651 648Q651 650 654 662T659 677Q662 682 676 682Q680 682 711 681T791 680Q814 680 839 681T869 682Q889 682 889 672Q889 650 881 642Q878 637 862 637Q787 632 726 586Q710 576 656 534T556 455L509 418L518 396Q527 374 546 329T581 244Q656 67 661 61Q663 59 666 57Q680 47 717 46H738Q744 38 744 37T741 19Q737 6 731 0H720Q680 3 625 3Q503 3 488 0H478Q472 6 472 9T474 27Q478 40 480 43T491 46H494Q544 46 544 71Q544 75 517 141T485 216L427 354L359 301L291 248L268 155Q245 63 245 58Q245 51 253 49T303 46H334Q340 37 340 35Q340 19 333 5Q328 0 317 0Q314 0 280 1T180 2Q118 2 85 2T49 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Z"></path>
10<path stroke-width="1" id="E1-MJMAIN-2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path>
11<path stroke-width="1" id="E1-MJMATHI-6D" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path>
12<path stroke-width="1" id="E1-MJMAIN-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path>
13<path stroke-width="1" id="E1-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path>
14<path stroke-width="1" id="E1-MJSZ2-28" d="M180 96T180 250T205 541T266 770T353 944T444 1069T527 1150H555Q561 1144 561 1141Q561 1137 545 1120T504 1072T447 995T386 878T330 721T288 513T272 251Q272 133 280 56Q293 -87 326 -209T399 -405T475 -531T536 -609T561 -640Q561 -643 555 -649H527Q483 -612 443 -568T353 -443T266 -270T205 -41Z"></path>
15<path stroke-width="1" id="E1-MJSZ1-28" d="M152 251Q152 646 388 850H416Q422 844 422 841Q422 837 403 816T357 753T302 649T255 482T236 250Q236 124 255 19T301 -147T356 -251T403 -315T422 -340Q422 -343 416 -349H388Q359 -325 332 -296T271 -213T212 -97T170 56T152 251Z"></path>
16<path stroke-width="1" id="E1-MJMAIN-2032" d="M79 43Q73 43 52 49T30 61Q30 68 85 293T146 528Q161 560 198 560Q218 560 240 545T262 501Q262 496 260 486Q259 479 173 263T84 45T79 43Z"></path>
17<path stroke-width="1" id="E1-MJMAIN-2295" d="M56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM364 542Q308 539 251 509T148 418T96 278V270H369V542H364ZM681 278Q675 338 650 386T592 462T522 509T458 535T412 542H409V270H681V278ZM96 222Q104 150 139 95T219 12T302 -29T366 -42H369V230H96V222ZM681 222V230H409V-42H412Q429 -42 456 -36T521 -10T590 37T649 113T681 222Z"></path>
18<path stroke-width="1" id="E1-MJMATHI-6F" d="M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z"></path>
19<path stroke-width="1" id="E1-MJMATHI-70" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path>
20<path stroke-width="1" id="E1-MJMATHI-61" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path>
21<path stroke-width="1" id="E1-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path>
22<path stroke-width="1" id="E1-MJSZ1-29" d="M305 251Q305 -145 69 -349H56Q43 -349 39 -347T35 -338Q37 -333 60 -307T108 -239T160 -136T204 27T221 250T204 473T160 636T108 740T60 807T35 839Q35 850 50 850H56H69Q197 743 256 566Q305 425 305 251Z"></path>
23<path stroke-width="1" id="E1-MJMAIN-2225" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z"></path>
24<path stroke-width="1" id="E1-MJMATHI-69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path>
25<path stroke-width="1" id="E1-MJSZ2-29" d="M35 1138Q35 1150 51 1150H56H69Q113 1113 153 1069T243 944T330 771T391 541T416 250T391 -40T330 -270T243 -443T152 -568T69 -649H56Q43 -649 39 -647T35 -637Q65 -607 110 -548Q283 -316 316 56Q324 133 324 251Q324 368 316 445Q278 877 48 1123Q36 1137 35 1138Z"></path>
26<path stroke-width="1" id="E1-MJMAIN-7B" d="M434 -231Q434 -244 428 -250H410Q281 -250 230 -184Q225 -177 222 -172T217 -161T213 -148T211 -133T210 -111T209 -84T209 -47T209 0Q209 21 209 53Q208 142 204 153Q203 154 203 155Q189 191 153 211T82 231Q71 231 68 234T65 250T68 266T82 269Q116 269 152 289T203 345Q208 356 208 377T209 529V579Q209 634 215 656T244 698Q270 724 324 740Q361 748 377 749Q379 749 390 749T408 750H428Q434 744 434 732Q434 719 431 716Q429 713 415 713Q362 710 332 689T296 647Q291 634 291 499V417Q291 370 288 353T271 314Q240 271 184 255L170 250L184 245Q202 239 220 230T262 196T290 137Q291 131 291 1Q291 -134 296 -147Q306 -174 339 -192T415 -213Q429 -213 431 -216Q434 -219 434 -231Z"></path>
27<path stroke-width="1" id="E1-MJMAIN-69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z"></path>
28<path stroke-width="1" id="E1-MJMAIN-66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z"></path>
29<path stroke-width="1" id="E1-MJMAIN-73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z"></path>
30<path stroke-width="1" id="E1-MJMAIN-6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path>
31<path stroke-width="1" id="E1-MJMAIN-61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z"></path>
32<path stroke-width="1" id="E1-MJMAIN-72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z"></path>
33<path stroke-width="1" id="E1-MJMAIN-67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z"></path>
34<path stroke-width="1" id="E1-MJMAIN-65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z"></path>
35<path stroke-width="1" id="E1-MJMAIN-74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z"></path>
36<path stroke-width="1" id="E1-MJMAIN-68" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path>
37<path stroke-width="1" id="E1-MJMAIN-6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path>
38<path stroke-width="1" id="E1-MJMAIN-62" d="M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z"></path>
39<path stroke-width="1" id="E1-MJMAIN-6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z"></path>
40<path stroke-width="1" id="E1-MJMAIN-63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z"></path>
41<path stroke-width="1" id="E1-MJMAIN-6B" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T97 124T98 167T98 217T98 272T98 329Q98 366 98 407T98 482T98 542T97 586T97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V463L180 233L240 287Q300 341 304 347Q310 356 310 364Q310 383 289 385H284V431H293Q308 428 412 428Q475 428 484 431H489V385H476Q407 380 360 341Q286 278 286 274Q286 273 349 181T420 79Q434 60 451 53T500 46H511V0H505Q496 3 418 3Q322 3 307 0H299V46H306Q330 48 330 65Q330 72 326 79Q323 84 276 153T228 222L176 176V120V84Q176 65 178 59T189 49Q210 46 238 46H254V0H246Q231 3 137 3T28 0H20V46H36Z"></path>
42<path stroke-width="1" id="E1-MJMAIN-7A" d="M42 263Q44 270 48 345T53 423V431H393Q399 425 399 415Q399 403 398 402L381 378Q364 355 331 309T265 220L134 41L182 40H206Q254 40 283 46T331 77Q352 105 359 185L361 201Q361 202 381 202H401V196Q401 195 393 103T384 6V0H209L34 1L31 3Q28 8 28 17Q28 30 29 31T160 210T294 394H236Q169 393 152 388Q127 382 113 367Q89 344 82 264V255H42V263Z"></path>
43<path stroke-width="1" id="E1-MJMAIN-77" d="M90 368Q84 378 76 380T40 385H18V431H24L43 430Q62 430 84 429T116 428Q206 428 221 431H229V385H215Q177 383 177 368Q177 367 221 239L265 113L339 328L333 345Q323 374 316 379Q308 384 278 385H258V431H264Q270 428 348 428Q439 428 454 431H461V385H452Q404 385 404 369Q404 366 418 324T449 234T481 143L496 100L537 219Q579 341 579 347Q579 363 564 373T530 385H522V431H529Q541 428 624 428Q692 428 698 431H703V385H697Q696 385 691 385T682 384Q635 377 619 334L559 161Q546 124 528 71Q508 12 503 1T487 -11H479Q460 -11 456 -4Q455 -3 407 133L361 267Q359 263 266 -4Q261 -11 243 -11H238Q225 -11 220 -3L90 368Z"></path>
44<path stroke-width="1" id="E1-MJSZ3-7B" d="M618 -943L612 -949H582L568 -943Q472 -903 411 -841T332 -703Q327 -682 327 -653T325 -350Q324 -28 323 -18Q317 24 301 61T264 124T221 171T179 205T147 225T132 234Q130 238 130 250Q130 255 130 258T131 264T132 267T134 269T139 272T144 275Q207 308 256 367Q310 436 323 519Q324 529 325 851Q326 1124 326 1154T332 1205Q369 1358 566 1443L582 1450H612L618 1444V1429Q618 1413 616 1411L608 1406Q599 1402 585 1393T552 1372T515 1343T479 1305T449 1257T429 1200Q425 1180 425 1152T423 851Q422 579 422 549T416 498Q407 459 388 424T346 364T297 318T250 284T214 264T197 254L188 251L205 242Q290 200 345 138T416 3Q421 -18 421 -48T423 -349Q423 -397 423 -472Q424 -677 428 -694Q429 -697 429 -699Q434 -722 443 -743T465 -782T491 -816T519 -845T548 -868T574 -886T595 -899T610 -908L616 -910Q618 -912 618 -928V-943Z"></path>
45</defs>
46<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
47<g transform="translate(167,0)">
48<g transform="translate(-11,0)">
49<g transform="translate(0,1350)">
50 <use xlink:href="#E1-MJMAIN-48"></use>
51 <use xlink:href="#E1-MJMAIN-4D" x="750" y="0"></use>
52 <use xlink:href="#E1-MJMAIN-41" x="1668" y="0"></use>
53 <use xlink:href="#E1-MJMAIN-43" x="2418" y="0"></use>
54 <use xlink:href="#E1-MJMAIN-28" x="3141" y="0"></use>
55 <use xlink:href="#E1-MJMATHI-4B" x="3530" y="0"></use>
56 <use xlink:href="#E1-MJMAIN-2C" x="4420" y="0"></use>
57 <use xlink:href="#E1-MJMATHI-6D" x="4865" y="0"></use>
58 <use xlink:href="#E1-MJMAIN-29" x="5743" y="0"></use>
59</g>
60<g transform="translate(4936,-1051)">
61 <use xlink:href="#E1-MJMATHI-4B" x="0" y="0"></use>
62 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-2032" x="1274" y="583"></use>
63</g>
64</g>
65<g transform="translate(6122,0)">
66<g transform="translate(0,1350)">
67 <use xlink:href="#E1-MJMAIN-3D" x="277" y="0"></use>
68 <use xlink:href="#E1-MJMAIN-48" x="1334" y="0"></use>
69 <use xlink:href="#E1-MJSZ2-28" x="2251" y="-1"></use>
70 <use xlink:href="#E1-MJSZ1-28" x="2848" y="-1"></use>
71<g transform="translate(3307,0)">
72 <use xlink:href="#E1-MJMATHI-4B" x="0" y="0"></use>
73 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-2032" x="1274" y="583"></use>
74</g>
75 <use xlink:href="#E1-MJMAIN-2295" x="4725" y="0"></use>
76 <use xlink:href="#E1-MJMATHI-6F" x="5726" y="0"></use>
77 <use xlink:href="#E1-MJMATHI-70" x="6212" y="0"></use>
78 <use xlink:href="#E1-MJMATHI-61" x="6715" y="0"></use>
79 <use xlink:href="#E1-MJMATHI-64" x="7245" y="0"></use>
80 <use xlink:href="#E1-MJSZ1-29" x="7768" y="-1"></use>
81 <use xlink:href="#E1-MJMAIN-2225" x="8504" y="0"></use>
82 <use xlink:href="#E1-MJMAIN-48" x="9283" y="0"></use>
83 <use xlink:href="#E1-MJSZ1-28" x="10200" y="-1"></use>
84<g transform="translate(10825,0)">
85 <use xlink:href="#E1-MJMAIN-28"></use>
86<g transform="translate(389,0)">
87 <use xlink:href="#E1-MJMATHI-4B" x="0" y="0"></use>
88 <use transform="scale(0.707)" xlink:href="#E1-MJMAIN-2032" x="1274" y="583"></use>
89 <use xlink:href="#E1-MJMAIN-2295" x="1418" y="0"></use>
90 <use xlink:href="#E1-MJMATHI-69" x="2419" y="0"></use>
91 <use xlink:href="#E1-MJMATHI-70" x="2764" y="0"></use>
92 <use xlink:href="#E1-MJMATHI-61" x="3268" y="0"></use>
93 <use xlink:href="#E1-MJMATHI-64" x="3797" y="0"></use>
94</g>
95 <use xlink:href="#E1-MJMAIN-29" x="4710" y="0"></use>
96</g>
97 <use xlink:href="#E1-MJMAIN-2225" x="16203" y="0"></use>
98 <use xlink:href="#E1-MJMATHI-6D" x="16981" y="0"></use>
99 <use xlink:href="#E1-MJSZ1-29" x="17860" y="-1"></use>
100 <use xlink:href="#E1-MJSZ2-29" x="18318" y="-1"></use>
101</g>
102<g transform="translate(0,-1051)">
103 <use xlink:href="#E1-MJMAIN-3D" x="277" y="0"></use>
104<g transform="translate(1334,0)">
105 <use xlink:href="#E1-MJSZ3-7B"></use>
106<g transform="translate(917,0)">
107<g transform="translate(-11,0)">
108<g transform="translate(0,575)">
109 <use xlink:href="#E1-MJMAIN-48" x="0" y="0"></use>
110<g transform="translate(750,0)">
111 <use xlink:href="#E1-MJMAIN-28" x="0" y="0"></use>
112 <use xlink:href="#E1-MJMATHI-4B" x="389" y="0"></use>
113 <use xlink:href="#E1-MJMAIN-29" x="1279" y="0"></use>
114</g>
115</g>
116 <use xlink:href="#E1-MJMATHI-4B" x="0" y="-676"></use>
117</g>
118<g transform="translate(3408,0)">
119<g transform="translate(0,575)">
120 <use xlink:href="#E1-MJMAIN-69"></use>
121 <use xlink:href="#E1-MJMAIN-66" x="278" y="0"></use>
122 <use xlink:href="#E1-MJMATHI-4B" x="835" y="0"></use>
123<g transform="translate(1724,0)">
124 <use xlink:href="#E1-MJMAIN-69" x="250" y="0"></use>
125 <use xlink:href="#E1-MJMAIN-73" x="528" y="0"></use>
126 <use xlink:href="#E1-MJMAIN-6C" x="1173" y="0"></use>
127 <use xlink:href="#E1-MJMAIN-61" x="1451" y="0"></use>
128 <use xlink:href="#E1-MJMAIN-72" x="1952" y="0"></use>
129 <use xlink:href="#E1-MJMAIN-67" x="2344" y="0"></use>
130 <use xlink:href="#E1-MJMAIN-65" x="2845" y="0"></use>
131 <use xlink:href="#E1-MJMAIN-72" x="3289" y="0"></use>
132 <use xlink:href="#E1-MJMAIN-74" x="3932" y="0"></use>
133 <use xlink:href="#E1-MJMAIN-68" x="4321" y="0"></use>
134 <use xlink:href="#E1-MJMAIN-61" x="4878" y="0"></use>
135 <use xlink:href="#E1-MJMAIN-6E" x="5378" y="0"></use>
136 <use xlink:href="#E1-MJMAIN-62" x="6185" y="0"></use>
137 <use xlink:href="#E1-MJMAIN-6C" x="6741" y="0"></use>
138 <use xlink:href="#E1-MJMAIN-6F" x="7020" y="0"></use>
139 <use xlink:href="#E1-MJMAIN-63" x="7520" y="0"></use>
140 <use xlink:href="#E1-MJMAIN-6B" x="7965" y="0"></use>
141 <use xlink:href="#E1-MJMAIN-73" x="8743" y="0"></use>
142 <use xlink:href="#E1-MJMAIN-69" x="9138" y="0"></use>
143 <use xlink:href="#E1-MJMAIN-7A" x="9416" y="0"></use>
144 <use xlink:href="#E1-MJMAIN-65" x="9861" y="0"></use>
145</g>
146</g>
147<g transform="translate(0,-676)">
148 <use xlink:href="#E1-MJMAIN-6F"></use>
149 <use xlink:href="#E1-MJMAIN-74" x="500" y="0"></use>
150 <use xlink:href="#E1-MJMAIN-68" x="890" y="0"></use>
151 <use xlink:href="#E1-MJMAIN-65" x="1446" y="0"></use>
152 <use xlink:href="#E1-MJMAIN-72" x="1891" y="0"></use>
153 <use xlink:href="#E1-MJMAIN-77" x="2283" y="0"></use>
154 <use xlink:href="#E1-MJMAIN-69" x="3006" y="0"></use>
155 <use xlink:href="#E1-MJMAIN-73" x="3284" y="0"></use>
156 <use xlink:href="#E1-MJMAIN-65" x="3679" y="0"></use>
157</g>
158</g>
159</g>
160</g>
161</g>
162</g>
163</g>
164</g>
165</svg> \ No newline at end of file
diff --git a/reveal.js/images/cryptographic_primitives/modes_of_operation.png b/reveal.js/images/cryptographic_primitives/modes_of_operation.png
new file mode 100644
index 0000000..d7c9359
--- /dev/null
+++ b/reveal.js/images/cryptographic_primitives/modes_of_operation.png
Binary files differ
diff --git a/reveal.js/images/dataporten/dataporten_the_big_picture1.png b/reveal.js/images/dataporten/dataporten_the_big_picture1.png
deleted file mode 100644
index 436e2a5..0000000
--- a/reveal.js/images/dataporten/dataporten_the_big_picture1.png
+++ /dev/null
Binary files differ
diff --git a/reveal.js/images/dataporten/flow1.png b/reveal.js/images/dataporten/flow1.png
deleted file mode 100644
index 0ae3823..0000000
--- a/reveal.js/images/dataporten/flow1.png
+++ /dev/null
Binary files differ
diff --git a/reveal.js/images/gateway/dashboard01.png b/reveal.js/images/gateway/dashboard01.png
deleted file mode 100644
index 08db6b3..0000000
--- a/reveal.js/images/gateway/dashboard01.png
+++ /dev/null
Binary files differ
diff --git a/reveal.js/images/gateway/portal01.png b/reveal.js/images/gateway/portal01.png
deleted file mode 100644
index 8ffcad5..0000000
--- a/reveal.js/images/gateway/portal01.png
+++ /dev/null
Binary files differ
diff --git a/reveal.js/images/gateway/portal02.png b/reveal.js/images/gateway/portal02.png
deleted file mode 100644
index f60e742..0000000
--- a/reveal.js/images/gateway/portal02.png
+++ /dev/null
Binary files differ
diff --git a/reveal.js/images/mqprod/flow01.png b/reveal.js/images/mqprod/flow01.png
deleted file mode 100644
index 28547fb..0000000
--- a/reveal.js/images/mqprod/flow01.png
+++ /dev/null
Binary files differ
diff --git a/reveal.js/mqprod.html b/reveal.js/mqprod.html
deleted file mode 100644
index 9aef4bc..0000000
--- a/reveal.js/mqprod.html
+++ /dev/null
@@ -1,248 +0,0 @@
1<!doctype html>
2<html lang="en">
3 <head>
4 <meta charset="utf-8">
5 <title>Meldingskø for UiO</title>
6 <meta name="author" content="Kai Vaade, Simeon Simeonov">
7 <meta name="apple-mobile-web-app-capable" content="yes">
8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
9
10 <meta name="viewport" content="width=device-width, initial-scale=1.0">
11
12 <link rel="stylesheet" href="dist/reset.css">
13 <link rel="stylesheet" href="dist/reveal.css">
14 <link rel="stylesheet" href="dist/theme/serif.css" id="theme">
15
16 <!-- Theme used for syntax highlighting of code -->
17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme">
18 </head>
19 <body>
20 <div class="reveal">
21
22 <!-- Any section element inside of this container is displayed as a slide -->
23 <div class="slides">
24 <section>
25 <h2>Meldingskø for UiO</h2>
26 <p>Utviklerforum 14.12.2017</p>
27 <br/>
28 <p>
29 <small>Kai Vaade (KIA), Simeon Simeonov (INT)</small>
30 </p>
31 </section>
32
33 <section>
34 <h2>Agenda</h2>
35 <br/>
36 <ul>
37 <li>Administrasjon</li>
38 <li>Roller og entiteter</li>
39 <li>Flyt</li>
40 <li>Rettigheter</li>
41 <li>Q &amp; A</li>
42 </ul>
43 </section>
44
45 <section>
46 <h2>Generelt</h2>
47 </br>
48 <p>Vi bruker RabbitMQ med AMQP 0.9.1 til å utveksle / behandle meldinger (JSON, <a href="https://tools.ietf.org/html/draft-hunt-idevent-scim-00">SCIM</a>)</p>
49 <p>Bruk av message-broker startet i 2015. I produksjon siden høsten 2017.</p>
50 <p>Driftes av KIA.</p>
51 </section>
52
53 <section>
54 <h2>Administrasjon</h2>
55 <p>Cerebrum har brukt MQ et års tid på egen server satt opp av Seksjon for integrasjon og elektroniske identiteter (USITINT).</p>
56 <p>Nå er driften av tjenesten flyttet fra prosjektet og inn i linja, Gruppe for drift av katalog-, integrasjon- og autentiseringstjenester (KIA).</p>
57 </section>
58
59 <section>
60 <h2>Administrasjon (forts...)</h2>
61 <p>Vi har softlaunchet meldingskø-tjenesten i høst. Tjenesten er ikke "offisielt" lansert, kjører kun våre egne ting (Cerebrum/SAP) foreløpig.</p>
62 <p>Antakelig gjør vi tjenesten kjent samtidig som et annet delprosjekt (API Manager) i UiO INTARK lanseres i nær fremtid.</p>
63 </section>
64
65 <section>
66 <h2>Administrasjon (forts...)</h2>
67 <p>Foreløpig så har vi ikke så veldig mye erfaring med tjenesten i linja.</p>
68 <p>Vi vet heller ikke så mye om behovet; dvs hvor mange som kommer til å bruke tjenesten.</p>
69 </section>
70
71 <section>
72 <h2>Administrasjon (forts...)</h2>
73 <p>Hvordan kontakte oss:</p>
74 <p><a href="https://www.usit.uio.no/om/organisasjon/iti/td/kia/dokumentasjon/meldingsko/" target="_blank">https://www.usit.uio.no/om/organisasjon/iti/td/kia/dokumentasjon/meldingsko/</a></p>
75 <p>Tilgang til grensesnittet: <a href="https://mq.uio.no/">https://mq.uio.no</a></p>
76 </section>
77
78 <section>
79 <h2>Roller og entiteter</h2>
80 <ul>
81 <p>Roller:</p>
82 <li>Administrator / Manager</li>
83 <li>Consumer / Konsument</li>
84 <li>Publisher / Publisist :)</li>
85 <p>Entiteter:</p>
86 <li>vhost</li>
87 <li>Exchange (direct, fanout, topic, ...)</li>
88 <li>Kø (transient, durable)</li>
89 <li>Binding</li>
90 </ul>
91 </section>
92
93 <section>
94 <h2>Flyt</h2>
95 </br>
96 <img src="images/mqprod/flow01.png"></img>
97 </section>
98
99 <section>
100 <h2>Rettigheter</h2>
101 <p>RabbitMQ implementerer 2 rettighetsnivåer: per <em>vhost</em> og per entitet</p>
102 <p>RabbitMQ (AMQP) definerer 3 typer operasjoner:</p>
103 <ul>
104 <li><p><em>configure</em> - opprette / slette entiteter eller endre deres oppførsel</p></li>
105 <li><p><em>write</em> - skrive melding til en entitet</p></li>
106 <li><p><em>read</em> - lese melding fra entitet</p></li>
107 </ul>
108 </section>
109
110 <section>
111 <h2>Rettigheter og brukere</h2>
112 <p>RabbitMQ bruker <em>regular expressions</em> til å definere rettigheter</p>
113 <ul>
114 <li><p><small><em>rabbitmqctl add_user cerebrum &lt;passord&gt;</em></small></p></li>
115 <li><p><small><em>rabbitmqctl add_user uio_ad_microservice &lt;passord&gt;</em></small></p></li>
116 <li><p><small><em>rabbitmqctl set_permissions -p /no/uio/integration cerebrum "^$" "^ex_.*" "^$"</em></small></p></li>
117 <li><p><small><em>rabbitmqctl set_permissions -p /no/uio/integration uio_ad_microservice "^q_ad_ms_.*" "^q_ad_ms_.*" "^(ex_messages|q_ad_ms_.*)$"</em></small></p></li>
118 </ul>
119 </section>
120
121 <section>
122 <h2><em>Routing keys</em> i <em>topic exchange</em></h2>
123 <p><em>Routing key</em> settes av sender som en del av meldingen og blir inspisert av brokeren dersom meldingen sendes til en <em>topic exchange</em>.</p>
124 <p>Strukturen til en topic / message routing key er:</p>
125 <p><small>&lt;kilde&gt;.&lt;type&gt;.&lt;objekt&gt;.&lt;hendelse&gt;</small></p>
126 <p>F.eks.:</p>
127 <p><small>cerebrum.event.person.delete</small></p>
128 </section>
129
130 <section>
131 <h3>Dokumentasjon og lenker</h3>
132 <p>
133 RabbitMQ:
134 </p>
135 <ul>
136 <li>
137 <p>
138 <small>
139 <a href="http://www.rabbitmq.com">http://www.rabbitmq.com</a> - RabbitMQ sin offisielle side
140 </small>
141 </li>
142 <li>
143 <p>
144 <small>
145 <a href="http://www.rabbitmq.com/configure.html">http://www.rabbitmq.com/configure.html</a> - Generell konfigurasjon av RabbitMQ
146 </small>
147 </li>
148 <li>
149 <p>
150 <small>
151 <a href="http://www.rabbitmq.com/management.html">http://www.rabbitmq.com/management.html</a> - Bruk av rabbitmq_management plugin i RabbitMQ
152 </small>
153 </li>
154 <li>
155 <p>
156 <small>
157 <a href="http://www.rabbitmq.com/access-control.html">http://www.rabbitmq.com/access-control.html</a> - Tilgangskontroll i RabbitMQ
158 </small>
159 </li>
160 <li>
161 <p>
162 <small>
163 <a href="http://www.rabbitmq.com/man/rabbitmqctl.1.man.html">http://www.rabbitmq.com/man/rabbitmqctl.1.man.html</a> - rabbitmqctl manual side
164 </small>
165 </li>
166 <li>
167 <p>
168 <small>
169 <a href="http://www.rabbitmq.com/tutorials/amqp-concepts.html">http://www.rabbitmq.com/tutorials/amqp-concepts.html</a> - Generelt om AMQP og forskjellige exchanges
170 </small>
171 </li>
172 </ul>
173 </section>
174
175 <section>
176 <h3>Dokumentasjon og lenker</h3>
177 <p>
178 UiO:
179 </p>
180 <ul>
181 <li>
182 <p>
183 <small>
184 <a href="http://www.usit.uio.no/om/tjenestegrupper/cerebrum/utvikling/dokumentasjon/tools/rabbitmq.html">Installasjon og oppsett av RabbitMQ for Cerebrum utviklere</a>
185 </small>
186 </li>
187 <li>
188 <p>
189 <small>
190 <a href="http://www.usit.uio.no/om/tjenestegrupper/cerebrum/utvikling/aktiviteter/office365-uia/broker/rabbitmq.html">Oppsett av RabbitMQ for Office365 integrasjon mot UiA</a>
191 </small>
192 </li>
193 <li>
194 <p>
195 <small>
196 <a href="https://www.usit.uio.no/om/organisasjon/uav/usitint/interndokumentasjon/integrasjon/broker/utredning-meldingsflyt.html">Utredning: Meldingsflyt, kø-struktur og navngiving</a> (intern)
197 </small>
198 </li>
199 </ul>
200 <p>
201 Bøker:
202 </p>
203 <ul>
204 <li>
205 <p>
206 <small>
207 RabbitMQ in action - Alvaro Videla / Jason J.W. Williams - 2012 - Manning
208 </small>
209 </li>
210 <li>
211 <p>
212 <small>
213 Mastering RabbitMQ - Ayanoglu / Aytas / Nahum - 2015 - PACKT Publishing
214 </small>
215 </li>
216 </section>
217
218 <section>
219 <h1>Q &amp; A</h1>
220 </section>
221
222 </div>
223 </div>
224
225 <script src="dist/reveal.js"></script>
226 <script src="plugin/zoom/zoom.js"></script>
227 <script src="plugin/notes/notes.js"></script>
228 <script src="plugin/search/search.js"></script>
229 <script src="plugin/markdown/markdown.js"></script>
230 <script src="plugin/highlight/highlight.js"></script>
231 <script>
232
233 // Also available as an ES module, see:
234 // https://revealjs.com/initialization/
235 Reveal.initialize({
236 controls: true,
237 progress: true,
238 center: true,
239 hash: true,
240
241 // Learn about plugins: https://revealjs.com/plugins/
242 plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ]
243 });
244
245 </script>
246
247 </body>
248</html>
diff --git a/reveal.js/postgresql_tuning.html b/reveal.js/postgresql_tuning.html
index 8678513..fb316ff 100644
--- a/reveal.js/postgresql_tuning.html
+++ b/reveal.js/postgresql_tuning.html
@@ -1,151 +1,155 @@
1<!doctype html> 1<!DOCTYPE html>
2<html lang="en"> 2<html lang="en">
3 <head> 3 <head>
4 <meta charset="utf-8"> 4 <meta charset="utf-8" />
5 <title>SQLAlchemy</title> 5 <title>Introduction to cryptographic primitives</title>
6 <meta name="author" content="Simeon Simeonov"> 6 <meta name="author" content="Simeon Simeonov"/>
7 <meta name="apple-mobile-web-app-capable" content="yes"> 7 <meta name="mobile-web-app-capable" content="yes"/>
8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 8 <meta name="mobile-web-app-status-bar-style" content="black-translucent"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
10 10
11 <link rel="stylesheet" href="dist/reset.css"> 11 <link rel="stylesheet" href="dist/reset.css"/>
12 <link rel="stylesheet" href="dist/reveal.css"> 12 <link rel="stylesheet" href="dist/reveal.css"/>
13 13
14 <link rel="stylesheet" href="dist/theme/fifty.css" id="theme"> 14 <!-- <link rel="stylesheet" href="dist/theme/black.css" id="theme"/> -->
15 <link rel="stylesheet" href="dist/theme/statnett.css" id="theme"/>
15 16
16 <!-- Theme used for syntax highlighting of code --> 17 <!-- Theme used for syntax highlighting of code -->
17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"> 18 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"/>
18 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"> --> 19 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"/> -->
19 </head> 20 </head>
20 <body>
21 <div class="reveal">
22 21
23 <!-- Any section element inside of this container is displayed as a slide --> 22 <body>
24 <div class="slides"> 23 <div class="reveal">
24 <!-- Any section element inside of this container is displayed as a slide -->
25 <div class="slides">
25 26
26 <section> 27 <section>
27 <h2>PostgreSQL tuning</h2> 28 <h2>PostgreSQL tuning</h2>
28 <h4>Data Science @ Beryl</h4> 29 <h4>Data Science @ Beryl</h4>
29 </br> 30 </br>
30 <p><small>Simeon Simeonov</small></p> 31 <p><small>Simeon Simeonov</small></p>
31 </section> 32 </section>
32 33
33 <section> 34 <section>
34 35
35 <section id="fragments"> 36 <section id="fragments">
36 <h2>Agenda</h2> 37 <h2>Agenda</h2>
37 </br> 38 </br>
38 <ul> 39 <ul>
39 <span class="fragment"><li>Generic tools for gathering information</li></span> 40 <span class="fragment"><li>Generic tools for gathering information</li></span>
40 <span class="fragment"><li>Memory settings</li></span> 41 <span class="fragment"><li>Memory settings</li></span>
41 <span class="fragment"><li>Logging and performance reports</li></span> 42 <span class="fragment"><li>Logging and performance reports</li></span>
42 <span class="fragment"><li>Other tools for analysis</li></span> 43 <span class="fragment"><li>Other tools for analysis</li></span>
43 </ul> 44 </ul>
44 </section> 45 </section>
45 46
46 </section> 47 </section>
47 48
48 <section> 49 <section>
49 <h2>General tools for gathering information</h2> 50 <h2>General tools for gathering information</h2>
50 </br> 51 </br>
51 <pre data-id="code-animation"> 52 <pre data-id="code-animation">
52 <code class="bash" data-trim type="text/template"> 53 <code class="bash" data-trim type="text/template">
53 # shell 54 # shell
54 # fetch information from the OS 55 # fetch information from the OS
55 cat /proc/cpuinfo 56 cat /proc/cpuinfo
56 cat /proc/meminfo 57 cat /proc/meminfo
57 sysctl -a | grep shm # get kernel parameters of interest 58 sysctl -a | grep shm # get kernel parameters of interest
58 </code> 59 </code>
59 <code class="sql" data-trim type="text/template"> 60 <code class="sql" data-trim type="text/template">
60 -- SQL 61 -- SQL
61 -- show the current values of all settings 62 -- show the current values of all settings
62 SHOW ALL; 63 SHOW ALL;
63 64
64 -- display even more than all... 65 -- display even more than all...
65 SELECT * FROM pg_settings; 66 SELECT * FROM pg_settings;
66 67
67 -- opening postgresql.conf and reading the comments - the old school approach 68 -- opening postgresql.conf and reading the comments - the old school approach
68 </code> 69 </code>
69 <code class="bash" data-trim type="text/template"> 70 <code class="bash" data-trim type="text/template">
70 # old school: edit postgresql.conf and read the comments 71 # old school: edit postgresql.conf and read the comments
71 </code> 72 </code>
72 </pre> 73 </pre>
73 </section> 74 </section>
74 75
75 <section> 76 <section>
76 <h2>Memory settings</h2> 77 <h2>Memory settings</h2>
77 </br> 78 </br>
78 <ul> 79 <ul>
79 <li><em>shared_buffers</em> - how much memory is dedicated to PostgreSQL to use for caching data - for a system with 1GB or more of RAM, a reasonable starting value for <em>shared_buffers</em> is 25% of the system memory (128MB -> 1GB)</li> 80 <li><em>shared_buffers</em> - how much memory is dedicated to PostgreSQL to use for caching data - for a system with 1GB or more of RAM, a reasonable starting value for <em>shared_buffers</em> is 25% of the system memory (128MB -> 1GB)</li>
80 <li><em>effective_cache_size</em> - how much memory we expect to be available in the OS and PostgreSQL buffer caches, not an allocation - used only by the PostgreSQL query planner to figure out whether plans it's considering would be expected to fit in RAM or not - 1/2 of total memory would be a normal conservative setting (4GB -> 8GB)</li> 81 <li><em>effective_cache_size</em> - how much memory we expect to be available in the OS and PostgreSQL buffer caches, not an allocation - used only by the PostgreSQL query planner to figure out whether plans it's considering would be expected to fit in RAM or not - 1/2 of total memory would be a normal conservative setting (4GB -> 8GB)</li>
81 <li><em>work_mem</em> - the base maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files - for a complex query, several sort or hash operations might be running in parallel; each operation will generally be allowed to use as much memory as this value specifies (4MB -> 8MB)</li> 82 <li><em>work_mem</em> - the base maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files - for a complex query, several sort or hash operations might be running in parallel; each operation will generally be allowed to use as much memory as this value specifies (4MB -> 8MB)</li>
82 <li><em>maintenance_work_mem</em> - the maximum amount of memory to be used by maintenance operations, such as <em>VACUUM</em> and <em>CREATE INDEX</em>. It's safe to set this value significantly larger than <em>work_mem</em> (64MB -> 256MB)</li> 83 <li><em>maintenance_work_mem</em> - the maximum amount of memory to be used by maintenance operations, such as <em>VACUUM</em> and <em>CREATE INDEX</em>. It's safe to set this value significantly larger than <em>work_mem</em> (64MB -> 256MB)</li>
83 </ul> 84 </ul>
84 </section> 85 </section>
85 86
86 <section> 87 <section>
87 <h2>Logging and performance reports</h2> 88 <h2>Logging and performance reports</h2>
88 </br> 89 </br>
89 <p><em>pgBadger - a fast PostgreSQL log analysis report</em> can be used for general analysis.</p> 90 <p><em>pgBadger - a fast PostgreSQL log analysis report</em> can be used for general analysis.</p>
90 <ul> 91 <ul>
91 <li><em>log_checkpoints</em> - checkpoints and restartpoints are logged in the server log. Some statistics are included in the log messages, including the number of buffers written and the time spent writing them</li> 92 <li><em>log_checkpoints</em> - checkpoints and restartpoints are logged in the server log. Some statistics are included in the log messages, including the number of buffers written and the time spent writing them</li>
92 <li><em>log_connections</em> - each attempted connection to the server to be logged, as well as successful completion of client authentication</li> 93 <li><em>log_connections</em> - each attempted connection to the server to be logged, as well as successful completion of client authentication</li>
93 <li><em>log_disconnections</em> - provides information similar to <em>log_connections</em>, plus the duration of the session</li> 94 <li><em>log_disconnections</em> - provides information similar to <em>log_connections</em>, plus the duration of the session</li>
94 <li><em>log_line_prefix</em> - set to '%t [%p]: user=%u,db=%d,app=%a,client=%h '</li> 95 <li><em>log_line_prefix</em> - set to '%t [%p]: user=%u,db=%d,app=%a,client=%h '</li>
95 <li><em>log_lock_waits</em> - log message is produced when a session waits longer than deadlock_timeout to acquire a lock. This is useful in determining if lock waits are causing poor performance</li> 96 <li><em>log_lock_waits</em> - log message is produced when a session waits longer than deadlock_timeout to acquire a lock. This is useful in determining if lock waits are causing poor performance</li>
96 <li><em>log_temp_files</em> - when set to <em>0</em>, a log entry is emitted for each temporary file when it is deleted</li> 97 <li><em>log_temp_files</em> - when set to <em>0</em>, a log entry is emitted for each temporary file when it is deleted</li>
97 <li><em>log_autovacuum_min_duration</em> - set to <em>0</em> it logs all autovacuum actions</li> 98 <li><em>log_autovacuum_min_duration</em> - set to <em>0</em> it logs all autovacuum actions</li>
98 </ul> 99 </ul>
99 </section> 100 </section>
100 101
101 <section> 102 <section>
102 <h2>Other tools for analysis</h2> 103 <h2>Other tools for analysis</h2>
103 </br> 104 </br>
104 <ul> 105 <ul>
105 <li><em>ANALYZE</em> - collects statistics about the contents of tables in the database, and stores the results in the pg_statistic system catalog. Subsequently, the query planner uses these statistics to help determine the most efficient execution plans for queries.</li> 106 <li><em>ANALYZE</em> - collects statistics about the contents of tables in the database, and stores the results in the pg_statistic system catalog. Subsequently, the query planner uses these statistics to help determine the most efficient execution plans for queries.</li>
106 <li><em>VACUUM</em> - reclaims storage occupied by dead tuples. In normal PostgreSQL operation, tuples that are deleted or obsoleted by an update are not physically removed from their table; they remain present until a VACUUM is done. (<em>VACUUM</em> vs. <em>VACUUM FULL</em>)</li> 107 <li><em>VACUUM</em> - reclaims storage occupied by dead tuples. In normal PostgreSQL operation, tuples that are deleted or obsoleted by an update are not physically removed from their table; they remain present until a VACUUM is done. (<em>VACUUM</em> vs. <em>VACUUM FULL</em>)</li>
107 </ul> 108 </ul>
108 </section> 109 </section>
109 110
110 <section> 111 <section>
111 <h2>Sources</h2> 112 <h2>Sources</h2>
112 </br> 113 </br>
113 <p> 114 <p>
114 <a href="https://www.postgresql.org/docs/">https://www.postgresql.org/docs/</a> - The official documentation 115 <a href="https://www.postgresql.org/docs/">https://www.postgresql.org/docs/</a> - The official documentation
115 </p> 116 </p>
116 <p> 117 <p>
117 <a href="https://wiki.postgresql.org">https://wiki.postgresql.org</a> - The official Wiki 118 <a href="https://wiki.postgresql.org">https://wiki.postgresql.org</a> - The official Wiki
118 </p> 119 </p>
119 </section> 120 </section>
120
121 <section>
122 <h1>Q &amp; A</h1>
123 </section>
124
125 </div>
126 </div>
127 121
128 <script src="dist/reveal.js"></script> 122 <section>
129 <script src="plugin/zoom/zoom.js"></script> 123 <h1>Q &amp; A</h1>
130 <script src="plugin/notes/notes.js"></script> 124 </section>
131 <script src="plugin/search/search.js"></script>
132 <script src="plugin/markdown/markdown.js"></script>
133 <script src="plugin/highlight/highlight.js"></script>
134 <script>
135 125
136 // Also available as an ES module, see: 126 </div>
137 // https://revealjs.com/initialization/ 127 </div>
138 Reveal.initialize({
139 controls: true,
140 progress: true,
141 center: true,
142 hash: true,
143 128
144 // Learn about plugins: https://revealjs.com/plugins/ 129 <script src="dist/reveal.js"></script>
145 plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ] 130 <script src="dist/plugin/zoom.js"></script>
146 }); 131 <script src="dist/plugin/notes.js"></script>
132 <script src="dist/plugin/search.js"></script>
133 <script src="dist/plugin/markdown.js"></script>
134 <script src="dist/plugin/highlight.js"></script>
135 <script>
136 // Also available as an ES module, see: https://revealjs.com/initialization/
137 // import Reveal from 'reveal.js';
138 // import RevealZoom from 'reveal.js/plugin/zoom';
139 // import RevealNotes from 'reveal.js/plugin/notes';
140 // import RevealSearch from 'reveal.js/plugin/search';
141 // import RevealMarkdown from 'reveal.js/plugin/markdown';
142 // import RevealHighlight from 'reveal.js/plugin/highlight';
147 143
148 </script> 144 Reveal.initialize({
145 controls: true,
146 progress: true,
147 center: true,
148 hash: true,
149 149
150 </body> 150 // Learn about plugins: https://revealjs.com/plugins/
151 plugins: [RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight],
152 });
153 </script>
154 </body>
151</html> 155</html>
diff --git a/reveal.js/rabbitmq.html b/reveal.js/rabbitmq.html
deleted file mode 100644
index 6d1ba7a..0000000
--- a/reveal.js/rabbitmq.html
+++ /dev/null
@@ -1,311 +0,0 @@
1<!doctype html>
2<html lang="en">
3 <head>
4 <meta charset="utf-8">
5 <title>RabbitMQ - Intern opplæring</title>
6 <meta name="author" content="Simeon Simeonov">
7 <meta name="apple-mobile-web-app-capable" content="yes">
8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
9 <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
11 <link rel="stylesheet" href="dist/reset.css">
12 <link rel="stylesheet" href="dist/reveal.css">
13
14 <link rel="stylesheet" href="dist/theme/serif.css" id="theme">
15
16 <!-- Theme used for syntax highlighting of code -->
17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme">
18 </head>
19 <body>
20 <div class="reveal">
21
22 <!-- Any section element inside of this container is displayed as a slide -->
23 <div class="slides">
24 <section>
25 <h1>RabbitMQ</h1>
26 <h3>Intern opplæring</h3>
27 </br>
28 <p>
29 <small>Simeon Simeonov</small>
30 </p>
31 </section>
32
33 <section>
34 <section id="fragments">
35 <h2>Agenda</h2>
36 </br>
37 <ul>
38 <span class="fragment"><li>Installasjon</li></span>
39 <span class="fragment"><li>Administrasjon</li></span>
40 <span class="fragment"><li>Utvikling</li></span>
41 <span class="fragment"><li>Diverse + Q&A</li></span>
42 </ul>
43 </section>
44 </section>
45
46 <section>
47 <section>
48 <h2>Installasjon og oppsett</h2>
49 </br>
50 <ul>
51 <li><p>Skaffe seg maskin og SSL sertifikat(er)</p></li>
52 <li><p>Bruke Ansible</p></li>
53 <li><p>Opprette administrator-bruker og slette guest-brukeren</p></li>
54 <li><p>Sette rettigheter og opprette entiteter</p></li>
55 </ul>
56 </section>
57 <section>
58 <h2>Ansible</h2>
59 </br>
60 <p>Vi bruker repo <em>UAIT/int-ansible-hosts</em></p>
61 <p>Etter å ha installert Ansible på lokalmaskina gjør vi følgende:</p>
62 <ul>
63 <li><p><small><em>git clone ssh://git@bitbucket.usit.uio.no:7999/uait/int-ansible-hosts.git</em></small></p></li>
64 <li><p><small><em>cd int-ansible-hosts</em></small></p></li>
65 <li><p><small><em>ansible-playbook --ask-become-pass -v --extra-vars '{"hosts": "mq-hostname"}' rabbitmq_playbook.yml</em></small></p></li>
66 </ul>
67 <p>RabbitMQ skal nå være installert og tilgjengelig på <em>https://mq-hostname</em></p>
68 </section>
69
70 <section>
71 <h2>Administrator-bruker</h2>
72 </br>
73 <p>Brukeren <em>guest</em> med passord <em>guest</em> vil eksistere etter at Ansible har kjørt</p>
74 <p>I tillegg til webgrensesnittet, kan en bruke <em>rabbitmqctl</em></p>
75 <ul>
76 <li><p><small><em>rabbitmqctl list_users</em> (Lister alle eksisterende RabbitMQ-brukere)</small></p></li>
77 <li><p><small><em>rabbitmqctl add_user rmq_admin &lt;passord&gt;</em> (Legger til dedikert admin bruker <em>rmq_admin</em>)</small></p></li>
78 <li><p><small><em>rabbitmqctl set_user_tags rmq_admin administrator</em> (Gir administrator rolle til <em>rmq_admin</em>)</small></p></li>
79 <li><p><small><em>rabbitmqctl delete_user guest</em> (Sletter brukeren <em>guest</em>)</small></p></li>
80 </ul>
81 </section>
82
83 <section>
84 <h2><em>vhost</em></h2>
85 </br>
86 <p><em>vhost</em> fungerer som en beholder (container) for RabbitMQ/AMQP objekter. Nok igjen kan en velge mellom webgrensesnitt og <em>rabbitmqctl</em></p>
87 <ul>
88 <li><p><small><em>rabbitmqctl list_vhosts</em> (Lister alle eksisterende vhosts)</small></p></li>
89 <li><p><small><em>rabbitmqctl add_vhost /no/uio/integration</em> (Oppretter <em>vhost</em> med navn <em>/no/uio/integration</em>)</small></p></li>
90 </ul>
91 </section>
92
93 <section>
94 <h2>Rettigheter</h2>
95 <p>RabbitMQ implementerer 2 rettighetsnivåer(*):</p>
96 <ul>
97 <li>Per <em>vhost</em></li>
98 <li>Per entitet</li>
99 </ul>
100 <p>RabbitMQ definerer 3 typer operasjoner:</p>
101 <ul>
102 <li><p><em>configure</em> - opprette / slette entiteter eller endre deres oppførsel</p></li>
103 <li><p><em>write</em> - skrive melding til en entitet</p></li>
104 <li><p><em>read</em> - lese melding fra entitet</p></li>
105 </ul>
106 <p><small>(*) - <em>/etc/rabbitmq/rabbitmq.config</em> gir flere muligheter</small></p>
107 </section>
108
109 <section>
110 <h2>Rettigheter og brukere</h2>
111 <p>RabbitMQ bruker <em>regular expressions</em> til å definere rettigheter</p>
112 <ul>
113 <li><p><small><em>rabbitmqctl add_user cerebrum &lt;passord&gt;</em></small></p></li>
114 <li><p><small><em>rabbitmqctl add_user uio_ad_microservice &lt;passord&gt;</em></small></p></li>
115 <li><p><small><em>rabbitmqctl set_permissions -p /no/uio/integration cerebrum "^$" "^ex_.*" "^$"</em></small></p></li>
116 <li><p><small><em>rabbitmqctl set_permissions -p /no/uio/integration uio_ad_microservice "^q_ad_ms_.*" "^q_ad_ms_.*" "^(ex_messages|q_ad_ms_.*)$"</em></small></p></li>
117 </ul>
118 </section>
119
120 <section>
121 <h2>Køer</h2>
122 <p>Køer defineres som <em>durable</em> ved hjelp av webgrensesnittet.</p>
123 <p>"Alle køer (både forhåndsdefinerte og de som defineres av konsument) må ha navn som starter med <em>q_</em>. Køen vil ha navn som uttryker mottakeren som bruker den."</p>
124 <p>F.eks. <em>q_ad_ms_all</em> vil være et passende navn for køen som brukes av AD-microservice mottakeren.</p>
125 </section>
126
127 <section>
128 <h2><em>Exchange</em></h2>
129 <p>"Avsendere vil vanligvis sende meldinger til exchange <em>ex_messages</em>."</p>
130 <p>Det er flere typer <em>exchange</em>, men vi vil bruke kun <em>topic exchange</em>.</p>
131 </section>
132 </section>
133
134 <section>
135 <section>
136 <h2>Utvikling</h2>
137 </br>
138 <ul>
139 <li><p><em>Routing keys</em> i <em>topic exchange</em></p></li>
140 <li><p>Bindinger</p></li>
141 <li><p>Protokoller og porter</p></li>
142 <li><p>Eksempler</p></li>
143 </ul>
144 </section>
145
146 <section>
147 <h2><em>Routing keys</em> i <em>topic exchange</em></h2>
148 </br>
149 <p><em>Routing key</em> settes av sender som en del av meldingen og blir inspisert av brokeren dersom meldingen sendes til en <em>topic exchange</em>.</p>
150 <p>Strukturen til en topic / message routing key er:</p>
151 <p><small>&lt;kilde&gt;.&lt;type&gt;.&lt;objekt&gt;.&lt;hendelse&gt;</small></p>
152 <p>F.eks.:</p>
153 <p><small>cerebrum.event.person.delete</small></p>
154 </section>
155
156 <section>
157 <h2>Bindinger</h2>
158 <p>For at en melding sendt til en <em>topic exchange</em> skal havne i en bestemt kø, må køen være bundet (<em>bound</em>) til <em>exchange</em>.</p>
159 <p>I <em>topic exchange</em> brukes <em>routing key</em> (<em>topic</em>) til å avgjøre hvilke av meldingene som blir sendt vil havne i køen som er bundet.</p>
160 <p>Dersom vi binder køen <em>q_ad_ms_all</em> til <em>topic exchange</em> <em>ex_messages</em> med <em>binding key</em> <em>cerebrum.event.account.*</em> vil alle meldinger som blir sendt til <em>ex_messages</em> med topic som starter med <em>cerebrum.event.account.</em> havne i <em>q_ad_ms_all</em>.</p>
161 <p>En kø kan bli bundet med én eller flere nøkler til en <em>topic exchange</em>.</p>
162 </section>
163
164 <section>
165 <h2>Protokoller og porter</h2>
166 </br>
167 <p>"AMQP 0.9.1 prioritert siden det er protokollen som mapper best mot RabbitMQs funksjonalitet. Vi har også noe erfaring med bruk av denne."</p>
168 <p>RabbitMQ lytter for AMQP0.9.1 på SSL port <em>5671</em>.</p>
169 </br>
170 <p>Andre protokoller og tjenester for RabbitMQ:</p>
171 <ul>
172 <li>STOMP - 61614 (SSL)</li>
173 <li>RabbitMQ Management (webgrensesnitt) - 15671 (SSL)</li>
174 </ul>
175 </section>
176
177 <section>
178 <h2>Eksempler</h2>
179 </br>
180 <pre>
181 <code class="hljs" data-trim contenteditable>
182 $ pip install pika
183 </code>
184 </pre>
185 <p>Python:</p>
186 <p>"Well, we'll not risk another frontal assault. That rabbit's dynamite...."</p>
187 </section>
188
189 </section>
190
191 <section>
192 <section>
193 <h2>Dokumentasjon og lenker</h2>
194 </br>
195 <p>
196 RabbitMQ:
197 </p>
198 <ul>
199 <li>
200 <p>
201 <small>
202 <a href="http://www.rabbitmq.com">http://www.rabbitmq.com</a> - RabbitMQ sin offisielle side
203 </small>
204 </li>
205 <li>
206 <p>
207 <small>
208 <a href="http://www.rabbitmq.com/configure.html">http://www.rabbitmq.com/configure.html</a> - Generell konfigurasjon av RabbitMQ
209 </small>
210 </li>
211 <li>
212 <p>
213 <small>
214 <a href="http://www.rabbitmq.com/management.html">http://www.rabbitmq.com/management.html</a> - Bruk av rabbitmq_management plugin i RabbitMQ
215 </small>
216 </li>
217 <li>
218 <p>
219 <small>
220 <a href="http://www.rabbitmq.com/access-control.html">http://www.rabbitmq.com/access-control.html</a> - Tilgangskontroll i RabbitMQ
221 </small>
222 </li>
223 <li>
224 <p>
225 <small>
226 <a href="http://www.rabbitmq.com/man/rabbitmqctl.1.man.html">http://www.rabbitmq.com/man/rabbitmqctl.1.man.html</a> - rabbitmqctl manual side
227 </small>
228 </li>
229 <li>
230 <p>
231 <small>
232 <a href="http://www.rabbitmq.com/tutorials/amqp-concepts.html">http://www.rabbitmq.com/tutorials/amqp-concepts.html</a> - Generelt om AMQP og forskjellige exchanges
233 </small>
234 </li>
235 </ul>
236 </section>
237 <section>
238 <h2>Dokumentasjon og lenker</h2>
239 <p>
240 UiO:
241 </p>
242 <ul>
243 <li>
244 <p>
245 <small>
246 <a href="http://www.usit.uio.no/om/tjenestegrupper/cerebrum/utvikling/dokumentasjon/tools/rabbitmq.html">Installasjon og oppsett av RabbitMQ for Cerebrum utviklere</a>
247 </small>
248 </li>
249 <li>
250 <p>
251 <small>
252 <a href="http://www.usit.uio.no/om/tjenestegrupper/cerebrum/utvikling/aktiviteter/office365-uia/broker/rabbitmq.html">Oppsett av RabbitMQ for Office365 integrasjon mot UiA</a>
253 </small>
254 </li>
255 <li>
256 <p>
257 <small>
258 <a href="https://www.usit.uio.no/om/organisasjon/uav/usitint/interndokumentasjon/integrasjon/broker/utredning-meldingsflyt.html">Utredning: Meldingsflyt, kø-struktur og navngiving</a> (intern)
259 </small>
260 </li>
261 </ul>
262 <p>
263 Bøker:
264 </p>
265 <ul>
266 <li>
267 <p>
268 <small>
269 RabbitMQ in action - Alvaro Videla / Jason J.W. Williams - 2012 - Manning
270 </small>
271 </li>
272 <li>
273 <p>
274 <small>
275 Mastering RabbitMQ - Ayanoglu / Aytas / Nahum - 2015 - PACKT Publishing
276 </small>
277 </li>
278 </section>
279 </section>
280
281 <section>
282 <h1>Q&A</h1>
283 </section>
284
285 </div>
286 </div>
287
288 <script src="dist/reveal.js"></script>
289 <script src="plugin/zoom/zoom.js"></script>
290 <script src="plugin/notes/notes.js"></script>
291 <script src="plugin/search/search.js"></script>
292 <script src="plugin/markdown/markdown.js"></script>
293 <script src="plugin/highlight/highlight.js"></script>
294 <script>
295
296 // Also available as an ES module, see:
297 // https://revealjs.com/initialization/
298 Reveal.initialize({
299 controls: true,
300 progress: true,
301 center: true,
302 hash: true,
303
304 // Learn about plugins: https://revealjs.com/plugins/
305 plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ]
306 });
307
308 </script>
309
310 </body>
311</html>
diff --git a/reveal.js/sqlalchemy.html b/reveal.js/sqlalchemy.html
index a0d6617..5dfae21 100644
--- a/reveal.js/sqlalchemy.html
+++ b/reveal.js/sqlalchemy.html
@@ -1,477 +1,480 @@
1<!doctype html> 1<!DOCTYPE html>
2<html lang="en"> 2<html lang="en">
3 <head> 3 <head>
4 <meta charset="utf-8"> 4 <meta charset="utf-8" />
5 <title>SQLAlchemy</title> 5 <title>SQLAlchemy</title>
6 <meta name="author" content="Simeon Simeonov"> 6 <meta name="author" content="Simeon Simeonov"/>
7 <meta name="apple-mobile-web-app-capable" content="yes"> 7 <meta name="mobile-web-app-capable" content="yes"/>
8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 8 <meta name="mobile-web-app-status-bar-style" content="black-translucent"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
10 10
11 <link rel="stylesheet" href="dist/reset.css"> 11 <link rel="stylesheet" href="dist/reset.css"/>
12 <link rel="stylesheet" href="dist/reveal.css"> 12 <link rel="stylesheet" href="dist/reveal.css"/>
13 13
14 <link rel="stylesheet" href="dist/theme/statnett.css" id="theme"> 14 <!-- <link rel="stylesheet" href="dist/theme/black.css" id="theme"/> -->
15 <link rel="stylesheet" href="dist/theme/statnett.css" id="theme"/>
15 16
16 <!-- Theme used for syntax highlighting of code --> 17 <!-- Theme used for syntax highlighting of code -->
17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"> 18 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"/>
18 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"> --> 19 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"/> -->
19 </head> 20 </head>
20 <body>
21 <div class="reveal">
22 21
23 <!-- Any section element inside of this container is displayed as a slide --> 22 <body>
24 <div class="slides"> 23 <div class="reveal">
24 <!-- Any section element inside of this container is displayed as a slide -->
25 <div class="slides">
25 26
26 <section> 27 <section>
27 <h2>SQLAlchemy</h2> 28 <h2>SQLAlchemy</h2>
28 <h4>Data Engineering @ Statnett</h4> 29 <h4>Data Engineering @ Statnett</h4>
29 </br> 30 </br>
30 <p><small>Simeon Simeonov</small></p> 31 <p><small>Simeon Simeonov</small></p>
31 </section> 32 </section>
32 33
33 <section> 34 <section>
34 35
35 <section id="fragments"> 36 <section id="fragments">
36 <h2>Agenda</h2> 37 <h2>Agenda</h2>
37 </br> 38 </br>
38 <ul> 39 <ul>
39 <span class="fragment"><li>SQLAlchemy - Design & overview</li></span> 40 <span class="fragment"><li>SQLAlchemy - Design & overview</li></span>
40 <span class="fragment"><li>SQLAlchemy - A small practical example</li></span> 41 <span class="fragment"><li>SQLAlchemy - A small practical example</li></span>
41 <span class="fragment"><li>Q &amp; A</li></span> 42 <span class="fragment"><li>Q &amp; A</li></span>
42 </ul> 43 </ul>
43 </section> 44 </section>
44 45
45 </section> 46 </section>
46 47
47 <section> 48 <section>
48 <h2>What is SQLAlchemy?</h2> 49 <h2>What is SQLAlchemy?</h2>
49 </br> 50 </br>
50 <p><em>SQLAlchemy</em> is a Python library created by Mike Bayer to provide a high-level Pythonic interface to RDBMS such as <em>PostgreSQL</em>, <em>SQLite</em>, <em>MySQL</em>, <em>Oracle</em>, <em>DB2</em>.</p> 51 <p><em>SQLAlchemy</em> is a Python library created by Mike Bayer to provide a high-level Pythonic interface to RDBMS such as <em>PostgreSQL</em>, <em>SQLite</em>, <em>MySQL</em>, <em>Oracle</em>, <em>DB2</em>.</p>
51 <p><em>SQLAlchemy</em> includes RDBMS-independent <em>SQL expression language</em> and an <em>object-relational mapper (ORM)</em>.</p> 52 <p><em>SQLAlchemy</em> includes RDBMS-independent <em>SQL expression language</em> and an <em>object-relational mapper (ORM)</em>.</p>
52 </section> 53 </section>
53 54
54 <section> 55 <section>
55 <h2>Why use SQLAlchemy?</h2> 56 <h2>Why use SQLAlchemy?</h2>
56 </br> 57 </br>
57 <ul> 58 <ul>
58 <li><p>free software - free as in "freedom" (MIT licensed)</p></li> 59 <li><p>free software - free as in "freedom" (MIT licensed)</p></li>
59 <li><p>portability - the programming interface is independent of the type of RDBMS and connector used</p></li> 60 <li><p>portability - the programming interface is independent of the type of RDBMS and connector used</p></li>
60 <li><p>security - no more SQL injections</p></li> 61 <li><p>security - no more SQL injections</p></li>
61 <li><p>abstraction - no need to bother with complex JOINs</p></li> 62 <li><p>abstraction - no need to bother with complex JOINs</p></li>
62 <li><p>object-orientation - you work with objects instead of tables and rows</p></li> 63 <li><p>object-orientation - you work with objects instead of tables and rows</p></li>
63 <li><p>performance - exploits the likehood of reusing a particular query</p></li> 64 <li><p>performance - exploits the likehood of reusing a particular query</p></li>
64 <li><p>flexibility - you can override almost anything</p></li> 65 <li><p>flexibility - you can override almost anything</p></li>
65 </ul> 66 </ul>
66 </section> 67 </section>
67 68
68 <section> 69 <section>
69 <h2>Basic architecture</h2> 70 <h2>Basic architecture</h2>
70 <p><em>SQLAlchemy</em> consists of several components, including the <em>ORM</em>.</p> 71 <p><em>SQLAlchemy</em> consists of several components, including the <em>ORM</em>.</p>
71 <ul> 72 <ul>
72 <li><em>Engine</em>- manages the connection pool and the RDBMS-independent SQL dialect layer</li> 73 <li><em>Engine</em>- manages the connection pool and the RDBMS-independent SQL dialect layer</li>
73 <li><em>MetaData</em> - used to collect and organize information about your table layout (schema)</li> 74 <li><em>MetaData</em> - used to collect and organize information about your table layout (schema)</li>
74 <li><em>SQL expression language</em> - provides an API to execute your queries and updates against your tables, all from Python, and all in a database-independent way (low-level interface)</li> 75 <li><em>SQL expression language</em> - provides an API to execute your queries and updates against your tables, all from Python, and all in a database-independent way (low-level interface)</li>
75 <li><em>ORM</em> - provides a convenient way to add database persistence to your Python objects without requiring you to design your objects around the database, or the database around the objects (high-level interface)</li> 76 <li><em>ORM</em> - provides a convenient way to add database persistence to your Python objects without requiring you to design your objects around the database, or the database around the objects (high-level interface)</li>
76 <li><em>Session</em> - establishes all conversations with the RDBMS and represents a "holding zone" for all the objects which you've loaded or associated with it during its lifespan</li> 77 <li><em>Session</em> - establishes all conversations with the RDBMS and represents a "holding zone" for all the objects which you've loaded or associated with it during its lifespan</li>
77 </ul> 78 </ul>
78 <img src="images/sqlalchemy/sqla_arch.png"></img> 79 <img src="images/sqlalchemy/sqla_arch.png"></img>
79 </section> 80 </section>
80
81 <section data-auto-animate>
82 <h3>Example</h3>
83 <p><em>SQLAlchemy</em> gives us the choice between <em>classical mapping</em> and the newer <em>declarative mapping</em></p>
84 <pre id="smallertext" data-id="code-animation">
85 <code class="python" data-trim data-line-numbers type="text/template">
86 # option 1: classical mapping
87 # explicitly defining Table objects and mapping them to pure Python base classes
88 from sqlalchemy import create_engine
89 81
90 # engine = create_engine("postgresql+psycopg2://user:zipassword@localhost/mydb" , echo=True) 82 <section data-auto-animate>
91 # The string form of the URL is dialect+driver://user:password@host/dbname[?key=value..], 83 <h3>Example</h3>
92 # engine = create_engine("sqlite:///library.db", echo=True) 84 <p><em>SQLAlchemy</em> gives us the choice between <em>classical mapping</em> and the newer <em>declarative mapping</em></p>
93 engine = create_engine("sqlite:///:memory:", echo=True) 85 <pre id="smallertext" data-id="code-animation">
86 <code class="python" data-trim data-line-numbers type="text/template">
87 # option 1: classical mapping
88 # explicitly defining Table objects and mapping them to pure Python base classes
89 from sqlalchemy import create_engine
94 90
95 from sqlalchemy import Column, MetaData, Table 91 # engine = create_engine("postgresql+psycopg2://user:zipassword@localhost/mydb" , echo=True)
96 from sqlalchemy import DateTime, ForeignKey, Integer, Numeric, String 92 # The string form of the URL is dialect+driver://user:password@host/dbname[?key=value..],
93 # engine = create_engine("sqlite:///library.db", echo=True)
94 engine = create_engine("sqlite:///:memory:", echo=True)
97 95
98 metadata = MetaData() 96 from sqlalchemy import Column, MetaData, Table
97 from sqlalchemy import DateTime, ForeignKey, Integer, Numeric, String
99 98
100 production_types_table = Table( 99 metadata = MetaData()
101 "production_types",
102 metadata,
103 Column("production_type_id", Integer, primary_key=True),
104 Column("code", String(3), nullable=False, unique=True),
105 Column("description", String), # Column("name", String(128)) is possible
106 )
107 100
108 bidding_areas_table = Table( 101 production_types_table = Table(
109 "bidding_areas", 102 "production_types",
110 metadata, 103 metadata,
111 Column("bidding_area_id", Integer, primary_key=True), 104 Column("production_type_id", Integer, primary_key=True),
112 Column("code", String(3), nullable=False, unique=True), 105 Column("code", String(3), nullable=False, unique=True),
113 Column("name", String(32)), 106 Column("description", String), # Column("name", String(128)) is possible
114 ) 107 )
115 108
116 production_plans_table = Table( 109 bidding_areas_table = Table(
117 "production_plans", 110 "bidding_areas",
118 metadata, 111 metadata,
119 Column("record_created_time", DateTime(timezone=False), primary_key=True), 112 Column("bidding_area_id", Integer, primary_key=True),
120 Column("start_time", DateTime(timezone=False), primary_key=True), 113 Column("code", String(3), nullable=False, unique=True),
121 Column("bidding_area_id", Integer, ForeignKey("bidding_areas.bidding_area_id"), primary_key=True), 114 Column("name", String(32)),
122 Column("production_type_id", Integer, ForeignKey("production_types.production_type_id"), primary_key=True), 115 )
123 Column("value", Numeric, nullable=False),
124 )
125 116
126 metadata.create_all(engine) # creates the tables 117 production_plans_table = Table(
127 </code> 118 "production_plans",
128 </pre> 119 metadata,
129 </section> 120 Column("record_created_time", DateTime(timezone=False), primary_key=True),
121 Column("start_time", DateTime(timezone=False), primary_key=True),
122 Column("bidding_area_id", Integer, ForeignKey("bidding_areas.bidding_area_id"), primary_key=True),
123 Column("production_type_id", Integer, ForeignKey("production_types.production_type_id"), primary_key=True),
124 Column("value", Numeric, nullable=False),
125 )
130 126
131 <section data-auto-animate> 127 metadata.create_all(engine) # creates the tables
132 <h2>Example (cont...)</h2> 128 </code>
133 <h4 data-id="code-title">Use of <em>SQL expression language</em></h4> 129 </pre>
134 <pre data-id="code-animation"> 130 </section>
135 <code class="python" data-trim data-line-numbers type="text/template">
136 # option 1: classical mapping (continues)
137 # Using the SQL expression language (low level interface)
138 from sqlalchemy import text
139 131
140 insert_stmt = bidding_areas_table.insert(bind=engine) 132 <section data-auto-animate>
141 type(insert_stmt) 133 <h2>Example (cont...)</h2>
142 # Out: &lt;class 'sqlalchemy.sql.dml.Insert'&gt; 134 <h4 data-id="code-title">Use of <em>SQL expression language</em></h4>
143 print(insert_stmt) 135 <pre data-id="code-animation">
144 # Out: INSERT INTO bidding_areas (bidding_area_id, code, name) VALUES (?, ?, ?) 136 <code class="python" data-trim data-line-numbers type="text/template">
137 # option 1: classical mapping (continues)
138 # Using the SQL expression language (low level interface)
139 from sqlalchemy import text
145 140
146 compiled_stmt = insert_stmt.compile() 141 insert_stmt = bidding_areas_table.insert(bind=engine)
147 print(compiled_stmt.params) 142 type(insert_stmt)
148 # Out: {'bidding_area_id': None, 'code': None, 'name': None} 143 # Out: &lt;class 'sqlalchemy.sql.dml.Insert'&gt;
144 print(insert_stmt)
145 # Out: INSERT INTO bidding_areas (bidding_area_id, code, name) VALUES (?, ?, ?)
149 146
150 insert_stmt.execute(bidding_area_id=1, code="NO1", name="Elspot NO1") # insert a single entry 147 compiled_stmt = insert_stmt.compile()
151 # ... or a list of entries 148 print(compiled_stmt.params)
152 insert_stmt.execute( 149 # Out: {'bidding_area_id': None, 'code': None, 'name': None}
153 [
154 {"bidding_area_id": 2, "code": "NO2", "name": "Elspot NO2"},
155 {"bidding_area_id": 3, "code": "NO3", "name": "Elspot NO3"},
156 {"bidding_area_id": 4, "code": "NO4", "name": "Elspot NO4"},
157 {"bidding_area_id": 5, "code": "NO5", "name": "Elspot NO5"},
158 {"bidding_area_id": 6, "code": "NO6", "name": "Elspot NO6"},
159 ]
160 )
161 150
162 metadata.bind = engine # no need to explicitly bind the engine from now on 151 insert_stmt.execute(bidding_area_id=1, code="NO1", name="Elspot NO1") # insert a single entry
163 select_stmt = bidding_areas_table.select(bidding_areas_table.c.bidding_area_id==2) 152 # ... or a list of entries
164 result = select_stmt.execute() 153 insert_stmt.execute(
165 result.fetchall() 154 [
166 # Out: [(2, 'NO2', 'Elspot NO2')] 155 {"bidding_area_id": 2, "code": "NO2", "name": "Elspot NO2"},
156 {"bidding_area_id": 3, "code": "NO3", "name": "Elspot NO3"},
157 {"bidding_area_id": 4, "code": "NO4", "name": "Elspot NO4"},
158 {"bidding_area_id": 5, "code": "NO5", "name": "Elspot NO5"},
159 {"bidding_area_id": 6, "code": "NO6", "name": "Elspot NO6"},
160 ]
161 )
167 162
168 del_stmt = bidding_areas_table.delete() 163 metadata.bind = engine # no need to explicitly bind the engine from now on
169 del_stmt.execute(whereclause=text("name='Elspot NO6'")) 164 select_stmt = bidding_areas_table.select(bidding_areas_table.c.bidding_area_id==2)
170 del_stmt.execute() # delete NO6 165 result = select_stmt.execute()
171 </code> 166 result.fetchall()
172 </pre> 167 # Out: [(2, 'NO2', 'Elspot NO2')]
173 </section>
174 168
175 <section data-auto-animate> 169 del_stmt = bidding_areas_table.delete()
176 <h2>Example (cont...)</h2> 170 del_stmt.execute(whereclause=text("name='Elspot NO6'"))
177 <h4 data-id="code-title">Use of <em>classical mapping</em></h4> 171 del_stmt.execute() # delete NO6
178 <pre data-id="code-animation"> 172 </code>
179 <code class="python" data-trim data-line-numbers type="text/template"> 173 </pre>
180 # option 1: classical mapping (continues) 174 </section>
181 # Defining regular base classes and mapping them to the Table objects
182 from sqlalchemy.orm import mapper
183 175
184 class ProductionType: 176 <section data-auto-animate>
185 def __init__(self, code, description): 177 <h2>Example (cont...)</h2>
186 self.code = code 178 <h4 data-id="code-title">Use of <em>classical mapping</em></h4>
187 self.description = description 179 <pre data-id="code-animation">
180 <code class="python" data-trim data-line-numbers type="text/template">
181 # option 1: classical mapping (continues)
182 # Defining regular base classes and mapping them to the Table objects
183 from sqlalchemy.orm import mapper
188 184
189 def __str__(self): 185 class ProductionType:
190 return self.code 186 def __init__(self, code, description):
187 self.code = code
188 self.description = description
191 189
190 def __str__(self):
191 return self.code
192 192
193 class BiddingArea:
194 def __init__(self, code, name):
195 self.code = code
196 self.name = name
197 193
198 def __str__(self): 194 class BiddingArea:
199 return self.code 195 def __init__(self, code, name):
196 self.code = code
197 self.name = name
200 198
201 mapper(ProductionType, production_types_table) 199 def __str__(self):
202 mapper(BiddingArea, bidding_areas_table) 200 return self.code
203 </code>
204 </pre>
205 </section>
206 201
207 <section data-auto-animate> 202 mapper(ProductionType, production_types_table)
208 <h2>Example (cont...)</h2> 203 mapper(BiddingArea, bidding_areas_table)
209 <h4 data-id="code-title">Use of <em>classical mapping</em></h4> 204 </code>
210 <pre data-id="code-animation"> 205 </pre>
211 <code class="python" data-trim data-line-numbers type="text/template"> 206 </section>
212 from sqlalchemy.orm import relationship
213 207
214 class ProductionPlan: 208 <section data-auto-animate>
215 def __init__(self, record_created_time, start_time, production_type, bidding_area, value): 209 <h2>Example (cont...)</h2>
216 self.record_created_time = record_created_time 210 <h4 data-id="code-title">Use of <em>classical mapping</em></h4>
217 self.start_time = start_time 211 <pre data-id="code-animation">
218 self.production_type = production_type 212 <code class="python" data-trim data-line-numbers type="text/template">
219 self.bidding_area = bidding_area 213 from sqlalchemy.orm import relationship
220 self.value = value
221 214
222 def __str__(self): 215 class ProductionPlan:
223 return ( 216 def __init__(self, record_created_time, start_time, production_type, bidding_area, value):
224 f"{self.record_created_time} {self.start_time} " 217 self.record_created_time = record_created_time
225 f"{self.production_type} {self.bidding_area} {self.value}" 218 self.start_time = start_time
226 ) 219 self.production_type = production_type
220 self.bidding_area = bidding_area
221 self.value = value
227 222
223 def __str__(self):
224 return (
225 f"{self.record_created_time} {self.start_time} "
226 f"{self.production_type} {self.bidding_area} {self.value}"
227 )
228 228
229 mapper(
230 ProductionPlan,
231 production_plans_table,
232 properties = {
233 "production_type": relationship(ProductionType, backref="production_plans"),
234 "bidding_area": relationship(BiddingArea, backref="production_plans"),
235 },
236 )
237 </code>
238 </pre>
239 </section>
240 229
241 <section data-auto-animate> 230 mapper(
242 <h2>Example (cont...)</h2> 231 ProductionPlan,
243 <h4 data-id="code-title">Doing the same thing the easy way with <em>declarative mapping</em></h4> 232 production_plans_table,
244 <pre data-id="code-animation"> 233 properties = {
245 <code class="python" data-trim data-line-numbers type="text/template"> 234 "production_type": relationship(ProductionType, backref="production_plans"),
246 # option 2: declarative mapping 235 "bidding_area": relationship(BiddingArea, backref="production_plans"),
247 from sqlalchemy.ext.declarative import declarative_base 236 },
237 )
238 </code>
239 </pre>
240 </section>
248 241
249 Base = declarative_base() 242 <section data-auto-animate>
243 <h2>Example (cont...)</h2>
244 <h4 data-id="code-title">Doing the same thing the easy way with <em>declarative mapping</em></h4>
245 <pre data-id="code-animation">
246 <code class="python" data-trim data-line-numbers type="text/template">
247 # option 2: declarative mapping
248 from sqlalchemy.ext.declarative import declarative_base
250 249
251 class ProductionType(Base): 250 Base = declarative_base()
252 __tablename__ = "production_types"
253 251
254 production_type_id = Column(Integer, primary_key=True) 252 class ProductionType(Base):
255 code = Column(String(3), nullable=False, unique=True) 253 __tablename__ = "production_types"
256 description = Column(String)
257 254
258 def __init__(self, code, description): 255 production_type_id = Column(Integer, primary_key=True)
259 self.code = code 256 code = Column(String(3), nullable=False, unique=True)
260 self.description = description 257 description = Column(String)
261 258
262 def __str__(self): 259 def __init__(self, code, description):
263 return self.code 260 self.code = code
261 self.description = description
264 262
265 class BiddingArea(Base): 263 def __str__(self):
266 __tablename__ = "bidding_areas" 264 return self.code
267 265
268 bidding_area_id = Column(Integer, primary_key=True) 266 class BiddingArea(Base):
269 code = Column(String(3), nullable=False, unique=True) 267 __tablename__ = "bidding_areas"
270 name = Column(String(32))
271 268
272 def __init__(self, code, name): 269 bidding_area_id = Column(Integer, primary_key=True)
273 self.code = code 270 code = Column(String(3), nullable=False, unique=True)
274 self.name = name 271 name = Column(String(32))
275 272
276 def __str__(self): 273 def __init__(self, code, name):
277 return self.code 274 self.code = code
278 </code> 275 self.name = name
279 </pre>
280 </section>
281 276
282 <section data-auto-animate> 277 def __str__(self):
283 <h2>Example (cont...)</h2> 278 return self.code
284 <h4 data-id="code-title">Doing the same thing the easy way with <em>declarative mapping</em></h4> 279 </code>
285 <pre data-id="code-animation"> 280 </pre>
286 <code class="python" data-trim data-line-numbers type="text/template"> 281 </section>
287 # option 2: declarative mapping (continues)
288 from sqlalchemy.orm import relationship, backref
289 282
290 class ProductionPlan(Base): 283 <section data-auto-animate>
291 __tablename__ = "production_plans" 284 <h2>Example (cont...)</h2>
285 <h4 data-id="code-title">Doing the same thing the easy way with <em>declarative mapping</em></h4>
286 <pre data-id="code-animation">
287 <code class="python" data-trim data-line-numbers type="text/template">
288 # option 2: declarative mapping (continues)
289 from sqlalchemy.orm import relationship, backref
292 290
293 record_created_time = Column(DateTime(timezone=False), primary_key=True) 291 class ProductionPlan(Base):
294 start_time = Column(DateTime(timezone=False), primary_key=True) 292 __tablename__ = "production_plans"
295 bidding_area_id = Column(Integer, ForeignKey("bidding_areas.bidding_area_id"), primary_key=True)
296 production_type_id = Column(Integer, ForeignKey("production_types.production_type_id"), primary_key=True)
297 value = Column(Numeric, nullable=False)
298 293
299 # defining relationships. 294 record_created_time = Column(DateTime(timezone=False), primary_key=True)
300 # the defined attributes will reference 'ProductionType' and 'BiddingArea' objects 295 start_time = Column(DateTime(timezone=False), primary_key=True)
301 production_type = relationship(ProductionType, backref=backref("production_plans")) 296 bidding_area_id = Column(Integer, ForeignKey("bidding_areas.bidding_area_id"), primary_key=True)
302 bidding_area = relationship(BiddingArea, backref=backref("production_plans")) 297 production_type_id = Column(Integer, ForeignKey("production_types.production_type_id"), primary_key=True)
298 value = Column(Numeric, nullable=False)
303 299
304 def __init__(self, record_created_time, start_time, production_type, bidding_area, value): 300 # defining relationships.
305 self.record_created_time = record_created_time 301 # the defined attributes will reference 'ProductionType' and 'BiddingArea' objects
306 self.start_time = start_time 302 production_type = relationship(ProductionType, backref=backref("production_plans"))
307 self.production_type = production_type # a 'ProductionType' object 303 bidding_area = relationship(BiddingArea, backref=backref("production_plans"))
308 self.bidding_area = bidding_area # a 'BiddingArea' object
309 self.value = value
310 304
311 def __str__(self): 305 def __init__(self, record_created_time, start_time, production_type, bidding_area, value):
312 return ( 306 self.record_created_time = record_created_time
313 f"{self.record_created_time} {self.start_time} " 307 self.start_time = start_time
314 f"{self.production_type} {self.bidding_area} {self.value}" 308 self.production_type = production_type # a 'ProductionType' object
315 ) 309 self.bidding_area = bidding_area # a 'BiddingArea' object
310 self.value = value
316 311
317 Base.metadata.create_all(engine) # create tables 312 def __str__(self):
318 </code> 313 return (
319 </pre> 314 f"{self.record_created_time} {self.start_time} "
320 </section> 315 f"{self.production_type} {self.bidding_area} {self.value}"
316 )
321 317
322 <section data-auto-animate> 318 Base.metadata.create_all(engine) # create tables
323 <h2>Example (cont...)</h2> 319 </code>
324 <h4 data-id="code-title">Creating instances</h4> 320 </pre>
325 <pre data-id="code-animation"> 321 </section>
326 <code class="python" data-trim data-line-numbers type="text/template">
327 # adding some data...
328 import datetime
329 import decimal
330 322
331 from sqlalchemy.orm import sessionmaker 323 <section data-auto-animate>
324 <h2>Example (cont...)</h2>
325 <h4 data-id="code-title">Creating instances</h4>
326 <pre data-id="code-animation">
327 <code class="python" data-trim data-line-numbers type="text/template">
328 # adding some data...
329 import datetime
330 import decimal
332 331
333 Session = sessionmaker(bind=engine) # bound session 332 from sqlalchemy.orm import sessionmaker
334 session = Session()
335 333
336 bidding_area1 = BiddingArea("NO1", "Elspot NO1") 334 Session = sessionmaker(bind=engine) # bound session
337 session.add(bidding_area1) 335 session = Session()
338 336
339 session.add_all( 337 bidding_area1 = BiddingArea("NO1", "Elspot NO1")
340 [ 338 session.add(bidding_area1)
341 BiddingArea("NO2", "Elspot NO2"),
342 BiddingArea("NO3", "Elspot NO3"),
343 BiddingArea("NO4", "Elspot NO4"),
344 BiddingArea("NO5", "Elspot NO5"),
345 ]
346 )
347 339
348 production_type_B37 = ProductionType("B37", "Thermal unspecified") 340 session.add_all(
349 production_type_B30 = ProductionType("B30", "Wind unspecified") 341 [
342 BiddingArea("NO2", "Elspot NO2"),
343 BiddingArea("NO3", "Elspot NO3"),
344 BiddingArea("NO4", "Elspot NO4"),
345 BiddingArea("NO5", "Elspot NO5"),
346 ]
347 )
350 348
351 session.add_all( 349 production_type_B37 = ProductionType("B37", "Thermal unspecified")
352 [ 350 production_type_B30 = ProductionType("B30", "Wind unspecified")
353 ProductionType("B19", "Wind Onshore"),
354 ProductionType("B10", "Hydro-electric pure pumped storage head installation"),
355 ProductionType("B11", "Hydro Run-of-river head installation"),
356 ProductionType("B12", "Hydro-electric storage head installation"),
357 ProductionType("A04", "Generation"),
358 production_type_B37,
359 production_type_B30,
360 ]
361 )
362 </code>
363 </pre>
364 </section>
365 351
366 <section data-auto-animate> 352 session.add_all(
367 <h2>Example (cont...)</h2> 353 [
368 <h4 data-id="code-title">Creating instances</h4> 354 ProductionType("B19", "Wind Onshore"),
369 <pre data-id="code-animation"> 355 ProductionType("B10", "Hydro-electric pure pumped storage head installation"),
370 <code class="python" data-trim data-line-numbers type="text/template"> 356 ProductionType("B11", "Hydro Run-of-river head installation"),
371 # adding some production plans... 357 ProductionType("B12", "Hydro-electric storage head installation"),
358 ProductionType("A04", "Generation"),
359 production_type_B37,
360 production_type_B30,
361 ]
362 )
363 </code>
364 </pre>
365 </section>
372 366
373 session.add( 367 <section data-auto-animate>
374 ProductionPlan( 368 <h2>Example (cont...)</h2>
375 datetime.datetime.now(), 369 <h4 data-id="code-title">Creating instances</h4>
376 datetime.datetime(2022, 11, 2, 1, 0), 370 <pre data-id="code-animation">
377 production_type_B37, 371 <code class="python" data-trim data-line-numbers type="text/template">
378 bidding_area1, 372 # adding some production plans...
379 decimal.Decimal("80.5"),
380 )
381 )
382 373
383 production_plan2 = ProductionPlan( 374 session.add(
384 datetime.datetime.now(), 375 ProductionPlan(
385 datetime.datetime(2022, 11, 2, 2, 0), 376 datetime.datetime.now(),
386 production_type_B37, 377 datetime.datetime(2022, 11, 2, 1, 0),
387 bidding_area1, 378 production_type_B37,
388 decimal.Decimal("90.5"), 379 bidding_area1,
389 ) 380 decimal.Decimal("80.5"),
381 )
382 )
390 383
391 session.add(production_plan2) 384 production_plan2 = ProductionPlan(
385 datetime.datetime.now(),
386 datetime.datetime(2022, 11, 2, 2, 0),
387 production_type_B37,
388 bidding_area1,
389 decimal.Decimal("90.5"),
390 )
392 391
393 session.flush() # execute pending operations 392 session.add(production_plan2)
394 session.commit() # execute and commit pending operations
395 393
396 production_plan2.value = decimal.Decimal("70.5") 394 session.flush() # execute pending operations
397 production_plan2 in session 395 session.commit() # execute and commit pending operations
398 # Out: True
399 396
400 session.commit() 397 production_plan2.value = decimal.Decimal("70.5")
401 </code> 398 production_plan2 in session
402 </pre> 399 # Out: True
403 </section>
404 400
405 <section data-auto-animate> 401 session.commit()
406 <h2>Example (cont...)</h2> 402 </code>
407 <h4 data-id="code-title">Queries</h4> 403 </pre>
408 <pre data-id="code-animation"> 404 </section>
409 <code class="python" data-trim data-line-numbers type="text/template">
410 import pandas as pd
411 405
412 session.query(ProductionPlan).order_by(ProductionPlan.start_time) # returns a Query instance 406 <section data-auto-animate>
413 session.query(ProductionPlan).order_by(ProductionPlan.start_time).all() # returns an object-list 407 <h2>Example (cont...)</h2>
408 <h4 data-id="code-title">Queries</h4>
409 <pre data-id="code-animation">
410 <code class="python" data-trim data-line-numbers type="text/template">
411 import pandas as pd
414 412
415 # return all production plans where start_time after 2022-09-01 00:00 413 session.query(ProductionPlan).order_by(ProductionPlan.start_time) # returns a Query instance
416 session.query(ProductionPlan).filter(ProductionPlan.start_time > datetime.datetime(2022, 9, 1, 0, 0)).all() 414 session.query(ProductionPlan).order_by(ProductionPlan.start_time).all() # returns an object-list
417 415
418 # return production plans with value > 80 416 # return all production plans where start_time after 2022-09-01 00:00
419 query = session.query(ProductionPlan).filter(ProductionPlan.value > 80).order_by(ProductionPlan.start_time) 417 session.query(ProductionPlan).filter(ProductionPlan.start_time > datetime.datetime(2022, 9, 1, 0, 0)).all()
420 query.count() # returns 1
421 production_plan = query.first() # returns the first object (element)
422 production_plan = query.one() # raises NoResultFound exception or MultipleResultsFound in case elements != 1
423 418
424 # generate Pandas DataFrame from a query or entire table 419 # return production plans with value > 80
425 df = pd.read_sql_table("my_table", con=session.get_bind()) # or con=engine 420 query = session.query(ProductionPlan).filter(ProductionPlan.value > 80).order_by(ProductionPlan.start_time)
426 df = pd.read_sql_query(query.statement, engine) 421 query.count() # returns 1
422 production_plan = query.first() # returns the first object (element)
423 production_plan = query.one() # raises NoResultFound exception or MultipleResultsFound in case elements != 1
427 424
428 # return production plans with production type 'B37' 425 # generate Pandas DataFrame from a query or entire table
429 session.query(ProductionPlan).filter( 426 df = pd.read_sql_table("my_table", con=session.get_bind()) # or con=engine
430 ProductionPlan.production_type_id == ProductionType.production_type_id 427 df = pd.read_sql_query(query.statement, engine)
431 ).filter(ProductionType.code == "B37").all()
432 session.query(ProductionPlan).join(ProductionType).filter(ProductionType.code == "B37").all()
433 session.query(ProductionPlan).filter(ProductionPlan.production_type == production_type_B37).all()
434 session.query(
435 ProductionPlan
436 ).from_statement(
437 text(
438 "SELECT pp.* FROM production_plans pp, production_types pt "
439 "WHERE pp.production_type_id = pt.production_type_id AND pt.code=:code"
440 )
441 ).params(code="B37").all()
442 </code>
443 </pre>
444 </section>
445 428
446 <section> 429 # return production plans with production type 'B37'
447 <h1>Q &amp; A</h1> 430 session.query(ProductionPlan).filter(
448 </section> 431 ProductionPlan.production_type_id == ProductionType.production_type_id
432 ).filter(ProductionType.code == "B37").all()
433 session.query(ProductionPlan).join(ProductionType).filter(ProductionType.code == "B37").all()
434 session.query(ProductionPlan).filter(ProductionPlan.production_type == production_type_B37).all()
435 session.query(
436 ProductionPlan
437 ).from_statement(
438 text(
439 "SELECT pp.* FROM production_plans pp, production_types pt "
440 "WHERE pp.production_type_id = pt.production_type_id AND pt.code=:code"
441 )
442 ).params(code="B37").all()
443 </code>
444 </pre>
445 </section>
449 446
450 </div> 447 <section>
451 </div> 448 <h1>Q &amp; A</h1>
452 449 </section>
453 <script src="dist/reveal.js"></script>
454 <script src="plugin/zoom/zoom.js"></script>
455 <script src="plugin/notes/notes.js"></script>
456 <script src="plugin/search/search.js"></script>
457 <script src="plugin/markdown/markdown.js"></script>
458 <script src="plugin/highlight/highlight.js"></script>
459 <script>
460 450
461 // Also available as an ES module, see: 451 </div>
462 // https://revealjs.netlify.app/initialization/ 452 </div>
463 Reveal.initialize({
464 controls: true,
465 progress: true,
466 center: true,
467 hash: true,
468 453
469 // Learn about plugins: https://revealjs.netlify.app/plugins/ 454 <script src="dist/reveal.js"></script>
470 plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ] 455 <script src="dist/plugin/zoom.js"></script>
471 }); 456 <script src="dist/plugin/notes.js"></script>
472 Reveal.configure({ pdfSeparateFragments: false }); 457 <script src="dist/plugin/search.js"></script>
458 <script src="dist/plugin/markdown.js"></script>
459 <script src="dist/plugin/highlight.js"></script>
460 <script>
461 // Also available as an ES module, see: https://revealjs.com/initialization/
462 // import Reveal from 'reveal.js';
463 // import RevealZoom from 'reveal.js/plugin/zoom';
464 // import RevealNotes from 'reveal.js/plugin/notes';
465 // import RevealSearch from 'reveal.js/plugin/search';
466 // import RevealMarkdown from 'reveal.js/plugin/markdown';
467 // import RevealHighlight from 'reveal.js/plugin/highlight';
473 468
474 </script> 469 Reveal.initialize({
470 controls: true,
471 progress: true,
472 center: true,
473 hash: true,
475 474
476 </body> 475 // Learn about plugins: https://revealjs.com/plugins/
476 plugins: [RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight],
477 });
478 </script>
479 </body>
477</html> 480</html>
diff --git a/reveal.js/template.html b/reveal.js/template.html
new file mode 100644
index 0000000..51ba440
--- /dev/null
+++ b/reveal.js/template.html
@@ -0,0 +1,55 @@
1<!DOCTYPE html>
2<html lang="en">
3 <head>
4 <meta charset="utf-8" />
5 <title>Title</title>
6 <meta name="author" content="Simeon Simeonov"/>
7 <meta name="mobile-web-app-capable" content="yes"/>
8 <meta name="mobile-web-app-status-bar-style" content="black-translucent"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
10
11 <link rel="stylesheet" href="dist/reset.css"/>
12 <link rel="stylesheet" href="dist/reveal.css"/>
13
14 <link rel="stylesheet" href="dist/theme/serif.css" id="theme">
15
16 <!-- Theme used for syntax highlighting of code -->
17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"/>
18 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"/> -->
19 </head>
20
21 <body>
22 <div class="reveal">
23 <!-- Any section element inside of this container is displayed as a slide -->
24 <div class="slides">
25
26 </div>
27 </div>
28
29 <script src="dist/reveal.js"></script>
30 <script src="dist/plugin/zoom.js"></script>
31 <script src="dist/plugin/notes.js"></script>
32 <script src="dist/plugin/search.js"></script>
33 <script src="dist/plugin/markdown.js"></script>
34 <script src="dist/plugin/highlight.js"></script>
35 <script>
36 // Also available as an ES module, see: https://revealjs.com/initialization/
37 // import Reveal from 'reveal.js';
38 // import RevealZoom from 'reveal.js/plugin/zoom';
39 // import RevealNotes from 'reveal.js/plugin/notes';
40 // import RevealSearch from 'reveal.js/plugin/search';
41 // import RevealMarkdown from 'reveal.js/plugin/markdown';
42 // import RevealHighlight from 'reveal.js/plugin/highlight';
43
44 Reveal.initialize({
45 controls: true,
46 progress: true,
47 center: true,
48 hash: true,
49
50 // Learn about plugins: https://revealjs.com/plugins/
51 plugins: [RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight],
52 });
53 </script>
54 </body>
55</html>
diff --git a/reveal.js/template_statnett.html b/reveal.js/template_statnett.html
new file mode 100644
index 0000000..e47b280
--- /dev/null
+++ b/reveal.js/template_statnett.html
@@ -0,0 +1,56 @@
1<!DOCTYPE html>
2<html lang="en">
3 <head>
4 <meta charset="utf-8" />
5 <title>Title</title>
6 <meta name="author" content="Simeon Simeonov"/>
7 <meta name="mobile-web-app-capable" content="yes"/>
8 <meta name="mobile-web-app-status-bar-style" content="black-translucent"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
10
11 <link rel="stylesheet" href="dist/reset.css"/>
12 <link rel="stylesheet" href="dist/reveal.css"/>
13
14 <!-- <link rel="stylesheet" href="dist/theme/black.css" id="theme"/> -->
15 <link rel="stylesheet" href="dist/theme/statnett.css" id="theme"/>
16
17 <!-- Theme used for syntax highlighting of code -->
18 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme"/>
19 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"/> -->
20 </head>
21
22 <body>
23 <div class="reveal">
24 <!-- Any section element inside of this container is displayed as a slide -->
25 <div class="slides">
26
27 </div>
28 </div>
29
30 <script src="dist/reveal.js"></script>
31 <script src="dist/plugin/zoom.js"></script>
32 <script src="dist/plugin/notes.js"></script>
33 <script src="dist/plugin/search.js"></script>
34 <script src="dist/plugin/markdown.js"></script>
35 <script src="dist/plugin/highlight.js"></script>
36 <script>
37 // Also available as an ES module, see: https://revealjs.com/initialization/
38 // import Reveal from 'reveal.js';
39 // import RevealZoom from 'reveal.js/plugin/zoom';
40 // import RevealNotes from 'reveal.js/plugin/notes';
41 // import RevealSearch from 'reveal.js/plugin/search';
42 // import RevealMarkdown from 'reveal.js/plugin/markdown';
43 // import RevealHighlight from 'reveal.js/plugin/highlight';
44
45 Reveal.initialize({
46 controls: true,
47 progress: true,
48 center: true,
49 hash: true,
50
51 // Learn about plugins: https://revealjs.com/plugins/
52 plugins: [RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight],
53 });
54 </script>
55 </body>
56</html>
diff --git a/reveal.js/timetravel.html b/reveal.js/timetravel.html
deleted file mode 100644
index b297e2f..0000000
--- a/reveal.js/timetravel.html
+++ /dev/null
@@ -1,127 +0,0 @@
1<!doctype html>
2<html lang="en">
3 <head>
4 <meta charset="utf-8">
5 <title>Solving problems using time travel</title>
6 <meta name="author" content="Simeon Simeonov">
7 <meta name="apple-mobile-web-app-capable" content="yes">
8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
9 <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
11 <link rel="stylesheet" href="dist/reset.css">
12 <link rel="stylesheet" href="dist/reveal.css">
13
14 <link rel="stylesheet" href="dist/theme/fifty.css" id="theme">
15
16 <!-- Theme used for syntax highlighting of code -->
17 <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme">
18 <!-- <link rel="stylesheet" href="plugin/highlight/zenburn.css" id="highlight-theme"> -->
19 </head>
20 <body>
21 <div class="reveal">
22
23 <!-- Any section element inside of this container is displayed as a slide -->
24 <div class="slides">
25
26 <section>
27 <h2>Solving problems using <em>time travel</em></h2>
28 <h4>Beryl @ Fifty</h4>
29 </br>
30 <p><small>Tomas Robertson (team ACE-OL) &amp; Simeon Simeonov (team Forecasts)</small></p>
31 </section>
32
33
34 <section>
35 <h2>What is <em>time travel</em>???</h2>
36 <br/>
37 <p><em>Time travel</em> - our ability to look at our input data at the state it was at a specific point in time (not only at its last state).</p>
38 <p><em>Time travel</em> is achieved by adding the <em>record_created_time</em> column to our DB tables and storing Kafka's <em>created_time</em> value (converted to UTC).</p>
39 <br/>
40 <p>The main concepts around how and why were presented by Peter Sandberg.</p>
41 </section>
42
43 <section>
44 <h2>Solving problems</h2>
45 <br/>
46 <p>The following spike was observed 2021-10-06 around 10:15 CET @ NO4</p>
47 <img src="images/timetravel/ace_ol_spike.png"></img>
48 </section>
49
50 <section>
51 <h2>Solving problems (cont)</h2>
52 <br/>
53 <p>No spikes shown in Grafana</p>
54 <img src="images/timetravel/ace_ol_spike_grafana.png"></img>
55 </section>
56
57 <section>
58 <h2>Solving problems with <em>time travel</em></h2>
59 <br/>
60 <pre data-id="code-animation">
61 <code class="sql" data-trim type="text/template">
62 SELECT record_created_time, start_time, value
63 FROM misc.app_odin_ace_ol_ba_10s_avro_v01
64 WHERE bidding_area_name = 'NO4' AND start_time = '2021-10-06 08:14:10'
65 ORDER BY record_created_time;
66 </code>
67 </pre>
68
69 <table>
70 <thead>
71 <tr>
72 <th>record_created_time</th>
73 <th>start_time</th>
74 <th>value</th>
75 </tr>
76 </thead>
77 <tbody>
78 <tr>
79 <td>2021-10-06 08:15:52.258</td>
80 <td>2021-10-06 08:14:10</td>
81 <td>-370.37683609008127</td>
82 </tr>
83 <tr>
84 <td>2021-10-06 08:19:06.222</td>
85 <td>2021-10-06 08:14:10</td>
86 <td>25.183745117193457</td>
87 </tr>
88 <tr>
89 <td>2021-10-06 08:21:56.207</td>
90 <td>2021-10-06 08:14:10</td>
91 <td>34.78731922151518</td>
92 </tr>
93 </tbody>
94 </table>
95 </section>
96
97 <section>
98 <h1>Q &amp; A</h1>
99 </section>
100
101 </div>
102 </div>
103
104 <script src="dist/reveal.js"></script>
105 <script src="plugin/zoom/zoom.js"></script>
106 <script src="plugin/notes/notes.js"></script>
107 <script src="plugin/search/search.js"></script>
108 <script src="plugin/markdown/markdown.js"></script>
109 <script src="plugin/highlight/highlight.js"></script>
110 <script>
111
112 // Also available as an ES module, see:
113 // https://revealjs.com/initialization/
114 Reveal.initialize({
115 controls: true,
116 progress: true,
117 center: true,
118 hash: true,
119
120 // Learn about plugins: https://revealjs.com/plugins/
121 plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ]
122 });
123
124 </script>
125
126 </body>
127</html>