aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSan Jacobs2024-09-13 10:44:57 +0200
committerSan Jacobs2024-09-13 10:44:57 +0200
commit4f4416ff213b8287778868a4b18e332b1c012d4f (patch)
treedc654a1fd35741543371c5b4e5a05584f3297f5d
downloadbetter-report-4f4416ff213b8287778868a4b18e332b1c012d4f.tar.gz
better-report-4f4416ff213b8287778868a4b18e332b1c012d4f.tar.bz2
better-report-4f4416ff213b8287778868a4b18e332b1c012d4f.zip
Init
-rw-r--r--.gitignore3
-rwxr-xr-xREADME.md13
-rwxr-xr-xbuild.bat2
-rwxr-xr-xbuild.sh4
-rwxr-xr-xend.html33
-rwxr-xr-xmain.odin209
-rwxr-xr-xsketch.html1289
-rwxr-xr-xstart.html9
-rwxr-xr-xstart2.html103
9 files changed, 1665 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e2dfbc9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+*.pdb
+*.exe
+*.csv \ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100755
index 0000000..ebe7f61
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# better-report
+
+Makes your sound reports better.
+Only tested with reports from 688 at the moment.
+Turns the awkward Sound Devices-generated CSV into a beautiful self-contained HTML file.
+
+Enbettermentifications:
+- [X] Actually correctly sorted reports
+- [X] Will let you change the sorting while looking at it
+- [X] Removes empty tracks, so everything lines up with the actual wav files
+- [X] Less ugly than most software for viewing CSV-files
+- [X] Place a nice little logo in a top corner for branding
+- [X] HTML is a format basically everyone can open anywhere \ No newline at end of file
diff --git a/build.bat b/build.bat
new file mode 100755
index 0000000..0890ae1
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,2 @@
+odin build main.odin -file -debug -pdb-name:better-report.pdb -out:better-report.exe
+odin build main.odin -file -o:speed -out:C:/tools/better-report.exe
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..c40b73b
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,4 @@
+odin build main.odin -file -debug -out:better-report
+odin build main.odin -file -o:speed -out:/home/san/scripts/better-report
+chmod +x better-report
+chmod +x /home/san/scripts/better-report
diff --git a/end.html b/end.html
new file mode 100755
index 0000000..f964978
--- /dev/null
+++ b/end.html
@@ -0,0 +1,33 @@
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+</body>
+
+<script type="text/javascript">
+ const getCellValue = (tr, idx) => tr.children[idx].innerText || tr.children[idx].textContent;
+
+ const comparer = (idx, asc) => (a, b) => ((v1, v2) =>
+ v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2)
+ )(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));
+
+ function doSort(th) {
+ console.log("Doing sort to: ", th.textContent, th)
+ const table = th.closest('table');
+ Array.from(table.querySelector('tbody').querySelectorAll('tr:nth-child(n)'))
+ .sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc))
+ .forEach(tr => table.querySelector('tbody').appendChild(tr) );
+ }
+ // do the work...
+ document.querySelectorAll('th').forEach(th => th.addEventListener('click', (() => {
+ document.getElementsByClassName("current-sort")[0].classList.remove("current-sort");
+ th.classList.add("current-sort");
+ doSort(th);
+ })));
+
+ doSort(document.getElementsByClassName("current-sort")[0]);
+
+</script>
+
+</html>
diff --git a/main.odin b/main.odin
new file mode 100755
index 0000000..03f1655
--- /dev/null
+++ b/main.odin
@@ -0,0 +1,209 @@
+package main
+
+import "core:fmt"
+import "core:os"
+import "core:path/filepath"
+import "core:strings"
+
+PART_ONE :: #load("start.html", string)
+PART_TWO :: #load("start2.html", string)
+PART_END :: #load("end.html", string)
+
+main :: proc() {
+
+ input_file_name : string
+ if len(os.args) < 2 {
+ // Attempt to auto-detect CSVs, but filepath.glob is broken.
+ // It doesn't return anything if you run the exe from a PATH folder.
+
+ /* fmt.println("No file submitted. Using first CSV found.")
+ glob_pattern := fmt.aprintf("{}\\*.*", os.get_current_directory())
+ fmt.println(glob_pattern)
+ csvs, _ := filepath.glob(glob_pattern)
+ fmt.println(csvs)
+ input_file_name = csvs[0] */
+ fmt.println("ERROR: No file submitted.")
+ return
+ } else {
+ fmt.printf("Input CSV: {}\n", os.args[1])
+ input_file_name = os.args[1]
+ }
+
+
+ // Reading CSV file
+
+ data, ok := os.read_entire_file(input_file_name, context.allocator)
+ if !ok {
+ fmt.printf("ERROR: Could not read file: {}\n", os.args[1])
+ return
+ }
+ defer delete(data, context.allocator)
+
+ total_output: string = PART_ONE // Page title
+ total_output = append(total_output, fmt.aprintf("{} - Lydrapport", input_file_name[len(input_file_name)-17:len(input_file_name)-11]))
+ total_output = append(total_output, PART_TWO)
+ it := string(data)
+
+ // First we do a pass to find out at what column the channels start and end,
+ // and to find out how many channels we actually use at maximum.
+ // This will let us compress the channel columns to only what is needed.
+
+ tracks_start := 0
+ tracks_end := 0
+ max_tracks := 0
+ line_index := 0
+ for line in strings.split_lines_iterator(&it) {
+ tracks_seen_this_line := 0
+ for element, e in strings.split(line, ",") {
+ if element == "Trk 1" {
+ tracks_start = e
+ fmt.printf("Tracks start at: {}\n", tracks_start)
+ }
+ if element == "Notes" {
+ tracks_end = e-1
+ fmt.printf("Tracks end at: {}\n", tracks_end)
+ }
+ if e >= tracks_start && tracks_end >= e { // If there's anything in the range of where tracks are, count it
+ if element != "" do tracks_seen_this_line += 1
+ }
+ }
+ // Update the max
+ if tracks_seen_this_line > max_tracks {
+ max_tracks = tracks_seen_this_line
+ fmt.printf("Highest track count so far found on line {}, with {} tracks.\n", line_index, max_tracks)
+ }
+ line_index += 1
+ }
+ potensial_tracks := tracks_end+1 - tracks_start
+ unused_tracks := potensial_tracks - max_tracks
+
+ // Now we output the HTML.
+
+ it = string(data)
+ line_index = 0
+ blank_lines := 0
+ state : states = .TITLE
+ time_in_state := 0
+ info_reading_to_field := true
+ for line in strings.split_lines_iterator(&it) {
+ //fmt.printf("state.{} line_index:{} t:{} blank_lines:{} : \t", state, line_index, time_in_state, blank_lines)
+ there_was_content_in_line := false
+
+ // Writing the headers and section stuff.
+ #partial switch state {
+ case .HEADER:
+ if time_in_state == 1 do total_output = append(total_output, " <table>\n <thead>\n <tr class=\"header-tr\">\n")
+
+ case .BODY:
+ total_output = append(total_output, " <tr>\n")
+ }
+
+ columns_skipped := 0
+ for element, e in strings.split(line, ",") {
+ if len(element)> 0 do there_was_content_in_line = true
+ if len(element)> 0 do blank_lines = 0
+ // Filling the row of data
+ switch state {
+ case .TITLE:
+ //fmt.printf("{} T ", element)
+ case .INFO:
+ //fmt.printf("{} I ", element)
+
+ if len(element)>0 {
+ if info_reading_to_field {
+ total_output = append(total_output, fmt.aprintf(" <p><b>{}</b>", element))
+ } else {
+ total_output = append(total_output, fmt.aprintf(" {}</p>\n", element[1:len(element)-1]))
+ }
+ info_reading_to_field = !info_reading_to_field
+ }
+
+ case .HEADER:
+ //fmt.printf("{} H ", element)
+ if time_in_state == 1 {
+ if e == 4 { // Magic number to select the default sorting column
+ total_output = append(total_output, fmt.aprintf(" <th class=\"current-sort\">{}</th>\n", element))
+ } else if e <= tracks_start+max_tracks-1 || e > tracks_end {
+ total_output = append(total_output, fmt.aprintf(" <th>{}</th>\n", element))
+ }
+ }
+
+ case .BODY:
+ //fmt.printf("{} B ", element)
+ if e == tracks_end+1 {
+ for _ in 0..<(columns_skipped - unused_tracks) { // Add padding so note at end ligns up
+ total_output = append(total_output, " <td></td>\n")
+ }
+ }
+ if element != "" {
+
+ if e >= tracks_start {
+ total_output = append(total_output, fmt.aprintf(" <td>{}</td>\n", element[1:len(element)-1]))
+ /*} else if e == 0 { // Making filename a link to the file
+ total_output = append(total_output, fmt.aprintf(" <td><a href=\"{}\">{}</a></td>\n", element, element))*/
+ } else {
+ total_output = append(total_output, fmt.aprintf(" <td>{}</td>\n", element))
+ }
+
+ } else {
+ columns_skipped += 1
+ }
+ }
+ }
+ // Advancing state machine and finishing off divs n stuff
+ switch state {
+ case .TITLE:
+ if line_index==1 {
+ state = .INFO
+ time_in_state = 0
+ }
+ case .INFO:
+ if blank_lines > 1 {
+ total_output = append(total_output, " </div>\n </div>\n")
+ state = .HEADER
+ time_in_state = 0
+ }
+ case .HEADER:
+ if blank_lines > 0 {
+ state = .BODY
+ time_in_state = 0
+ total_output = append(total_output, " </tr>\n </thead>\n <tbody>\n")
+ }
+ case .BODY:
+ total_output = append(total_output, " </tr>\n")
+ }
+ if there_was_content_in_line {
+ blank_lines = 0
+ } else {
+ blank_lines += 1
+ }
+ //fmt.printf("\n")
+ line_index += 1
+ time_in_state += 1
+ }
+ total_output = append(total_output, PART_END)
+
+ output_file_name := fmt.aprintf("{}_Knekt.html", os.args[1][:len(os.args[1])-4])
+ os.remove(output_file_name)
+ output_file_handle, _ := os.open(output_file_name, os.O_CREATE, 0o777)
+ os.write_string(output_file_handle, "") // TODO: Figure out how to write this to a file
+ os.write_string(output_file_handle, total_output) // TODO: Figure out how to write this to a file
+ os.close(output_file_handle)
+ fmt.printf("Wrote file: {}", output_file_name)
+ //fmt.printf("\n\n\nTOTAL OUTPUT:\n\n\n")
+ //fmt.println(total_output)
+}
+
+append :: proc(input, to_add: string) -> string {
+ output := strings.concatenate({input, to_add})
+ //delete(to_add)
+ //delete(input)
+ return output
+}
+
+states :: enum {
+ TITLE,
+ INFO,
+ HEADER,
+ BODY,
+} \ No newline at end of file
diff --git a/sketch.html b/sketch.html
new file mode 100755
index 0000000..16db49f
--- /dev/null
+++ b/sketch.html
@@ -0,0 +1,1289 @@
+<!DOCTYPE html>
+<html lang="en">
+
+
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <title>Better Report Test</title>
+
+ <link rel="icon" href="/favicon.ico">
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
+
+
+ <style>
+ html {
+ color: white;
+ background: #141414;
+ font-family: sans-serif;
+ }
+ td {
+ padding: 3px 6px;
+ background: #181818;
+ border-radius: 3px;
+ border: #ffffff0d solid 1px;
+ }
+ th {
+ border-radius: 3px;
+ padding: 5px 3px;
+ cursor: pointer;
+ font-weight: bold;
+ }
+ thead {
+ top: 0;
+ position: sticky;
+ background: #141414;
+ outline: #fff1 solid 1px 1px 1px 3px;
+ }
+ .main-container {
+ width: max-content;
+ display: block;
+ margin: auto;
+ }
+ .header-tr {
+ border-bottom: solid 1px #fff3;
+ }
+ .current-sort {
+ background: #424;
+ }
+ .prelude {
+ background: #ffffff0c;
+ padding: 20px;
+ margin-bottom: 5px;
+ border-radius: 4px;
+ }
+ .prelude p {
+ margin: 2px 0px;
+ }
+ .prelude b {
+
+ }
+ </style>
+
+
+</head>
+
+
+
+<body>
+
+ <div class="main-container">
+ <div class="prelude">
+ <p><b>Project:</b> Heim</p>
+ <p><b>Producer:</b> Bente Maalen</p>
+ <p><b>Production Sound Mixer:</b> Sander Jacobsson Skjegstad</p>
+ <p><b>Tlf:</b> +47 908 71 217</p>
+ <p><b>Boom Operator:</b> Lars Jakob Hesby</p>
+ </div>
+ <table>
+ <thead>
+ <tr class="header-tr">
+ <th class="current-sort">File Name</th>
+ <th>Scene</th>
+ <th>Take</th>
+ <th>Length</th>
+ <th>Start TC</th>
+ <th>Trk 1</th>
+ <th>Trk 2</th>
+ <th>Trk 3</th>
+ <th>Trk 4</th>
+ <th>Trk 5</th>
+ <th>Trk 6</th>
+ <th>Trk 7</th>
+ <th>Trk 8</th>
+ <th>Trk 9</th>
+ <th>Trk 10</th>
+ <th>Trk 11</th>
+ <th>Trk 12</th>
+ <th>Trk 13</th>
+ <th>Trk 14</th>
+ <th>Trk 15</th>
+ <th>Trk 16</th>
+ <th>Notes</th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>SL150T01.WAV</td>
+ <td>SL150</td>
+ <td>01</td>
+ <td>00:03:39</td>
+ <td>15:48:06:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL150T02.WAV</td>
+ <td>SL150</td>
+ <td>02</td>
+ <td>00:03:44</td>
+ <td>16:01:58:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL150T03.WAV</td>
+ <td>SL150</td>
+ <td>03</td>
+ <td>00:01:29</td>
+ <td>16:08:48:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL151T01.WAV</td>
+ <td>SL151</td>
+ <td>01</td>
+ <td>00:01:04</td>
+ <td>16:25:24:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL151T03.WAV</td>
+ <td>SL151</td>
+ <td>03</td>
+ <td>00:01:19</td>
+ <td>16:33:49:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL152T02.WAV</td>
+ <td>SL152</td>
+ <td>02</td>
+ <td>00:01:08</td>
+ <td>16:46:31:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL152T01.WAV</td>
+ <td>SL152</td>
+ <td>01</td>
+ <td>00:01:21</td>
+ <td>16:42:13:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL152T03.WAV</td>
+ <td>SL152</td>
+ <td>03</td>
+ <td>00:01:11</td>
+ <td>16:49:24:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL153T01.WAV</td>
+ <td>SL153</td>
+ <td>01</td>
+ <td>00:04:48</td>
+ <td>16:59:01:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL153T02.WAV</td>
+ <td>SL153</td>
+ <td>02</td>
+ <td>00:03:04</td>
+ <td>17:04:36:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL154T01.WAV</td>
+ <td>SL154</td>
+ <td>01</td>
+ <td>00:02:06</td>
+ <td>17:12:37:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL155T02.WAV</td>
+ <td>SL155</td>
+ <td>02</td>
+ <td>00:02:18</td>
+ <td>17:26:40:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL155T01.WAV</td>
+ <td>SL155</td>
+ <td>01</td>
+ <td>00:02:37</td>
+ <td>17:20:51:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL156T02.WAV</td>
+ <td>SL156</td>
+ <td>02</td>
+ <td>00:01:11</td>
+ <td>17:44:02:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL156T01.WAV</td>
+ <td>SL156</td>
+ <td>01</td>
+ <td>00:01:36</td>
+ <td>17:38:20:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL157T01.WAV</td>
+ <td>SL157</td>
+ <td>01</td>
+ <td>00:01:37</td>
+ <td>17:55:31:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ODD BJORN</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL158T02.WAV</td>
+ <td>SL158</td>
+ <td>02</td>
+ <td>00:01:13</td>
+ <td>18:35:14:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL158T01.WAV</td>
+ <td>SL158</td>
+ <td>01</td>
+ <td>00:01:09</td>
+ <td>18:29:09:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL158T03.WAV</td>
+ <td>SL158</td>
+ <td>03</td>
+ <td>00:01:18</td>
+ <td>18:39:45:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL158T04.WAV</td>
+ <td>SL158</td>
+ <td>04</td>
+ <td>00:01:23</td>
+ <td>18:43:34:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL158T05.WAV</td>
+ <td>SL158</td>
+ <td>05</td>
+ <td>00:01:23</td>
+ <td>18:45:24:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL159T01.WAV</td>
+ <td>SL159</td>
+ <td>01</td>
+ <td>00:00:58</td>
+ <td>18:56:00:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL159T02.WAV</td>
+ <td>SL159</td>
+ <td>02</td>
+ <td>00:01:30</td>
+ <td>19:00:16:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL160T01.WAV</td>
+ <td>SL160</td>
+ <td>01</td>
+ <td>00:00:41</td>
+ <td>19:14:57:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL160T02.WAV</td>
+ <td>SL160</td>
+ <td>02</td>
+ <td>00:00:34</td>
+ <td>19:18:07:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>LED NOISE AT 6 KHZ 11.8 KHZ 17.75 KHZ</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL161T01.WAV</td>
+ <td>SL161</td>
+ <td>01</td>
+ <td>00:01:49</td>
+ <td>20:18:40:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL161T02.WAV</td>
+ <td>SL161</td>
+ <td>02</td>
+ <td>00:01:54</td>
+ <td>20:28:18:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL162T01.WAV</td>
+ <td>SL162</td>
+ <td>01</td>
+ <td>00:01:54</td>
+ <td>20:38:31:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL163T01.WAV</td>
+ <td>SL163</td>
+ <td>01</td>
+ <td>00:02:13</td>
+ <td>20:44:45:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL163T02.WAV</td>
+ <td>SL163</td>
+ <td>02</td>
+ <td>00:02:02</td>
+ <td>20:48:55:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL164T01.WAV</td>
+ <td>SL164</td>
+ <td>01</td>
+ <td>00:02:24</td>
+ <td>20:54:38:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL165T01.WAV</td>
+ <td>SL165</td>
+ <td>01</td>
+ <td>00:01:45</td>
+ <td>21:14:07:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL165T02.WAV</td>
+ <td>SL165</td>
+ <td>02</td>
+ <td>00:01:54</td>
+ <td>21:19:25:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL168T01.WAV</td>
+ <td>SL168</td>
+ <td>01</td>
+ <td>00:02:29</td>
+ <td>21:54:29:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL166T01.WAV</td>
+ <td>SL166</td>
+ <td>01</td>
+ <td>00:03:43</td>
+ <td>21:26:16:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>BEATBOX LEGEND</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL167T01.WAV</td>
+ <td>SL167</td>
+ <td>01</td>
+ <td>00:00:53</td>
+ <td>21:37:23:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>WILD OF ERIK SAYING ANNI</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL166T02.WAV</td>
+ <td>SL166</td>
+ <td>02</td>
+ <td>00:02:51</td>
+ <td>21:31:50:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td>ERIK</td>
+ <td></td>
+ <td></td>
+ <td>PLANT PRINTER</td>
+ <td>PLANT SCREEN</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL168T02.WAV</td>
+ <td>SL168</td>
+ <td>02</td>
+ <td>00:03:07</td>
+ <td>22:01:12:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL170T01.WAV</td>
+ <td>SL170</td>
+ <td>01</td>
+ <td>00:01:39</td>
+ <td>22:23:20:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL169T02.WAV</td>
+ <td>SL169</td>
+ <td>02</td>
+ <td>00:00:38</td>
+ <td>22:13:49:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL169T01.WAV</td>
+ <td>SL169</td>
+ <td>01</td>
+ <td>00:03:47</td>
+ <td>22:10:02:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL171T01.WAV</td>
+ <td>SL171</td>
+ <td>01</td>
+ <td>00:01:16</td>
+ <td>22:44:02:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL171T02.WAV</td>
+ <td>SL171</td>
+ <td>02</td>
+ <td>00:01:04</td>
+ <td>22:46:57:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL171T03.WAV</td>
+ <td>SL171</td>
+ <td>03</td>
+ <td>00:00:59</td>
+ <td>22:49:45:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL171T04.WAV</td>
+ <td>SL171</td>
+ <td>04</td>
+ <td>00:01:14</td>
+ <td>22:50:49:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>SL172T01.WAV</td>
+ <td>SL172</td>
+ <td>01</td>
+ <td>00:00:48</td>
+ <td>22:53:19:00</td>
+ <td>MixL</td>
+ <td>MixR</td>
+ <td>BOOM</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>ANNI</td>
+ <td></td>
+ <td>ELLA</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+</body>
+
+<script type="text/javascript">
+ const getCellValue = (tr, idx) => tr.children[idx].innerText || tr.children[idx].textContent;
+
+ const comparer = (idx, asc) => (a, b) => ((v1, v2) =>
+ v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2)
+ )(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));
+
+ function doSort(th) {
+ console.log("Doing sort to: ", th.textContent, th)
+ const table = th.closest('table');
+ Array.from(table.querySelector('tbody').querySelectorAll('tr:nth-child(n)'))
+ .sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc))
+ .forEach(tr => table.querySelector('tbody').appendChild(tr) );
+ }
+ // do the work...
+ document.querySelectorAll('th').forEach(th => th.addEventListener('click', (() => {
+ document.getElementsByClassName("current-sort")[0].classList.remove("current-sort");
+ th.classList.add("current-sort");
+ doSort(th);
+ })));
+
+ doSort(document.getElementsByClassName("current-sort")[0]);
+
+</script>
+
+</html> \ No newline at end of file
diff --git a/start.html b/start.html
new file mode 100755
index 0000000..a1e9809
--- /dev/null
+++ b/start.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html lang="en">
+
+
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <title> \ No newline at end of file
diff --git a/start2.html b/start2.html
new file mode 100755
index 0000000..bd0021e
--- /dev/null
+++ b/start2.html
@@ -0,0 +1,103 @@
+</title>
+
+ <link rel="icon" href="/favicon.ico">
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
+
+
+ <style>
+ html {
+ color: white;
+ background: #141414;
+ font-family: sans-serif;
+ }
+ td {
+ padding: 3px 6px;
+ background: #181818;
+ border-radius: 3px;
+ border: #ffffff0d solid 1px;
+ }
+ th {
+ border-radius: 3px;
+ padding: 5px 3px;
+ cursor: pointer;
+ font-weight: bold;
+ }
+ thead {
+ top: 0;
+ position: sticky;
+ background: #141414;
+ outline: #fff1 solid 1px 1px 1px 3px;
+ }
+ .main-container {
+ width: max-content;
+ display: block;
+ margin: auto;
+ }
+ .header-tr {
+ border-bottom: solid 1px #fff3;
+ }
+ .current-sort {
+ background: #424;
+ }
+ .prelude {
+ background: #ffffff0c;
+ padding: 20px;
+ margin-bottom: 5px;
+ border-radius: 4px;
+ display: flex;
+ }
+ .prelude p {
+ margin: 2px 0px;
+ }
+ .prelude b {
+
+ }
+ svg {
+ filter: invert();
+ display: block;
+ margin: auto;
+ }
+ h1 {
+ font-size: 16px;
+ margin-top: 3px;
+ margin-bottom: 10px;
+ }
+ h6 {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ a {
+ color: #c0f;
+ text-underline: 0px;
+ }
+ .logo-section {
+ width: min-content;
+ margin-right: 15px;
+ }
+ </style>
+
+
+</head>
+
+
+
+<body>
+
+ <div class="main-container">
+ <div class="prelude">
+ <div class="logo-section">
+ <a href="https://knektlyd.no/">
+ <svg width="110px" viewBox="0 0 123 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+ <g id="_3a" serif:id="3a">
+ <path id="path29537-1" d="M32.013,29.14L26.457,35.565L20.22,30.123L20.22,19.276L11.868,19.276L11.868,30.236L4.271,35.641L4.271,7.332L0,7.332L4.346,1.436L11.868,1.436L11.868,18.369L20.22,12.775L20.22,4.838L27.704,0L27.704,13.307L22.017,17.116L27.704,17.116L27.704,29.14L32.013,29.14Z" style="fill-rule:nonzero;"/>
+ <path id="path29539-2" d="M57.827,29.14L53.783,35.565L47.282,29.972L47.282,15.118L40.554,15.118L40.554,29.14L44.561,29.14L40.554,35.565L34.016,29.972L34.016,11.906L40.517,8.655L40.517,14.287L46.224,8.655L53.783,14.287L53.783,29.14L57.827,29.14Z" style="fill-rule:nonzero;"/>
+ <path id="path29541-7" d="M77.783,20.334L65.953,25.058L65.953,29.14L75.591,29.14L71.093,35.565L59.339,31.408L59.339,15.118L68.032,8.655L77.783,14.06L77.783,20.334ZM71.811,18.622L71.811,15.118L65.953,15.118L65.953,20.976L71.811,18.622Z" style="fill-rule:nonzero;"/>
+ <path id="path29543-0" d="M104.503,29.178L100.459,35.641L93.883,30.009L93.883,21.543L87.609,21.543L93.883,15.118L87.231,15.118L87.231,29.14L91.275,29.14L87.231,35.565L80.768,29.972L80.768,3.25L87.231,0L87.231,14.287L91.464,10.091L100.459,10.091L94.827,15.836L100.459,20.712L100.459,29.178L104.503,29.178Z" style="fill-rule:nonzero;"/>
+ <path id="path29545-9" d="M121.889,10.091L118.261,15.118L113.536,15.118L113.536,29.178L117.58,29.178L113.536,35.565L107.073,29.972L107.073,15.118L102.5,15.118L113.536,4.044L113.536,10.091L121.889,10.091Z" style="fill-rule:nonzero;"/>
+ </g>
+ </svg>
+ </a>
+ <h1 style="width:max-content;margin:auto;">Lydrapport</h1>
+ <h6 style="width:max-content;margin:auto;">Version 0.2</h6>
+ </div>
+ <div class="info-section"> \ No newline at end of file