diff --git a/.gitignore b/.gitignore
index b5f2439..d8c050d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@ schedule.de.xml
snapshot-*.png
env
.DS_Store
+*/thumbs
diff --git a/.pep8 b/.pep8
deleted file mode 100644
index a2d556f..0000000
--- a/.pep8
+++ /dev/null
@@ -1,2 +0,0 @@
-[pycodestyle]
-max_line_length = 99
diff --git a/00_example_render_byid/__init__.py b/00_example_render_byid/__init__.py
index f066308..7c6874b 100644
--- a/00_example_render_byid/__init__.py
+++ b/00_example_render_byid/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/13np/__init__.py b/13np/__init__.py
index 095c17a..2747d5b 100644
--- a/13np/__init__.py
+++ b/13np/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/14np/__init__.py b/14np/__init__.py
index 4e0ebb5..ad50022 100644
--- a/14np/__init__.py
+++ b/14np/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/16c3/__init__.py b/16c3/__init__.py
index 4c1ae0a..98c1fc7 100644
--- a/16c3/__init__.py
+++ b/16c3/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/1c2/__init__.py b/1c2/__init__.py
index 05d4915..c49e297 100644
--- a/1c2/__init__.py
+++ b/1c2/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from itertools import zip_longest
# URL to Schedule-XML
diff --git a/30-jahre-btx/__init__.py b/30-jahre-btx/__init__.py
index 86192ca..54e55f8 100644
--- a/30-jahre-btx/__init__.py
+++ b/30-jahre-btx/__init__.py
@@ -3,7 +3,6 @@
import svg.path, random
from lxml import etree
from renderlib import *
-from schedulelib import *
def introFrames(p):
frames = 0
diff --git a/32c3sz/__init__.py b/32c3sz/__init__.py
index f29f4c5..e6f4557 100644
--- a/32c3sz/__init__.py
+++ b/32c3sz/__init__.py
@@ -2,7 +2,6 @@
import subprocess
from renderlib import *
-from schedulelib import *
def pyconFrames(params):
frames = 500
diff --git a/36c3/__init__.py b/36c3/__init__.py
index 9a1c16b..b6287b3 100644
--- a/36c3/__init__.py
+++ b/36c3/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
diff --git a/DS2016/__init__.py b/DS2016/__init__.py
index 10eeb17..3fcc4dc 100644
--- a/DS2016/__init__.py
+++ b/DS2016/__init__.py
@@ -3,9 +3,7 @@
from lxml import etree
from slugify import slugify
from renderlib import *
-from schedulelib import *
from renderlib import *
-from schedulelib import *
from easing import *
diff --git a/README.md b/README.md
index 7143770..2d5ef38 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ Yes! That's what I want!
------------------------
Okay, let's go.
- - Install python3, python3-lxml, python3-cssutils, python3-wand (or use virtualenv, see below), inkscape and libav-tools
+ - Install python3, python3-lxml, python3-cssutils (or use virtualenv, see below), inkscape and libav-tools
- Fork this repo on github and clone your personal fork to your local system.
- Copy one of the existing setup: 00_example_render_byid
- If you are using a newer version of intro-outro-generator, don't copy any of the other projects, as the __init.py__ may not contain all mandatory parameters in the tasks function.
@@ -28,7 +28,7 @@ Okay, let's go.
- search for `def debug()` and comment the sections about outro (postroll) and pause
- run `./make.py yourproject/ --debug` to generate your first intro
- if it looks good, duplicate intro.svg to outro.svg (postroll) and pause.svg (pause-loop) and modify them according to your needs. You can use different IDs in your SVG if required
- - modify outroFrames and pauseFrames like before and test them using `./make.py yourproject/ --debug`
+ - modify outroFrames and pauseFrames like before an test them using `./make.py yourproject/ --debug`
- if everything look like you'd want them to, run `./make.py yourproject/`.
- You can use any debianesque linux (can be headless) to generate the videos. More cores help more.
- Run `./make-snapshots.sh yourproject/` to generate a png from a specific time-index of your .ts or .dv-files. You can run `./make-snapshots.sh yourproject/ 5` to get a png for the frame at the 5th second of all your clips. Default is 3 seconds.
@@ -109,7 +109,7 @@ The animation sequence is controlled by the three frame-generator routines vorsp
### CSS-Style-Modifications
`('logo', 'style', 'opacity', 1),` - locate object with id `logo` in the svg, parse its `style`-attribute as css-inline-string and change the value of the css-property `opacity` to 1. The Tupel-Element `'style'` is fixed and declares the type of action which is applied to the specified element. All other tupel-mebers can be modified to suit your needs.
-To form a fade-in-opacity-animation, the frame-generator could look like this:
+To form an fade-in-opacity-animation, the frame-generator could look like this:
# three seconds of animation
frames = 3*fps
@@ -150,7 +150,7 @@ FEM/VOC-Tracker-Integration
*that script-Z-thingy*
The [FEM](http://fem.tu-ilmenau.de/) and the [VOC](https://c3voc.de/) uses a special Ticket-Tracker to keep track of the Talks on an event. Various tasks are performed around the recorded Videomaterial (preparing, cutting, encoding, releasing) - synchronized by the Tracker. The files starting with `script-Z` are experiments to integrate the intro-rendering into this process. On some Events the Schedule is very fluid with talks being addes or names changing over the whole conference. Using the Scripts to render the prerols when they are actually needed (and not some days before the conference) would help to get the always-freshest prerolls but it would an additional (computational intense) task to the publishing process.
-Generating a Live-Stream-Overlay
+Generating an Live-Stream-Overlay
---------------------------------
While your working on your Video-Artwork you can create another required asset: the stream overlay. When we'll live-stream your Talks we can't send prerolls ovet the live-stream. To let your viewer now what program they are watching at, we usually overlay a transparent image over the live-stream like most television programs do, too.
Just create another SVG of the size 1920×1080 (or 1024×576 if you're only targeting the legacy SD-Pipeline) and throw your logo into your prefered corner. To have it looking good we would suggest
diff --git a/afu-tm18/__init__.py b/afu-tm18/__init__.py
index 20c220c..8453d2d 100644
--- a/afu-tm18/__init__.py
+++ b/afu-tm18/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/afu/__init__.py b/afu/__init__.py
index 2c05c87..c26fe21 100644
--- a/afu/__init__.py
+++ b/afu/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
def introFrames(p):
diff --git a/archconf2020/__init__.py b/archconf2020/__init__.py
index 1d08f63..4690ed7 100644
--- a/archconf2020/__init__.py
+++ b/archconf2020/__init__.py
@@ -320,7 +320,7 @@ def debug():
def tasks(queue, args, idlist, skiplist):
# iterate over all events extracted from the schedule xml-export
- for event in schedulelib.events(scheduleUrl):
+ for event in renderlib.events(scheduleUrl):
if not (idlist == []):
if 000000 in idlist:
print("skipping id (%s [%s])" % (event["title"], event["id"]))
diff --git a/asg2017/__init__.py b/asg2017/__init__.py
index 3ee089c..39c9297 100644
--- a/asg2017/__init__.py
+++ b/asg2017/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/asg2019/__init__.py b/asg2019/__init__.py
index b640e45..f12d7a5 100644
--- a/asg2019/__init__.py
+++ b/asg2019/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/bornhack2021/__init__.py b/bornhack2021/__init__.py
index 4659a8a..45c88ad 100644
--- a/bornhack2021/__init__.py
+++ b/bornhack2021/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
import math
diff --git a/bub2018/__init__.py b/bub2018/__init__.py
index 6771e62..ee3528e 100644
--- a/bub2018/__init__.py
+++ b/bub2018/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
import math
diff --git a/camp1999/__init__.py b/camp1999/__init__.py
index b7aaae4..c1ee07e 100644
--- a/camp1999/__init__.py
+++ b/camp1999/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
# URL to Schedule-XML
scheduleUrl = 'http://annaberg6.de/stuff/camp99/schedule.xml'
diff --git a/camp2023/beon.ttf b/camp2023/beon.ttf
deleted file mode 100644
index 525497f..0000000
Binary files a/camp2023/beon.ttf and /dev/null differ
diff --git a/camp2023/config.ini b/camp2023/config.ini
deleted file mode 100644
index e8c7ab6..0000000
--- a/camp2023/config.ini
+++ /dev/null
@@ -1,35 +0,0 @@
-[meta]
-schedule = https://pretalx.c3voc.de/camp2023/schedule/export/schedule.xml
-template = intro.mp4
-alpha = false
-prores = false
-inout_type = t
-
-[title]
-in = 16
-out = 24
-fontfile = saira.ttf
-fontsize = 100
-fontcolor = #FB48C4
-x = (w-text_w)/2
-y = 100
-
-[speaker]
-in = 16
-out = 24
-fontfile = saira.ttf
-fontsize = 70
-fontcolor = #3FFF21
-x = (w-text_w)/2
-y = 800
-
-[text]
-in = 16
-out = 24
-fontfile = saira.ttf
-fontsize = 45
-fontcolor = #FB48C4
-x = (w-text_w)/2
-y = 1000
-text = Chaos Communication Camp 2023
-
diff --git a/camp2023/saira.ttf b/camp2023/saira.ttf
deleted file mode 100644
index df08ba0..0000000
Binary files a/camp2023/saira.ttf and /dev/null differ
diff --git a/cc15/__init__.py b/cc15/__init__.py
index d96c15d..c48bacc 100644
--- a/cc15/__init__.py
+++ b/cc15/__init__.py
@@ -2,7 +2,6 @@
import subprocess
from renderlib import *
-from schedulelib import *
# URL to Schedule-XML
scheduleUrl = 'http://www.fossgis.de/konferenz/2014/programm/schedule.de.xml'
diff --git a/cccamp15/__init__.py b/cccamp15/__init__.py
index 5dcca26..865cf61 100644
--- a/cccamp15/__init__.py
+++ b/cccamp15/__init__.py
@@ -2,7 +2,6 @@
import random, sys
from renderlib import *
-from schedulelib import *
from easing import *
from colour import Color
diff --git a/cccamp19/config.ini b/cccamp19/config.ini
index d723d7d..f3c0668 100644
--- a/cccamp19/config.ini
+++ b/cccamp19/config.ini
@@ -1,14 +1,13 @@
-[meta]
+[default]
schedule = https://fahrplan.events.ccc.de/camp/2019/Fahrplan/schedule.xml
template = cccamp19_talks_intro_1080p.mov
alpha = true
prores = true
-inout_type = n
[title]
in = 193
out = 324
-fontfile = Marvel-Bold.ttf
+font = Marvel-Bold.ttf
fontsize = 120
fontcolor = #c68100
x = (w-text_w)/2
@@ -17,7 +16,7 @@ y = 480
[speaker]
in = 233
out = 324
-fontfile = Marvel-Regular.ttf
+font = Marvel-Regular.ttf
fontsize = 70
fontcolor = #c68100
x = (w-text_w)/2
@@ -26,10 +25,10 @@ y = 845
[text]
in = 242
out = 324
-fontfile = Marvel-Regular.ttf
+font = Marvel-Regular.ttf
fontsize = 45
fontcolor = #c68100
x = (w-text_w)/2
y = 927
-text = chaos communication camp 2019
+text = 'chaos communication camp 2019'
diff --git a/chaosradio/__init__.py b/chaosradio/__init__.py
index 0da241f..684d686 100644
--- a/chaosradio/__init__.py
+++ b/chaosradio/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
scheduleUrl = ""
diff --git a/coreboot16/__init__.py b/coreboot16/__init__.py
index 6d1ed7a..b4266b9 100644
--- a/coreboot16/__init__.py
+++ b/coreboot16/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/datengarten/__init__.py b/datengarten/__init__.py
index b9842aa..79f55f6 100644
--- a/datengarten/__init__.py
+++ b/datengarten/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
scheduleUrl = "https://berlin.ccc.de/datengarten/index.xml"
diff --git a/denog11/config.ini b/denog11/config.ini
index 89c8096..20367cd 100644
--- a/denog11/config.ini
+++ b/denog11/config.ini
@@ -1,14 +1,13 @@
-[meta]
+[default]
schedule = https://pretalx.denog.de/denog11/schedule/export/schedule.xml
template = denog11_intro_template.ts
alpha = false
prores = false
-inout_type = n
[title]
in = 1
out = 6.5
-fontfile = DejaVuSans.ttf
+font = DejaVuSans.ttf
fontsize = 100
fontcolor = #f9cc12
x = 640
@@ -17,7 +16,7 @@ y = 200
[speaker]
in = 2
out = 6.5
-fontfile = DejaVuSans.ttf
+font = DejaVuSans.ttf
fontsize = 60
fontcolor = #ffffff
x = 640
@@ -26,10 +25,10 @@ y = 900
[text]
in = 3
out = 6.5
-fontfile = DejaVuSans.ttf
+font = DejaVuSans.ttf
fontsize = 45
fontcolor = #ffffff
x = 640
y = 1000
-; text =
+text = ''
diff --git a/denog7/__init__.py b/denog7/__init__.py
index eaa074b..2869b02 100644
--- a/denog7/__init__.py
+++ b/denog7/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/denog8/__init__.py b/denog8/__init__.py
index eaa074b..2869b02 100644
--- a/denog8/__init__.py
+++ b/denog8/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/divoc-hs/__init__.py b/divoc-hs/__init__.py
index 208644f..1cd54e9 100644
--- a/divoc-hs/__init__.py
+++ b/divoc-hs/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/divoc-ptt/__init__.py b/divoc-ptt/__init__.py
index 83a8869..f7092df 100644
--- a/divoc-ptt/__init__.py
+++ b/divoc-ptt/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/ds14/__init__.py b/ds14/__init__.py
index f1f65e5..90c8031 100644
--- a/ds14/__init__.py
+++ b/ds14/__init__.py
@@ -4,7 +4,6 @@ import svg.path, random
from lxml import etree
from slugify import slugify
from renderlib import *
-from schedulelib import *
# URL to Schedule-XML
scheduleUrl = 'https://www.datenspuren.de/2014/fahrplan/schedule.xml'
diff --git a/easing.py b/easing.py
index a7deb10..c362019 100644
--- a/easing.py
+++ b/easing.py
@@ -4,233 +4,208 @@
import math
-
def easeLinear(t, b, c, d):
- return c*t/d + b
+ return c*t/d + b
def easeOutCubic(t, b, c, d):
- t = float(t)/d-1
- return c*((t)*t*t + 1) + b
-
+ t=float(t)/d-1
+ return c*((t)*t*t + 1) + b
def easeInCubic(t, b, c, d):
- t = float(t)/d
- return c*(t)*t*t + b
+ t=float(t)/d
+ return c*(t)*t*t + b;
def easeInQuad(t, b, c, d):
- t /= d
- return c*t*t + b
-
+ t /= d
+ return c*t*t + b
def easeOutQuad(t, b, c, d):
- t /= d
- return -c * t*(t-2) + b
-
+ t /= d
+ return -c * t*(t-2) + b
def easeInOutQuad(t, b, c, d):
- t /= d/2
- if t < 1:
- return c/2*t*t + b
- t -= 1
- return -c/2 * (t*(t-2) - 1) + b
+ t /= d/2
+ if t < 1:
+ return c/2*t*t + b
+ t-=1
+ return -c/2 * (t*(t-2) - 1) + b
def easeInOutCubic(t, b, c, d):
- t /= d/2
- if t < 1:
- return c/2*t*t*t + b
- t -= 2
- return c/2*(t*t*t + 2) + b
-
+ t /= d/2
+ if t < 1:
+ return c/2*t*t*t + b
+ t -= 2
+ return c/2*(t*t*t + 2) + b
def easeInQuart(t, b, c, d):
- t /= d
- return c*t*t*t*t + b
-
+ t /= d
+ return c*t*t*t*t + b
def easeOutQuart(t, b, c, d):
- t /= d
- t -= 1
- return -c * (t*t*t*t - 1) + b
-
+ t /= d
+ t -= 1
+ return -c * (t*t*t*t - 1) + b
def easeInOutQuart(t, b, c, d):
- t /= d/2
- if t < 1:
- return c/2*t*t*t*t + b
- t -= 2
- return -c/2 * (t*t*t*t - 2) + b
-
+ t /= d/2
+ if t < 1:
+ return c/2*t*t*t*t + b
+ t -= 2
+ return -c/2 * (t*t*t*t - 2) + b
def easeInQuint(t, b, c, d):
- t /= d
- return c*t*t*t*t*t + b
-
+ t /= d
+ return c*t*t*t*t*t + b
def easeOutQuint(t, b, c, d):
- t /= d
- t -= 1
- return c*(t*t*t*t*t + 1) + b
-
+ t /= d
+ t -= 1
+ return c*(t*t*t*t*t + 1) + b
def easeInOutQuint(t, b, c, d):
- t /= d/2
- if t < 1:
- return c/2*t*t*t*t*t + b
- t -= 2
- return c/2*(t*t*t*t*t + 2) + b
-
+ t /= d/2
+ if t < 1:
+ return c/2*t*t*t*t*t + b
+ t -= 2
+ return c/2*(t*t*t*t*t + 2) + b
def easeInSine(t, b, c, d):
- return -c * math.cos(t/d * (math.pi/2)) + c + b
-
+ return -c * math.cos(t/d * (math.pi/2)) + c + b
def easeOutSine(t, b, c, d):
- return c * math.sin(t/d * (math.pi/2)) + b
+ return c * math.sin(t/d * (math.pi/2)) + b
def easeInOutSine(t, b, c, d):
- return -c/2 * (math.cos(math.pi*t/d) - 1) + b
-
+ return -c/2 * (math.cos(math.pi*t/d) - 1) + b
def easeInExpo(t, b, c, d):
- return c * math.pow(2, 10 * (t/d - 1)) + b
-
+ return c * math.pow( 2, 10 * (t/d - 1) ) + b
def easeOutExpo(t, b, c, d):
- return c * (-math.pow(2, -10 * t/d) + 1) + b
+ return c * ( -math.pow( 2, -10 * t/d ) + 1 ) + b
def easeInOutExpo(t, b, c, d):
- t /= d/2
- if t < 1:
- return c/2 * math.pow(2, 10 * (t - 1)) + b
- t -= 1
- return c/2 * (-math.pow(2, -10 * t) + 2) + b
-
+ t /= d/2
+ if t < 1:
+ return c/2 * math.pow( 2, 10 * (t - 1) ) + b
+ t -= 1
+ return c/2 * ( -math.pow( 2, -10 * t) + 2 ) + b
def easeInCirc(t, b, c, d):
- t /= d
- return -c * (math.sqrt(1 - t*t) - 1) + b
-
+ t /= d
+ return -c * (math.sqrt(1 - t*t) - 1) + b
def easeOutCirc(t, b, c, d):
- t /= d
- t -= 1
- return c * math.sqrt(1 - t*t) + b
-
+ t /= d;
+ t -= 1
+ return c * math.sqrt(1 - t*t) + b
def easeInOutCirc(t, b, c, d):
- t /= d/2
- if t < 1:
- return -c/2 * (math.sqrt(1 - t*t) - 1) + b
- t -= 2
- return c/2 * (math.sqrt(1 - t*t) + 1) + b
+ t /= d/2
+ if t < 1:
+ return -c/2 * (math.sqrt(1 - t*t) - 1) + b
+ t -= 2
+ return c/2 * (math.sqrt(1 - t*t) + 1) + b
-def easeInElastic(t, b, c, d, s=1.70158):
- a = c
+def easeInElastic(t, b, c, d, s = 1.70158):
+ a = c
- if t == 0:
- return b
- t /= d
- if t == 1:
- return b + c
+ if t == 0:
+ return b
+ t /= d
+ if t == 1:
+ return b + c
- p = d * 0.3
- if a < abs(c):
- a = c
- s = p / 4
- else:
- s = p / (2 * math.pi) * math.asin(c / a)
+ p = d * 0.3
+ if a < abs(c):
+ a = c
+ s = p / 4
+ else:
+ s = p / (2 * math.pi) * math.asin(c / a)
- t -= 1
- return -(a * pow(2, 10 * t) * math.sin((t * d - s) * (2 * math.pi) / p)) + b
+ t -= 1
+ return -(a * pow(2, 10 * t) * math.sin((t * d - s) * (2 * math.pi) / p)) + b
+def easeOutElastic(t, b, c, d, a = 1.70158):
+ if t == 0:
+ return b
+ t /= d
+ if t == 1:
+ return b + c
-def easeOutElastic(t, b, c, d, a=1.70158):
- if t == 0:
- return b
- t /= d
- if t == 1:
- return b + c
+ p = d * 0.3
+ if a < abs(c):
+ a, s = c, p / 4
+ else:
+ s = p / (2 * math.pi) * math.asin(c / a)
- p = d * 0.3
- if a < abs(c):
- a, s = c, p / 4
- else:
- s = p / (2 * math.pi) * math.asin(c / a)
+ return a * pow(2, -10 * t) * math.sin((t * d - s) * (2 * math.pi) / p) + c + b
- return a * pow(2, -10 * t) * math.sin((t * d - s) * (2 * math.pi) / p) + c + b
+def easeInOutElastic(t, b, c, d, a = 1.70158):
+ if t == 0:
+ return b
+ t /= (d / 2)
+ if t == 2:
+ return b + c
+ p = d * (0.3 * 1.5)
+ if a < abs(c):
+ a, s = c, p / 4
+ else:
+ s = p / (2 * math.pi) * math.asin(c / a)
-def easeInOutElastic(t, b, c, d, a=1.70158):
- if t == 0:
- return b
- t /= (d / 2)
- if t == 2:
- return b + c
+ if t < 1:
+ t -= 1
+ return -0.5 * (a * pow(2, 10 * t) * math.sin((t * d - s) * (2 * math.pi) / p)) + b
- p = d * (0.3 * 1.5)
- if a < abs(c):
- a, s = c, p / 4
- else:
- s = p / (2 * math.pi) * math.asin(c / a)
+ t -= 1
+ return a * pow(2, -10 * t) * math.sin((t * d - s) * (2 * math.pi) / p ) * 0.5 + c + b
- if t < 1:
- t -= 1
- return -0.5 * (a * pow(2, 10 * t) * math.sin((t * d - s) * (2 * math.pi) / p)) + b
+def easeInBack(t, b, c, d, s = 1.70158):
+ t /= d
+ return c * t * t * ((s + 1) * t - s) + b
- t -= 1
- return a * pow(2, -10 * t) * math.sin((t * d - s) * (2 * math.pi) / p) * 0.5 + c + b
+def easeOutBack(t, b, c, d, s = 1.70158):
+ t = t / d - 1
+ return c * (t * t * ((s + 1) * t + s) + 1) + b
+def easeInOutBack(t, b, c, d, s = 1.70158):
+ t /= d / 2
+ s *= 1.525
+ if t < 1:
+ return c / 2 * (t * t * ((s + 1) * t - s)) + b;
-def easeInBack(t, b, c, d, s=1.70158):
- t /= d
- return c * t * t * ((s + 1) * t - s) + b
-
-
-def easeOutBack(t, b, c, d, s=1.70158):
- t = t / d - 1
- return c * (t * t * ((s + 1) * t + s) + 1) + b
-
-
-def easeInOutBack(t, b, c, d, s=1.70158):
- t /= d / 2
- s *= 1.525
- if t < 1:
- return c / 2 * (t * t * ((s + 1) * t - s)) + b
-
- t -= 2
- return c/2 * (t * t * ((s + 1) * t + s) + 2) + b
-
+ t -= 2
+ return c/2 * (t * t * ((s + 1) * t + s) + 2) + b;
def easeInBounce(t, b, c, d):
- return c - easeOutBounce(d-t, 0, c, d) + b
-
+ return c - easeOutBounce(d-t, 0, c, d) + b;
def easeOutBounce(t, b, c, d):
- t /= d
- if t < (1/2.75):
- return c*(7.5625*t*t) + b
+ t /= d
+ if t < (1/2.75):
+ return c*(7.5625*t*t) + b;
- elif t < (2/2.75):
- t -= (1.5/2.75)
- return c*(7.5625*t*t + 0.75) + b
+ elif t < (2/2.75):
+ t -= (1.5/2.75)
+ return c*(7.5625*t*t + 0.75) + b;
- elif t < (2.5/2.75):
- t -= (2.25/2.75)
- return c*(7.5625*t*t + 0.9375) + b
-
- else:
- t -= (2.625/2.75)
- return c*(7.5625*t*t + 0.984375) + b
+ elif t < (2.5/2.75):
+ t -= (2.25/2.75)
+ return c*(7.5625*t*t + 0.9375) + b;
+ else:
+ t -= (2.625/2.75)
+ return c*(7.5625*t*t + 0.984375) + b;
def easeInOutBounce(t, b, c, d):
- if t < d/2:
- return easeInBounce(t*2, 0, c, d) * .5 + b
+ if t < d/2:
+ return easeInBounce(t*2, 0, c, d) * .5 + b;
- return easeOutBounce(t*2-d, 0, c, d) * .5 + c*.5 + b
+ return easeOutBounce(t*2-d, 0, c, d) * .5 + c*.5 + b;
diff --git a/eh14/__init__.py b/eh14/__init__.py
index 7373cae..9d302ff 100644
--- a/eh14/__init__.py
+++ b/eh14/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
import math
# URL to Schedule-XML
diff --git a/eh15/__init__.py b/eh15/__init__.py
index 1a612b8..443f443 100644
--- a/eh15/__init__.py
+++ b/eh15/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
# URL to Schedule-XML
scheduleUrl = 'https://eh15.easterhegg.eu/frab/en/eh15/public/schedule.xml'
diff --git a/eh17/__init__.py b/eh17/__init__.py
index 6538749..a45482c 100644
--- a/eh17/__init__.py
+++ b/eh17/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
import random
@@ -278,7 +277,7 @@ def tasks(queue, args, idlist, skiplist):
if event['id'] == 8496:
eventTitle = 'Know your tools - I’m firing my laser! -'
-
+
# generate a task description and put them into the queue
queue.put(Rendertask(
infile='intro.svg',
diff --git a/emf2016/__init__.py b/emf2016/__init__.py
index 942e8e2..cda51e3 100644
--- a/emf2016/__init__.py
+++ b/emf2016/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
@@ -32,7 +31,7 @@ def introFrames(p):
('text', 'style', 'opacity', easeLinear(i, 1, 0, frames)),
('bg', 'style', 'opacity', easeLinear(i, 1, 0, frames)),
)
-
+
frames = int(fps/2)
for i in range(0, frames):
yield (
@@ -41,7 +40,7 @@ def introFrames(p):
('text', 'style', 'opacity', 0),
('bg', 'style', 'opacity',0),
)
-
+
# Show Sponsor
frames = 5*fps
for i in range(0, frames):
diff --git a/emf2018/__init__.py b/emf2018/__init__.py
index 6147ce2..64f561f 100644
--- a/emf2018/__init__.py
+++ b/emf2018/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
@@ -16,13 +15,13 @@ def introFrames(p):
nr = p['$id'];
- # 1 Sekunde nix
+ # 1 Sekunde nix
frames = 1*fps
for i in range(0, frames):
givenFrame += 1
yield (
('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
- ('layer1', 'style', 'opacity', "%.4f" % 0), # nix
+ ('layer1', 'style', 'opacity', "%.4f" % 0), # nix
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
@@ -45,7 +44,7 @@ def introFrames(p):
('layer1', 'style', 'opacity', "%.4f" %1),
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
-
+
# 1 Sekunde Text Fadeout
frames = 1*fps
for i in range(0, frames):
@@ -55,7 +54,7 @@ def introFrames(p):
('layer1', 'style', 'opacity', "%.4f" % easeInQuad(i, 1, -1, frames)),
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
-
+
# Sponsors
frames = 187
for i in range(0, frames):
diff --git a/fiffkon/__init__.py b/fiffkon/__init__.py
index c535c32..e686fda 100644
--- a/fiffkon/__init__.py
+++ b/fiffkon/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
import math
# URL to Schedule-XML
diff --git a/fiffkon16/__init__.py b/fiffkon16/__init__.py
index 851dc2e..6b6600a 100644
--- a/fiffkon16/__init__.py
+++ b/fiffkon16/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
import math
diff --git a/fiffkon17/__init__.py b/fiffkon17/__init__.py
index 2979554..b8a13b1 100644
--- a/fiffkon17/__init__.py
+++ b/fiffkon17/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
import math
diff --git a/fiffkon18/__init__.py b/fiffkon18/__init__.py
index 5b0f51a..dfbf609 100644
--- a/fiffkon18/__init__.py
+++ b/fiffkon18/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
import math
diff --git a/fiffkon21/__init__.py b/fiffkon21/__init__.py
index 7afd707..2510aa0 100644
--- a/fiffkon21/__init__.py
+++ b/fiffkon21/__init__.py
@@ -2,7 +2,6 @@
# vim: tabstop=4 shiftwidth=4 expandtab
from renderlib import *
-from schedulelib import *
from easing import *
import math
diff --git a/forumoe/__init__.py b/forumoe/__init__.py
index ea0815b..1613807 100644
--- a/forumoe/__init__.py
+++ b/forumoe/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/forumoe19/__init__.py b/forumoe19/__init__.py
index c8c88a8..906ec4c 100644
--- a/forumoe19/__init__.py
+++ b/forumoe19/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/foss4g-2016/__init__.py b/foss4g-2016/__init__.py
index c37c272..0ba19a7 100644
--- a/foss4g-2016/__init__.py
+++ b/foss4g-2016/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/foss4g-2019/__init__.py b/foss4g-2019/__init__.py
index 81dea26..72da60e 100644
--- a/foss4g-2019/__init__.py
+++ b/foss4g-2019/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
@@ -161,7 +160,7 @@ def pauseFrames(params):
('text1', 'style', 'opacity', 0),
('text2', 'style', 'opacity', 0),
)
-
+
def debug():
render('intro.svg',
'../intro.ts',
diff --git a/fossgis14/__init__.py b/fossgis14/__init__.py
index 6008f08..b71e4cb 100644
--- a/fossgis14/__init__.py
+++ b/fossgis14/__init__.py
@@ -2,7 +2,6 @@
import subprocess
from renderlib import *
-from schedulelib import *
# URL to Schedule-XML
scheduleUrl = 'http://www.fossgis.de/konferenz/2014/programm/schedule.de.xml'
diff --git a/fossgis15/__init__.py b/fossgis15/__init__.py
index 562bfb6..ac2b287 100644
--- a/fossgis15/__init__.py
+++ b/fossgis15/__init__.py
@@ -2,7 +2,6 @@
import subprocess
from renderlib import *
-from schedulelib import *
# URL to Schedule-XML
scheduleUrl = 'http://www.fossgis.de/konferenz/2015/programm/schedule.de.xml'
diff --git a/fossgis16/__init__.py b/fossgis16/__init__.py
index c04f3d5..2cf3bf3 100644
--- a/fossgis16/__init__.py
+++ b/fossgis16/__init__.py
@@ -2,7 +2,6 @@
import subprocess
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/fossgis17/__init__.py b/fossgis17/__init__.py
index cd6958c..c79c77f 100644
--- a/fossgis17/__init__.py
+++ b/fossgis17/__init__.py
@@ -2,7 +2,6 @@
import subprocess
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/fossgis19/__init__.py b/fossgis19/__init__.py
index 3ab41ba..c64a235 100755
--- a/fossgis19/__init__.py
+++ b/fossgis19/__init__.py
@@ -2,7 +2,6 @@
import subprocess
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/fossgis20/__init__.py b/fossgis20/__init__.py
index 20bfd26..df64e9a 100644
--- a/fossgis20/__init__.py
+++ b/fossgis20/__init__.py
@@ -2,7 +2,6 @@
import subprocess
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/froscon2014/__init__.py b/froscon2014/__init__.py
index 9946a49..6fb9db8 100644
--- a/froscon2014/__init__.py
+++ b/froscon2014/__init__.py
@@ -3,7 +3,6 @@
import svg.path
from lxml import etree
from renderlib import *
-from schedulelib import *
# URL to Schedule-XML
scheduleUrl = 'http://programm.froscon.de/2014/schedule.xml'
diff --git a/froscon2015/__init__.py b/froscon2015/__init__.py
index 5c53afa..30f1adb 100644
--- a/froscon2015/__init__.py
+++ b/froscon2015/__init__.py
@@ -3,7 +3,6 @@
import svg.path
from lxml import etree
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/froscon2016/__init__.py b/froscon2016/__init__.py
index 06c3765..9d95357 100644
--- a/froscon2016/__init__.py
+++ b/froscon2016/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
diff --git a/froscon2017/__init__.py b/froscon2017/__init__.py
index 143ab25..92039d5 100644
--- a/froscon2017/__init__.py
+++ b/froscon2017/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
diff --git a/froscon2018/__init__.py b/froscon2018/__init__.py
index bdde5c5..6aa79ab 100644
--- a/froscon2018/__init__.py
+++ b/froscon2018/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
diff --git a/froscon2019/__init__.py b/froscon2019/__init__.py
index af6786a..6b77980 100644
--- a/froscon2019/__init__.py
+++ b/froscon2019/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
diff --git a/froscon2020/__init__.py b/froscon2020/__init__.py
index 37b0b4c..99787cf 100644
--- a/froscon2020/__init__.py
+++ b/froscon2020/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
diff --git a/froscon2021/__init__.py b/froscon2021/__init__.py
new file mode 100644
index 0000000..0f031e2
--- /dev/null
+++ b/froscon2021/__init__.py
@@ -0,0 +1,167 @@
+#!/usr/bin/python3
+
+import subprocess
+import os.path
+from renderlib import *
+from easing import *
+import svg.path
+
+# URL to Schedule-XML
+scheduleUrl = 'https://programm.froscon.de/2021/schedule.xml'
+
+# For (really) too long titles
+titlemap = {
+ #
+}
+
+
+def introFrames(args):
+ xml = etree.parse('froscon2021/artwork/intro.svg').getroot()
+ pathstr = xml.find(".//*[@id='animatePath']").get('d')
+ frog = xml.find(".//*[@id='animatePath']").get('d')
+ path = svg.path.parse_path(pathstr)
+
+ init = path.point(0)
+
+ frames = 3*fps
+ for i in range(0, frames):
+ p = path.point(i / frames) - init
+ yield (
+ ('animatePath', 'style', 'opacity', 0),
+ ('frog', 'attr', 'transform', 'translate(%.4f, %.4f)' % (p.real, p.imag+120)),
+ ('title', 'style', 'opacity', 0),
+ ('names', 'style', 'opacity', 0),
+ )
+
+ frames = int(0.5*fps)
+ for i in range(0, frames):
+ yield (
+ ('animatePath', 'style', 'opacity', 0),
+ ('frog', 'attr', 'transform', 'translate(%.4f, %.4f)' % (p.real, p.imag+120)),
+ ('title', 'style', 'opacity', easeLinear(i, 0, 1, frames)),
+ ('names', 'style', 'opacity', easeLinear(i, 0, 1, frames)),
+ )
+
+ frames = int(3.0*fps)
+ for i in range(0, frames):
+ yield (
+ ('animatePath', 'style', 'opacity', 0),
+ ('frog', 'attr', 'transform', 'translate(%.4f, %.4f)' % (p.real, p.imag+120)),
+ )
+
+def outroFrames(args):
+ xml = etree.parse('froscon2019/artwork/outro.svg').getroot()
+ pathstr = xml.find(".//*[@id='animatePath']").get('d')
+ frog = xml.find(".//*[@id='animatePath']").get('d')
+ path = svg.path.parse_path(pathstr)
+
+ init = path.point(0)
+
+ frames = int(4*fps)
+ for i in range(0, frames):
+ p = path.point(i / frames) - init
+ yield (
+ )
+
+def pauseFrames(args):
+ frames = 2*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', 1),
+ ('text2', 'style', 'opacity', 0),
+ )
+
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', easeLinear(i, 1, -1, frames)),
+ ('text2', 'style', 'opacity', 0),
+ )
+
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', 0),
+ ('text2', 'style', 'opacity', easeLinear(i, 0, 1, frames)),
+ )
+
+ frames = 2*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', 0),
+ ('text2', 'style', 'opacity', 1),
+ )
+
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', 0),
+ ('text2', 'style', 'opacity', easeLinear(i, 1, -1, frames)),
+ )
+
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', easeLinear(i, 0, 1, frames)),
+ ('text2', 'style', 'opacity', 0),
+ )
+
+def debug():
+ render('intro.svg',
+ '../intro.ts',
+ introFrames,
+ {
+ '$id': 2404,
+ '$title': 'Linux Container im High Performance Computing',
+ '$subtitle': 'Vom Wal zur Singularität und weiter',
+ '$personnames': 'Holger Gantikow'
+ }
+ )
+
+# render('outro.svg',
+# '../outro.ts',
+# outroFrames
+# )
+
+# render('pause.svg',
+# '../pause.ts',
+# pauseFrames
+# )
+
+
+def tasks(queue, args, idlist, skiplist):
+ # iterate over all events extracted from the schedule xml-export
+ for event in events(scheduleUrl):
+ if event['room'] not in ('HS 1/2', 'HS3', 'HS4', 'HS5', 'HS6', 'HS7', 'HS8', 'C116', 'Workshop'):
+ print("skipping room %s (%s)" % (event['room'], event['title']))
+ continue
+
+ if (event['id'] in idlist or not idlist) and not 'intro' in skiplist:
+ # generate a task description and put them into the queue
+ queue.put(Rendertask(
+ infile = 'intro.svg',
+ outfile = str(event['id'])+".ts",
+ sequence = introFrames,
+ parameters = {
+ '$id': event['id'],
+ '$title': event['title'],
+# '$subtitle': event['subtitle'],
+ '$personnames': event['personnames']
+ }
+ ))
+
+ if not 'outro' in skiplist:
+ # place a task for the outro into the queue
+ queue.put(Rendertask(
+ infile = 'outro.svg',
+ outfile = 'outro.ts',
+ sequence = outroFrames
+ ))
+
+ if not 'pause' in skiplist:
+ # place the pause-sequence into the queue
+ queue.put(Rendertask(
+ infile = 'pause.svg',
+ outfile = 'pause.ts',
+ sequence = pauseFrames
+ ))
diff --git a/froscon2021/artwork/background.svg b/froscon2021/artwork/background.svg
new file mode 100644
index 0000000..1a38199
--- /dev/null
+++ b/froscon2021/artwork/background.svg
@@ -0,0 +1,166 @@
+
+
+
+
diff --git a/froscon2021/artwork/intro.svg b/froscon2021/artwork/intro.svg
new file mode 100644
index 0000000..51c637a
--- /dev/null
+++ b/froscon2021/artwork/intro.svg
@@ -0,0 +1,891 @@
+
+
diff --git a/froscon2021/artwork/logo-bw.svg b/froscon2021/artwork/logo-bw.svg
new file mode 100644
index 0000000..f30babb
--- /dev/null
+++ b/froscon2021/artwork/logo-bw.svg
@@ -0,0 +1,208 @@
+
+
+
+
diff --git a/froscon2021/artwork/logo.svg b/froscon2021/artwork/logo.svg
new file mode 100644
index 0000000..a57e99c
--- /dev/null
+++ b/froscon2021/artwork/logo.svg
@@ -0,0 +1,222 @@
+
+
+
+
diff --git a/froscon2021/artwork/outro.svg b/froscon2021/artwork/outro.svg
new file mode 100644
index 0000000..d794053
--- /dev/null
+++ b/froscon2021/artwork/outro.svg
@@ -0,0 +1,551 @@
+
+
diff --git a/froscon2021/artwork/overlay.svg b/froscon2021/artwork/overlay.svg
new file mode 100644
index 0000000..60dc691
--- /dev/null
+++ b/froscon2021/artwork/overlay.svg
@@ -0,0 +1,183 @@
+
+
+
+
diff --git a/froscon2021/artwork/pause.svg b/froscon2021/artwork/pause.svg
new file mode 100644
index 0000000..de1efc2
--- /dev/null
+++ b/froscon2021/artwork/pause.svg
@@ -0,0 +1,478 @@
+
+
+
+
diff --git a/froscon2022/__init__.py b/froscon2022/__init__.py
index c14ae06..1c457ff 100644
--- a/froscon2022/__init__.py
+++ b/froscon2022/__init__.py
@@ -3,12 +3,11 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
import svg.path
# URL to Schedule-XML
-scheduleUrl = 'https://programm.froscon.de/2022/schedule.xml'
+scheduleUrl = 'https://bats.science/froscon2022/schedule.xml'
# For (really) too long titles
titlemap = {
diff --git a/froscon2022/artwork/intro.svg b/froscon2022/artwork/intro.svg
index a309733..19e733f 100644
--- a/froscon2022/artwork/intro.svg
+++ b/froscon2022/artwork/intro.svg
@@ -4,7 +4,7 @@
height="1080"
id="svg2"
version="1.1"
- inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
+ inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="intro.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
@@ -157,16 +157,16 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="0.55767043"
- inkscape:cx="846.37803"
- inkscape:cy="856.24049"
+ inkscape:zoom="0.51594277"
+ inkscape:cx="948.74864"
+ inkscape:cy="488.42626"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
- inkscape:window-width="3836"
- inkscape:window-height="1042"
- inkscape:window-x="2560"
- inkscape:window-y="1091"
+ inkscape:window-width="1916"
+ inkscape:window-height="1026"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true"
@@ -228,25 +228,25 @@
id="rect3809-1"
style="fill:#1f1fa3;fill-opacity:1;stroke-width:3.6841" />$title$personnames
diff --git a/froscon2023/__init__.py b/froscon2023/__init__.py
new file mode 100644
index 0000000..183fc52
--- /dev/null
+++ b/froscon2023/__init__.py
@@ -0,0 +1,160 @@
+#!/usr/bin/python3
+
+import subprocess
+import os.path
+from renderlib import *
+from easing import *
+import svg.path
+
+# URL to Schedule-XML
+scheduleUrl = 'https://bats.science/froscon2023/schedule.xml'
+
+# For (really) too long titles
+titlemap = {
+ #
+}
+
+
+def introFrames(args):
+ xml = etree.parse('froscon2023/artwork/intro.svg').getroot()
+ pathstr = xml.find(".//*[@id='animatePath']").get('d')
+ frog = xml.find(".//*[@id='animatePath']").get('d')
+ path = svg.path.parse_path(pathstr)
+
+ init = path.point(0)
+
+ frames = 3*fps
+ for i in range(0, frames):
+ p = path.point(i / frames) - init
+ yield (
+ ('animatePath', 'style', 'opacity', 0),
+ ('frog', 'attr', 'transform', 'translate(%.4f, %.4f)' % (p.real, p.imag+120)),
+ ('title', 'style', 'opacity', 0),
+ ('names', 'style', 'opacity', 0),
+ )
+
+# frames = int(0.5*fps)
+# for i in range(0, frames):
+# yield (
+# ('animatePath', 'style', 'opacity', 0),
+# ('frog', 'attr', 'transform', 'translate(%.4f, %.4f)' % (p.real, p.imag+120)),
+# ('title', 'style', 'opacity', easeLinear(i, 0, 1, frames)),
+# ('names', 'style', 'opacity', easeLinear(i, 0, 1, frames)),
+# )
+
+ frames = int(3.0*fps)
+ for i in range(0, frames):
+ yield (
+ ('animatePath', 'style', 'opacity', 0),
+ ('frog', 'attr', 'transform', 'translate(%.4f, %.4f)' % (p.real, p.imag+120)),
+ )
+
+def outroFrames(args):
+ xml = etree.parse('froscon2023/artwork/outro.svg').getroot()
+
+ frames = int(4*fps)
+ for i in range(0, frames):
+ yield ()
+
+def pauseFrames(args):
+ frames = 2*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', 1),
+ ('text2', 'style', 'opacity', 0),
+ )
+
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', easeLinear(i, 1, -1, frames)),
+ ('text2', 'style', 'opacity', 0),
+ )
+
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', 0),
+ ('text2', 'style', 'opacity', easeLinear(i, 0, 1, frames)),
+ )
+
+ frames = 2*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', 0),
+ ('text2', 'style', 'opacity', 1),
+ )
+
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', 0),
+ ('text2', 'style', 'opacity', easeLinear(i, 1, -1, frames)),
+ )
+
+ frames = 1*fps
+ for i in range(0, frames):
+ yield (
+ ('text1', 'style', 'opacity', easeLinear(i, 0, 1, frames)),
+ ('text2', 'style', 'opacity', 0),
+ )
+
+def debug():
+ render('intro.svg',
+ '../intro.ts',
+ introFrames,
+ {
+ '$id': 2404,
+ '$title': 'Linux Container im High Performance Computing',
+ '$subtitle': 'Vom Wal zur Singularität und weiter',
+ '$personnames': 'Holger Gantikow'
+ }
+ )
+
+# render('outro.svg',
+# '../outro.ts',
+# outroFrames
+# )
+
+# render('pause.svg',
+# '../pause.ts',
+# pauseFrames
+# )
+
+
+def tasks(queue, args, idlist, skiplist):
+ # iterate over all events extracted from the schedule xml-export
+ for event in events(scheduleUrl):
+ if event['room'] not in ('HS1', 'HS3', 'HS4', 'HS6', 'HS7', 'HS8'):
+ print("skipping room %s (%s)" % (event['room'], event['title']))
+ continue
+
+ if (event['id'] in idlist or not idlist) and not 'intro' in skiplist:
+ # generate a task description and put them into the queue
+ queue.put(Rendertask(
+ infile = 'intro.svg',
+ outfile = str(event['id'])+".ts",
+ sequence = introFrames,
+ parameters = {
+ '$id': event['id'],
+ '$title': event['title'],
+# '$subtitle': event['subtitle'],
+ '$personnames': event['personnames']
+ }
+ ))
+
+ if not 'outro' in skiplist:
+ # place a task for the outro into the queue
+ queue.put(Rendertask(
+ infile = 'outro.svg',
+ outfile = 'outro.ts',
+ sequence = outroFrames
+ ))
+
+ if not 'pause' in skiplist:
+ # place the pause-sequence into the queue
+ queue.put(Rendertask(
+ infile = 'pause.svg',
+ outfile = 'pause.ts',
+ sequence = pauseFrames
+ ))
diff --git a/froscon2023/artwork/background.svg b/froscon2023/artwork/background.svg
new file mode 100644
index 0000000..0f15119
--- /dev/null
+++ b/froscon2023/artwork/background.svg
@@ -0,0 +1,263 @@
+
+
+
+
diff --git a/froscon2023/artwork/intro.svg b/froscon2023/artwork/intro.svg
new file mode 100644
index 0000000..a0a1167
--- /dev/null
+++ b/froscon2023/artwork/intro.svg
@@ -0,0 +1,443 @@
+
+
diff --git a/froscon2023/artwork/outro.svg b/froscon2023/artwork/outro.svg
new file mode 100644
index 0000000..96358e9
--- /dev/null
+++ b/froscon2023/artwork/outro.svg
@@ -0,0 +1,584 @@
+
+
diff --git a/froscon2023/artwork/pause.svg b/froscon2023/artwork/pause.svg
new file mode 100644
index 0000000..2daff41
--- /dev/null
+++ b/froscon2023/artwork/pause.svg
@@ -0,0 +1,562 @@
+
+
+
+
diff --git a/froscon2023/genthumbs.sh b/froscon2023/genthumbs.sh
new file mode 100755
index 0000000..7db64d2
--- /dev/null
+++ b/froscon2023/genthumbs.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+rm -rf thumbs
+mkdir thumbs
+
+for intro in *.ts; do
+ echo $intro
+ ffmpeg -hide_banner -loglevel quiet -ss 4 -i "${intro}" -frames:v 1 "thumbs/${intro}.png"
+done
diff --git a/fusion16/__init__.py b/fusion16/__init__.py
index 17bd760..2acc41f 100644
--- a/fusion16/__init__.py
+++ b/fusion16/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/fusion18/__init__.py b/fusion18/__init__.py
index 0ce4ffb..0a75727 100644
--- a/fusion18/__init__.py
+++ b/fusion18/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/fusion19/__init__.py b/fusion19/__init__.py
index 0f5f245..f7b09ab 100644
--- a/fusion19/__init__.py
+++ b/fusion19/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/fusion22/__init__.py b/fusion22/__init__.py
index 21ff12d..04bb03f 100644
--- a/fusion22/__init__.py
+++ b/fusion22/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/glt19/__init__.py b/glt19/__init__.py
index 4580856..7c61455 100644
--- a/glt19/__init__.py
+++ b/glt19/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/glt22/__init__.py b/glt22/__init__.py
index afc95b2..1053f05 100644
--- a/glt22/__init__.py
+++ b/glt22/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/god2024/__init__.py b/god2024/__init__.py
deleted file mode 100644
index c04c938..0000000
--- a/god2024/__init__.py
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/python3
-
-from renderlib import *
-from schedulelib import *
-from easing import *
-
-# URL to Schedule-XML
-scheduleUrl = 'https://import.c3voc.de/schedule/god2024.xml?showall=yes'
-
-titlemap = {
-
-}
-
-def introFrames(p):
- givenFrame = 0
-
- nr = p['$id'];
-
- # 1 Sekunden nix
- frames = 1*fps
- for i in range(0, frames):
- givenFrame += 1
- yield (
- ('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
- ('layer1', 'style', 'opacity', "%.4f" % 0), # nix
- # ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
- )
-
- # 1 Sekunde Text Fadein
- frames = 1*fps
- for i in range(0, frames):
- givenFrame += 1
- yield (
- ('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
- ('layer1', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
- # ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
- )
-
- # 5 Sekunden Text
- frames = 5*fps
- for i in range(0, frames):
- givenFrame += 1
- yield (
- ('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
- ('layer1', 'style', 'opacity', "%.4f" %1),
- # ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
- )
-
-def outroFrames(p):
- xml = etree.parse('god2024/artwork/outro.svg').getroot()
-
- frames = int(5*fps)
- for i in range(0, frames):
- yield ()
-
-def pauseFrames(p):
- # 1 sekunden fade in
- frames = 1*fps
- for i in range(0, frames):
- yield (
- ('text1', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
- )
-
- # 1 sekunde sehen
- for i in range(0, frames):
- yield (
- ('text1', 'style', 'opacity', "%.4f" % 1),
- )
-
- # 1 sekunde fadeout
- for i in range(0, frames):
- yield (
- ('text1', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
- )
-
- # 1 sekunde bild
- for i in range(0, frames):
- yield (
- ('text1', 'style', 'opacity', "%.4f" % 0),
- )
-
-def debug():
- render(
- 'intro.svg',
- '../intro.ts',
- introFrames,
- {
- '$id': 65,
- '$title': 'OWASP Juice Shop 10th anniversary: Is it still fresh?'.upper(),
- '$subtitle': '',
- '$personnames': 'Jannik Hollenbach'.upper(),
- #'only_render_frame': 353
- 'only_rerender_frames_after': 225
- }
- )
-
- # render(
- # 'pause.svg',
- # '../pause.ts',
- # pauseFrames
- # )
-
-def tasks(queue, args, id_list, skip_list):
- if not 'outro' in skip_list:
- # place a task for the outro into the queue
- queue.put(Rendertask(
- infile = 'outro.svg',
- outfile = 'outro.ts',
- sequence = outroFrames
- ))
-
- if not 'pause' in skip_list:
- # place the pause-sequence into the queue
- queue.put(Rendertask(
- infile = 'pause.svg',
- outfile = 'pause.ts',
- sequence = pauseFrames
- ))
-
- # iterate over all events extracted from the schedule xml-export
- for event in events(scheduleUrl, titlemap):
-
- # skip events which will not be recorded
- if event['room'] not in ('Da Capo',) or event['track'] == 'Nomnom':
- print("skipping room %s (%s [%s])" % (event['room'], event['title'], event['id']))
- continue
-
- # when id_list is not empty, only render events which are in id_list
- if id_list and int(event['id']) not in id_list:
- print("skipping id (%s [%s])" % (event['title'], event['id']))
- continue
-
- # generate a task description and put them into the queue
- queue.put(Rendertask(
- infile = 'intro.svg',
- outfile = str(event['id']) + ".ts",
- sequence = introFrames,
- parameters = {
- '$id': event['id'],
- '$title': event['title'].upper(),
- '$subtitle': event['subtitle'],
- '$personnames': event['personnames'].upper(),
- }
- ))
-
diff --git a/god2024/artwork/intro.svg b/god2024/artwork/intro.svg
deleted file mode 100644
index 4a79ff0..0000000
--- a/god2024/artwork/intro.svg
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
diff --git a/god2024/artwork/outro.svg b/god2024/artwork/outro.svg
deleted file mode 100644
index 8097ff8..0000000
--- a/god2024/artwork/outro.svg
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
diff --git a/god2024/artwork/pause.svg b/god2024/artwork/pause.svg
deleted file mode 100644
index 6dd0f4e..0000000
--- a/god2024/artwork/pause.svg
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
diff --git a/gpn15/__init__.py b/gpn15/__init__.py
index 7effafb..f583648 100644
--- a/gpn15/__init__.py
+++ b/gpn15/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
# URL to Schedule-XML
scheduleUrl = 'http://bl0rg.net/~andi/gpn15-fahrplan/schedule.xml'
diff --git a/gpn16/__init__.py b/gpn16/__init__.py
index 9ac1b00..3f622a9 100644
--- a/gpn16/__init__.py
+++ b/gpn16/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/gpn20/__init__.py b/gpn20/__init__.py
index cd2d5e7..c2629d9 100644
--- a/gpn20/__init__.py
+++ b/gpn20/__init__.py
@@ -1,7 +1,6 @@
#!/usr/bin/python3
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
diff --git a/guadec16/__init__.py b/guadec16/__init__.py
index 14dee6b..e202707 100644
--- a/guadec16/__init__.py
+++ b/guadec16/__init__.py
@@ -3,7 +3,6 @@
import subprocess
import os.path
from renderlib import *
-from schedulelib import *
from easing import *
# URL to Schedule-XML
@@ -101,7 +100,7 @@ def pauseFrames(p):
yield (
('onhold', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -0.8, frames-1)),
)
-
+
frames = int(1.5*fps)
for i in range(0, frames):
yield (
@@ -117,7 +116,7 @@ def outroFrames(p):
scale = easeLinear(i, 1.3, 0.3 , frames-1)
opacity = 0
if i > int(frames*0.7):
- opacity = easeLinear(int(i-frames*0.7), 0, 1, int(frames-frames*0.7)-1)
+ opacity = easeLinear(int(i-frames*0.7), 0, 1, int(frames-frames*0.7)-1)
yield (
('guadeclogoscale', 'attr', 'transform', 'scale({scale},{scale})'.format(scale=scale),),
('fadetoblack', 'style', 'opacity', '{opac}'.format(opac=opacity),),
@@ -130,7 +129,7 @@ def outroFrames(p):
('fadetoblack', 'style', 'opacity', "1"),
)
-
+
def debug():
render(
'intro.svg',
@@ -163,7 +162,7 @@ def tasks(queue, args):
if not str(event['id']) in args:
continue
- if len(event['title']) < 71:
+ if len(event['title']) < 71:
params = {
'$title': event['title'],
'$longtitle': '',
diff --git a/hackerhotel2024/__init__.py b/hackerhotel2024/__init__.py
deleted file mode 100644
index ca82d00..0000000
--- a/hackerhotel2024/__init__.py
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/usr/bin/python3
-
-from renderlib import *
-from schedulelib import *
-from easing import *
-
-# URL to Schedule-XML
-scheduleUrl = 'https://pretalx.hackerhotel.nl/hackerhotel-2024/schedule.xml'
-
-def bounce(i, min, max, frames):
- if i == frames - 1:
- return 0
-
- if i <= frames/2:
- return easeInOutQuad(i, min, max, frames/2)
- else:
- return max - easeInOutQuad(i - frames/2, min, max, frames/2)
-
-def introFrames(parameters):
- # 3 Sekunde Text Fadein
- frames = 1*fps
- for i in range(0, frames):
- yield (
- ('textblock', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
- )
-
- # 4 Sekunden stehen lassen
- frames = 4*fps
- for i in range(0, frames):
- yield ()
-
- # 1 Sekunde Fade to black layer
- frames = 1*fps
- for i in range(0, frames):
- yield (
- ('all', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
- ('textblock', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
- )
-
-def pauseFrames(parameters):
- #5 Seconds Fade-In Hacker Fade-Out Hotel
- frames = 5*fps
- for i in range(0, frames):
- yield (
- ('logohacker', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
- ('logohotel', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
- )
- #5 Seconds Fade-In Hotel Fade-Out Hacker
- frames = 5*fps
- for i in range(0, frames):
- yield (
- ('logohacker', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
- ('logohotel', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
- )
-
-def outroFrames(p):
- # 4 Sekunden stehen bleiben
- frames = 4*fps
- for i in range(0, frames):
- yield []
- # 1 Sekunde Fade to black layer
- frames = 1*fps
- for i in range(0, frames):
- yield (
- ('all', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
- )
-
-def debug():
- render(
- 'intro.svg',
- '../intro.ts',
- introFrames,
- {
- '$ID': 4711,
- '$TITLE': "Long Long Long title is LONG",
- '$SUBTITLE': 'Long Long Long Long subtitle is LONGER',
- '$SPEAKER': 'Long Name of Dr. Dr. Prof. Dr. Long Long'
- }
- )
-
- render(
- 'pause.svg',
- '../pause.ts',
- pauseFrames
- )
-
-# render(
-# 'infobeamer.svg',
-# '../infobeamer.ts',
-# pauseFrames
-# )
-
- render(
- 'outro.svg',
- '../outro.ts',
- outroFrames
- )
-
-def tasks(queue, args, idlist, skiplist):
- # iterate over all events extracted from the schedule xml-export
- for event in events(scheduleUrl):
- if event['room'] not in ('Leonardo Da Vinci', 'Rembrandt', 'Willem van Oranje'):
- print("skipping room %s (%s [%s])" % (event['room'], event['title'], event['id']))
- continue
- if not (idlist==[]):
- if 000000 in idlist:
- print("skipping id (%s [%s])" % (event['title'], event['id']))
- continue
- if int(event['id']) not in idlist:
- print("skipping id (%s [%s])" % (event['title'], event['id']))
- continue
-
- # generate a task description and put it into the queue
- queue.put(Rendertask(
- infile = 'intro.svg',
- outfile = str(event['id'])+".ts",
- sequence = introFrames,
- parameters = {
- '$ID': event['id'],
- '$TITLE': event['title'],
- '$SUBTITLE': event['subtitle'],
- '$SPEAKER': event['personnames']
- }
- ))
-
- # place a task for the outro into the queue
- if not "out" in skiplist:
- queue.put(Rendertask(
- infile = 'outro.svg',
- outfile = 'outro.ts',
- sequence = outroFrames
- ))
-
- # place the pause-sequence into the queue
- if not "pause" in skiplist:
- queue.put(Rendertask(
- infile = 'pause.svg',
- outfile = 'pause.ts',
- sequence = pauseFrames
- ))
diff --git a/hackerhotel2024/artwork/bg.png b/hackerhotel2024/artwork/bg.png
deleted file mode 100644
index aca48ed..0000000
Binary files a/hackerhotel2024/artwork/bg.png and /dev/null differ
diff --git a/hackerhotel2024/artwork/bg.svg b/hackerhotel2024/artwork/bg.svg
deleted file mode 100644
index 9337de2..0000000
--- a/hackerhotel2024/artwork/bg.svg
+++ /dev/null
@@ -1,482 +0,0 @@
-
-
-
-
diff --git a/hackerhotel2024/artwork/intro.svg b/hackerhotel2024/artwork/intro.svg
deleted file mode 100644
index 24d9a1e..0000000
--- a/hackerhotel2024/artwork/intro.svg
+++ /dev/null
@@ -1,745 +0,0 @@
-
-
-
-
diff --git a/hackerhotel2024/artwork/logos/HackerHotel.pdf b/hackerhotel2024/artwork/logos/HackerHotel.pdf
deleted file mode 100644
index 5e0ccb7..0000000
--- a/hackerhotel2024/artwork/logos/HackerHotel.pdf
+++ /dev/null
@@ -1,1605 +0,0 @@
-%PDF-1.3
%
-1 0 obj
<>]/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<>stream
-
-
-
-
- Adobe Illustrator CS6 (Windows)
- 2015-03-26T21:09:06+02:00
- 2015-03-26T21:09:06+01:00
- 2015-03-26T21:09:06+01:00
-
-
-
- 256
- 96
- JPEG
- /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAYAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A8tYGx2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVWtLO6vLlLa1
iaaeQ0SNRUmgqT7AAVJ7DIznGAuRoKAjpNL0qFzFJqsbSJs5hikkj5dwr/Dyp4jY9tsoGbIRYh8y
GVDvQ+qaZPp116MjLLGwD29zESYpo2+zJGxAqD7ioNQQCCMsw5hkjY27x1B7j+PMbIIpvRLbTLrV
7O31S7Nhp0syJd3qoZTFGTRn4DdqDBqJzjjJgOKQGw5Woq90bcaJpD3NxDpmsw3IjdhbG5R7T1kD
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
6Yrb/9k=
-
-
-
-
-
- 1
- False
- False
-
- 111.000115
- 41.000081
- Millimeters
-
-
-
- Cyan
- Magenta
- Yellow
- Black
-
-
-
-
-
- Default Swatch Group
- 0
-
-
-
-
-
- application/pdf
-
-
- HackerHotel
-
-
-
-
- proof:pdf
- xmp.did:D69572F2F3D3E411AD5D85A92A9E06F7
- uuid:1602b5fe-fc7a-4f8c-91b9-1c182423a182
- xmp.did:D69572F2F3D3E411AD5D85A92A9E06F7
- 1
-
- proof:pdf
-
-
-
-
- saved
- xmp.iid:D69572F2F3D3E411AD5D85A92A9E06F7
- 2015-03-26T21:09:02+01:00
- Adobe Illustrator CS6 (Windows)
- /
-
-
-
-
-
- Adobe PDF library 10.01
- False
-
-
- PDF/X-1:2001
-
-
- PDF/X-1:2001
- PDF/X-1a:2001
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-endstream
endobj
3 0 obj
<>
endobj
6 0 obj
<>/Properties<>>>/TrimBox[0.0 0.0 314.646 116.221]/Type/Page>>
endobj
7 0 obj
<>stream
-HWɒ
W$Ees١Xq23\[mRI<ۇ??M~] ?Q)O>}~'&qID\4}v7קNd2~#\BRvDOc~{hCMޥuqvnĉO$:߇_OINY'
.K*Ἕ\@ gBR'vv*;ϜtwӪmA#NxNgf
-.`8.qgh +4DQ[(b@Hai;|iRMl
&^)4KQM]Ga`hh^']
-"M~Ė0N@;#xXY.f֧a4l֠5Q?2+`F85XQM- iQ]ǟ@is۰:
-
q4٣L,>қ{+ʰOdX$5c
oJ`?p 7Xk*.)@ӞW^:=?r^X}.
-q+@)p%Jrd{kxkx+VhOcy4kKiޕȡ:*e`5#(r,x%dTT*Vڼ2
|WFv1Tcˉ
-'UGEQ"p|,~7"iɣPJ?tՄغ ֗ILV_ݏb