From 6b33b9f51d726b8f4ed6173cd87960e6b89f6240 Mon Sep 17 00:00:00 2001 From: overflowerror <mail@overflowerror.com> Date: Wed, 6 Jul 2016 13:03:46 +0200 Subject: [PATCH] i did some stuff --- .classpath | 10 ++ .project | 23 ++++ pom.xml | 13 ++ .../java/net/persei/dionysus/AudioPlayer.java | 45 +++++++ src/main/java/net/persei/dionysus/Main.java | 27 +++++ .../java/net/persei/dionysus/MidiTrigger.java | 5 + src/main/java/net/persei/dionysus/Player.java | 13 ++ .../java/net/persei/dionysus/PlayerGUI.java | 79 +++++++++++++ src/main/java/net/persei/dionysus/Setup.java | 37 ++++++ .../net/persei/dionysus/blocks/Block.java | 29 +++++ .../dionysus/blocks/BlockCondition.java | 111 ++++++++++++++++++ .../persei/dionysus/blocks/BlockHelper.java | 21 ++++ .../net/persei/dionysus/blocks/BlockType.java | 8 ++ .../dionysus/blocks/ConditionalBlock.java | 4 + .../java/net/persei/dionysus/blocks/Data.java | 15 +++ .../persei/dionysus/blocks/DelayBlock.java | 27 +++++ .../persei/dionysus/blocks/IfElseBlock.java | 24 ++++ .../persei/dionysus/blocks/InitialBlock.java | 23 ++++ .../java/net/persei/dionysus/blocks/Lane.java | 41 +++++++ .../persei/dionysus/blocks/SetDataBlock.java | 32 +++++ .../persei/dionysus/blocks/SetStateBlock.java | 30 +++++ .../persei/dionysus/blocks/SetupParser.java | 63 ++++++++++ .../persei/dionysus/blocks/SplitterBlock.java | 23 ++++ .../dionysus/controlroom/ControlRoom.java | 53 +++++++++ .../DataValueNotAvailableException.java | 10 ++ .../LibrariesNotFoundException.java | 10 ++ .../MalformedBlockConditionException.java | 10 ++ .../MalformedSetupFileException.java | 10 ++ .../UnexpectedDataTypeException.java | 20 ++++ .../exceptions/WhatTheFuckException.java | 10 ++ .../net/persei/dionysus/AudioPlayer.class | Bin 0 -> 1477 bytes target/classes/net/persei/dionysus/Main.class | Bin 0 -> 1098 bytes .../net/persei/dionysus/MidiTrigger.class | Bin 0 -> 298 bytes .../classes/net/persei/dionysus/Player.class | Bin 0 -> 351 bytes .../net/persei/dionysus/PlayerGUI$1.class | Bin 0 -> 1052 bytes .../net/persei/dionysus/PlayerGUI.class | Bin 0 -> 2491 bytes .../classes/net/persei/dionysus/Setup$1.class | Bin 0 -> 603 bytes .../classes/net/persei/dionysus/Setup.class | Bin 0 -> 1506 bytes .../net/persei/dionysus/blocks/Block.class | Bin 0 -> 1448 bytes .../dionysus/blocks/BlockCondition.class | Bin 0 -> 3877 bytes .../persei/dionysus/blocks/BlockHelper.class | Bin 0 -> 1124 bytes .../persei/dionysus/blocks/BlockType.class | Bin 0 -> 1201 bytes .../dionysus/blocks/ConditionalBlock.class | Bin 0 -> 343 bytes .../net/persei/dionysus/blocks/Data.class | Bin 0 -> 948 bytes .../persei/dionysus/blocks/DelayBlock.class | Bin 0 -> 1430 bytes .../persei/dionysus/blocks/IfElseBlock.class | Bin 0 -> 1446 bytes .../persei/dionysus/blocks/InitialBlock.class | Bin 0 -> 1255 bytes .../net/persei/dionysus/blocks/Lane.class | Bin 0 -> 1919 bytes .../persei/dionysus/blocks/SetDataBlock.class | Bin 0 -> 1782 bytes .../dionysus/blocks/SetStateBlock.class | Bin 0 -> 1603 bytes .../dionysus/blocks/SetupParser$Mode.class | Bin 0 -> 1284 bytes .../persei/dionysus/blocks/SetupParser.class | Bin 0 -> 1942 bytes .../dionysus/blocks/SplitterBlock.class | Bin 0 -> 1550 bytes .../ControlRoom$ControlRoomPanel.class | Bin 0 -> 1554 bytes .../dionysus/controlroom/ControlRoom.class | Bin 0 -> 1193 bytes .../DataValueNotAvailableException.class | Bin 0 -> 444 bytes .../LibrariesNotFoundException.class | Bin 0 -> 432 bytes .../MalformedBlockConditionException.class | Bin 0 -> 450 bytes .../MalformedSetupFileException.class | Bin 0 -> 435 bytes .../UnexpectedDataTypeException.class | Bin 0 -> 646 bytes .../exceptions/WhatTheFuckException.class | Bin 0 -> 414 bytes 61 files changed, 826 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 pom.xml create mode 100644 src/main/java/net/persei/dionysus/AudioPlayer.java create mode 100644 src/main/java/net/persei/dionysus/Main.java create mode 100644 src/main/java/net/persei/dionysus/MidiTrigger.java create mode 100644 src/main/java/net/persei/dionysus/Player.java create mode 100644 src/main/java/net/persei/dionysus/PlayerGUI.java create mode 100644 src/main/java/net/persei/dionysus/Setup.java create mode 100644 src/main/java/net/persei/dionysus/blocks/Block.java create mode 100644 src/main/java/net/persei/dionysus/blocks/BlockCondition.java create mode 100644 src/main/java/net/persei/dionysus/blocks/BlockHelper.java create mode 100644 src/main/java/net/persei/dionysus/blocks/BlockType.java create mode 100644 src/main/java/net/persei/dionysus/blocks/ConditionalBlock.java create mode 100644 src/main/java/net/persei/dionysus/blocks/Data.java create mode 100644 src/main/java/net/persei/dionysus/blocks/DelayBlock.java create mode 100644 src/main/java/net/persei/dionysus/blocks/IfElseBlock.java create mode 100644 src/main/java/net/persei/dionysus/blocks/InitialBlock.java create mode 100644 src/main/java/net/persei/dionysus/blocks/Lane.java create mode 100644 src/main/java/net/persei/dionysus/blocks/SetDataBlock.java create mode 100644 src/main/java/net/persei/dionysus/blocks/SetStateBlock.java create mode 100644 src/main/java/net/persei/dionysus/blocks/SetupParser.java create mode 100644 src/main/java/net/persei/dionysus/blocks/SplitterBlock.java create mode 100644 src/main/java/net/persei/dionysus/controlroom/ControlRoom.java create mode 100644 src/main/java/net/persei/dionysus/exceptions/DataValueNotAvailableException.java create mode 100644 src/main/java/net/persei/dionysus/exceptions/LibrariesNotFoundException.java create mode 100644 src/main/java/net/persei/dionysus/exceptions/MalformedBlockConditionException.java create mode 100644 src/main/java/net/persei/dionysus/exceptions/MalformedSetupFileException.java create mode 100644 src/main/java/net/persei/dionysus/exceptions/UnexpectedDataTypeException.java create mode 100644 src/main/java/net/persei/dionysus/exceptions/WhatTheFuckException.java create mode 100644 target/classes/net/persei/dionysus/AudioPlayer.class create mode 100644 target/classes/net/persei/dionysus/Main.class create mode 100644 target/classes/net/persei/dionysus/MidiTrigger.class create mode 100644 target/classes/net/persei/dionysus/Player.class create mode 100644 target/classes/net/persei/dionysus/PlayerGUI$1.class create mode 100644 target/classes/net/persei/dionysus/PlayerGUI.class create mode 100644 target/classes/net/persei/dionysus/Setup$1.class create mode 100644 target/classes/net/persei/dionysus/Setup.class create mode 100644 target/classes/net/persei/dionysus/blocks/Block.class create mode 100644 target/classes/net/persei/dionysus/blocks/BlockCondition.class create mode 100644 target/classes/net/persei/dionysus/blocks/BlockHelper.class create mode 100644 target/classes/net/persei/dionysus/blocks/BlockType.class create mode 100644 target/classes/net/persei/dionysus/blocks/ConditionalBlock.class create mode 100644 target/classes/net/persei/dionysus/blocks/Data.class create mode 100644 target/classes/net/persei/dionysus/blocks/DelayBlock.class create mode 100644 target/classes/net/persei/dionysus/blocks/IfElseBlock.class create mode 100644 target/classes/net/persei/dionysus/blocks/InitialBlock.class create mode 100644 target/classes/net/persei/dionysus/blocks/Lane.class create mode 100644 target/classes/net/persei/dionysus/blocks/SetDataBlock.class create mode 100644 target/classes/net/persei/dionysus/blocks/SetStateBlock.class create mode 100644 target/classes/net/persei/dionysus/blocks/SetupParser$Mode.class create mode 100644 target/classes/net/persei/dionysus/blocks/SetupParser.class create mode 100644 target/classes/net/persei/dionysus/blocks/SplitterBlock.class create mode 100644 target/classes/net/persei/dionysus/controlroom/ControlRoom$ControlRoomPanel.class create mode 100644 target/classes/net/persei/dionysus/controlroom/ControlRoom.class create mode 100644 target/classes/net/persei/dionysus/exceptions/DataValueNotAvailableException.class create mode 100644 target/classes/net/persei/dionysus/exceptions/LibrariesNotFoundException.class create mode 100644 target/classes/net/persei/dionysus/exceptions/MalformedBlockConditionException.class create mode 100644 target/classes/net/persei/dionysus/exceptions/MalformedSetupFileException.class create mode 100644 target/classes/net/persei/dionysus/exceptions/UnexpectedDataTypeException.class create mode 100644 target/classes/net/persei/dionysus/exceptions/WhatTheFuckException.class diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..3c96d64 --- /dev/null +++ b/.classpath @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" output="target/classes" path="src/main/java"/> + <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/> + <classpathentry kind="src" output="target/test-classes" path="src/test/java"/> + <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> + <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/> + <classpathentry kind="output" path="target/classes"/> +</classpath> diff --git a/.project b/.project new file mode 100644 index 0000000..65ce72c --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>Dionysus</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.m2e.core.maven2Builder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.m2e.core.maven2Nature</nature> + </natures> +</projectDescription> diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6a825c7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,13 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>net.persei.dionysus</groupId> + <artifactId>Dionysus</artifactId> + <version>0.0.1-SNAPSHOT</version> + <dependencies> + <dependency> + <groupId>uk.co.caprica</groupId> + <artifactId>vlcj</artifactId> + <version>3.8.0</version> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/src/main/java/net/persei/dionysus/AudioPlayer.java b/src/main/java/net/persei/dionysus/AudioPlayer.java new file mode 100644 index 0000000..a389ba2 --- /dev/null +++ b/src/main/java/net/persei/dionysus/AudioPlayer.java @@ -0,0 +1,45 @@ +package net.persei.dionysus; + +import uk.co.caprica.vlcj.component.AudioMediaPlayerComponent; +import uk.co.caprica.vlcj.player.MediaPlayer; + +public class AudioPlayer implements Player { + + private AudioMediaPlayerComponent player; + private boolean loop = false; + private String name; + + public AudioPlayer(String name) { + this.name = name; + player = new AudioMediaPlayerComponent(); + } + + public boolean isLoop() { + return loop; + } + + public void playFile(String file) { + getMediaPlayer().playMedia(file); + } + + public void play() { + getMediaPlayer().play(); + } + + public void pause() { + getMediaPlayer().pause(); + } + + public void setLoop(boolean loop) { + this.loop = loop; + getMediaPlayer().setRepeat(loop); + } + + public MediaPlayer getMediaPlayer() { + return player.getMediaPlayer(); + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/net/persei/dionysus/Main.java b/src/main/java/net/persei/dionysus/Main.java new file mode 100644 index 0000000..5842d8b --- /dev/null +++ b/src/main/java/net/persei/dionysus/Main.java @@ -0,0 +1,27 @@ +package net.persei.dionysus; + +import net.persei.dionysus.exceptions.LibrariesNotFoundException; +import uk.co.caprica.vlcj.binding.LibVlc; +import uk.co.caprica.vlcj.discovery.NativeDiscovery; + +public class Main { + + public static final String TITLE = "Dionysus"; + private static PlayerGUI playerGUI; + + /** + * @param args + * @throws LibrariesNotFoundException + */ + public static void main(String[] args) throws LibrariesNotFoundException { + if (!findLibs()) + throw new LibrariesNotFoundException(); + + System.out.println(LibVlc.INSTANCE.libvlc_get_version()); + } + + private static boolean findLibs() { + return new NativeDiscovery().discover(); + } + +} diff --git a/src/main/java/net/persei/dionysus/MidiTrigger.java b/src/main/java/net/persei/dionysus/MidiTrigger.java new file mode 100644 index 0000000..40f68da --- /dev/null +++ b/src/main/java/net/persei/dionysus/MidiTrigger.java @@ -0,0 +1,5 @@ +package net.persei.dionysus; + +public class MidiTrigger { + +} diff --git a/src/main/java/net/persei/dionysus/Player.java b/src/main/java/net/persei/dionysus/Player.java new file mode 100644 index 0000000..7100668 --- /dev/null +++ b/src/main/java/net/persei/dionysus/Player.java @@ -0,0 +1,13 @@ +package net.persei.dionysus; + +import uk.co.caprica.vlcj.player.MediaPlayer; + +public interface Player { + boolean isLoop(); + void playFile(String file); + void play(); + void pause(); + void setLoop(boolean loop); + MediaPlayer getMediaPlayer(); + String getName(); +} diff --git a/src/main/java/net/persei/dionysus/PlayerGUI.java b/src/main/java/net/persei/dionysus/PlayerGUI.java new file mode 100644 index 0000000..f7dee8f --- /dev/null +++ b/src/main/java/net/persei/dionysus/PlayerGUI.java @@ -0,0 +1,79 @@ +package net.persei.dionysus; + +import java.awt.HeadlessException; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JFrame; + +import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; +import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer; + +public class PlayerGUI extends JFrame implements Player { + + /** + * + */ + private static final long serialVersionUID = 6068058949441154348L; + + private EmbeddedMediaPlayerComponent player = new EmbeddedMediaPlayerComponent(); + + private boolean loop = false; + private boolean fullscreen = false; + + public boolean isFullscreen() { + return fullscreen; + } + + public PlayerGUI(boolean fullscreen) throws HeadlessException { + this(); + dispose(); + if (fullscreen) { + setExtendedState(JFrame.MAXIMIZED_BOTH); + setUndecorated(true); + } + setVisible(true); + } + public PlayerGUI() throws HeadlessException { + super(Main.TITLE); + setBounds(100, 100, 600, 400); + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + setVisible(true); + + setContentPane(player); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + player.release(); + System.out.println("release"); + System.exit(0); + } + }); + } + + public boolean isLoop() { + return loop; + } + + public void setLoop(boolean loop) { + this.loop = loop; + getMediaPlayer().setRepeat(loop); + } + + public void playFile(String file) { + getMediaPlayer().playMedia(file); + } + + public void play() { + getMediaPlayer().play(); + } + + public void pause() { + getMediaPlayer().pause(); + } + + public EmbeddedMediaPlayer getMediaPlayer() { + return player.getMediaPlayer(); + } +} diff --git a/src/main/java/net/persei/dionysus/Setup.java b/src/main/java/net/persei/dionysus/Setup.java new file mode 100644 index 0000000..2712b3f --- /dev/null +++ b/src/main/java/net/persei/dionysus/Setup.java @@ -0,0 +1,37 @@ +package net.persei.dionysus; + +import java.util.LinkedList; +import java.util.List; + +import net.persei.dionysus.blocks.InitialBlock; + +public class Setup { + private List<InitialBlock> initBlocks = new LinkedList<InitialBlock>(); + private List<Player> players = new LinkedList<Player>(); + + // ugly, but necessary for flexible states + private List<String> states = new LinkedList<String>(){{ + push("none"); + }}; + private int state = 0; + + public List<InitialBlock> getInitBlocks() { + return initBlocks; + } + + public List<Player> getPlayers() { + return players; + } + + public String getState() { + return states.get(state); + } + + public void setState(int state) { + this.state = state; + } + + public List<String> getStates() { + return states; + } +} diff --git a/src/main/java/net/persei/dionysus/blocks/Block.java b/src/main/java/net/persei/dionysus/blocks/Block.java new file mode 100644 index 0000000..9565f33 --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/Block.java @@ -0,0 +1,29 @@ +package net.persei.dionysus.blocks; + +import java.util.LinkedList; +import java.util.List; + +import net.persei.dionysus.exceptions.UnexpectedDataTypeException; + +public abstract class Block { + protected String name; + protected BlockType type; + protected List<Lane> lanes = new LinkedList<Lane>(); + + public List<Lane> getOutputLanes() { + return lanes; + } + public String getName() { + return name; + } + public BlockType getType() { + return type; + } + + public boolean preMagic (Data input, Lane lane) throws Exception { + BlockHelper.addPassLog(input, "blocks", this); + return magic(input, lane); + } + + abstract public boolean magic(Data input, Lane lane) throws Exception; +} diff --git a/src/main/java/net/persei/dionysus/blocks/BlockCondition.java b/src/main/java/net/persei/dionysus/blocks/BlockCondition.java new file mode 100644 index 0000000..d5731bf --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/BlockCondition.java @@ -0,0 +1,111 @@ +package net.persei.dionysus.blocks; + +import java.util.Map; + +import net.persei.dionysus.Setup; +import net.persei.dionysus.exceptions.DataValueNotAvailableException; +import net.persei.dionysus.exceptions.MalformedBlockConditionException; + +public class BlockCondition { + + private String condition; + + public BlockCondition(String condition) { + condition = condition.replace(" ", ""); + condition = condition.replace(" ", ""); + condition = condition.replace("\n", ""); + condition = condition.replace("\r", ""); + + this.condition = condition; + } + + public boolean parse(Data input) throws MalformedBlockConditionException, DataValueNotAvailableException { + String tmp = new String(condition); + + while(true) { + if (tmp.indexOf("(") < 0) + break; + + int open = 0; + while(tmp.indexOf("(", open + 1) >= 0) { + open = tmp.indexOf("(", open + 1); + } + int close = tmp.indexOf(")", open); + + if (close == -1) + throw new MalformedBlockConditionException(); + + String sub = tmp.substring(open + 1, close - 1); + String before = tmp.substring(0, open - 1); + String after = tmp.substring(close + 1); + tmp = before + (minTerm(sub, input)) + after; + } + + return minTerm(tmp, input); + } + private boolean minTerm(String sub, Data input) throws DataValueNotAvailableException, MalformedBlockConditionException { + if (sub.equals("true")) + return true; + if (sub.equals("false")) + return false; + if (sub.indexOf("&") >= 0) + return minTerm(sub.substring(0, sub.indexOf("&")), input) && + minTerm(sub.substring(sub.indexOf("&") + 1), input); + if (sub.indexOf("|") >= 0) + return minTerm(sub.substring(0, sub.indexOf("|")), input) || + minTerm(sub.substring(sub.indexOf("|") + 1), input); + if (sub.indexOf("^") >= 0) + return minTerm(sub.substring(0, sub.indexOf("^")), input) ^ + minTerm(sub.substring(sub.indexOf("^") + 1), input); + if (sub.indexOf("!") >= 0) + return ! minTerm(sub.substring(sub.indexOf("!") + 1), input); + if (sub.indexOf("==") >= 0) + return stringValue(sub.substring(0, sub.indexOf("==")), input).equals(stringValue(sub.substring(sub.indexOf("==") + 1), input)); + if (sub.indexOf(">") >= 0) + return intValue(sub.substring(0, sub.indexOf(">")), input) > intValue(sub.substring(sub.indexOf(">") + 1), input); + if (sub.indexOf("<") >= 0) + return intValue(sub.substring(0, sub.indexOf("<")), input) < intValue(sub.substring(sub.indexOf("<") + 1), input); + if (sub.indexOf(">=") >= 0) + return intValue(sub.substring(0, sub.indexOf(">=")), input) >= intValue(sub.substring(sub.indexOf(">=") + 1), input); + if (sub.indexOf("<=") >= 0) + return intValue(sub.substring(0, sub.indexOf("<=")), input) >= intValue(sub.substring(sub.indexOf("<=") + 1), input); + if (sub.indexOf("data") >= 0) + return minTerm(getDataValue(sub, input), input); + + throw new MalformedBlockConditionException(); + } + + private int intValue(String substring, Data input) { + try { + return Integer.parseInt(substring); + } catch (NumberFormatException e) { + } + try { + return Integer.parseInt(getDataValue(substring, input)); + } catch (NumberFormatException e) { + } catch (Exception e) { + } + throw new NumberFormatException(); + } + + private String getDataValue(String string, Data input) throws DataValueNotAvailableException { + if (string.equals("setup.state")) + return ((Setup) input.getEntry("setup")).getState(); + if (string.indexOf("data.") == 0) { + String key = string.substring("data.".length() + 1); + if (input.getEntry("blockData") != null) { + Map<String, String> blockData = (Map<String, String>) input.getEntry("blockData"); + if (blockData.get(key) != null) + return blockData.get(key); + } + } + throw new DataValueNotAvailableException(); + } + + private String stringValue(String string, Data input) throws DataValueNotAvailableException { + if (string.substring(0, 1).equals("\"") && string.substring(string.length() - 1).equals("\"")) + return string.substring(1, string.length() - 1); + + return getDataValue(string, input); + } +} diff --git a/src/main/java/net/persei/dionysus/blocks/BlockHelper.java b/src/main/java/net/persei/dionysus/blocks/BlockHelper.java new file mode 100644 index 0000000..922a16d --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/BlockHelper.java @@ -0,0 +1,21 @@ +package net.persei.dionysus.blocks; + +import java.util.LinkedList; +import java.util.List; + +import net.persei.dionysus.exceptions.UnexpectedDataTypeException; + +public class BlockHelper { + static void addPassLog(Data input, String type, Object object) throws UnexpectedDataTypeException { + Object obj = input.getEntry(type); + List<Object> log; + if (obj == null) { + log = new LinkedList<Object>(); + } else if (! (obj instanceof List)) { + throw new UnexpectedDataTypeException(type); + } else { + log = (List<Object>) obj; + } + log.add(object); + } +} diff --git a/src/main/java/net/persei/dionysus/blocks/BlockType.java b/src/main/java/net/persei/dionysus/blocks/BlockType.java new file mode 100644 index 0000000..f8033f7 --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/BlockType.java @@ -0,0 +1,8 @@ +package net.persei.dionysus.blocks; + +public enum BlockType { + PassiveBlock, + ActiveBlock, + ConditionalBlock, + MultiplexingBlock +} diff --git a/src/main/java/net/persei/dionysus/blocks/ConditionalBlock.java b/src/main/java/net/persei/dionysus/blocks/ConditionalBlock.java new file mode 100644 index 0000000..d20855f --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/ConditionalBlock.java @@ -0,0 +1,4 @@ +package net.persei.dionysus.blocks; + +public abstract class ConditionalBlock extends Block { +} diff --git a/src/main/java/net/persei/dionysus/blocks/Data.java b/src/main/java/net/persei/dionysus/blocks/Data.java new file mode 100644 index 0000000..b5791bc --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/Data.java @@ -0,0 +1,15 @@ +package net.persei.dionysus.blocks; + +import java.util.HashMap; +import java.util.Map; + +public class Data { + private Map<String, Object> map = new HashMap<String, Object>(); + + public Object getEntry(String key) { + return map.get(key); + } + public Object setEntry(String key, Object obj) { + return map.put(key, obj); + } +} diff --git a/src/main/java/net/persei/dionysus/blocks/DelayBlock.java b/src/main/java/net/persei/dionysus/blocks/DelayBlock.java new file mode 100644 index 0000000..bb6747c --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/DelayBlock.java @@ -0,0 +1,27 @@ +package net.persei.dionysus.blocks; + +public class DelayBlock extends Block { + private long sleepTime = 1000; + + public long getSleepTime() { + return sleepTime; + } + + public void setSleepTime(long sleepTime) { + this.sleepTime = sleepTime; + } + + public DelayBlock() { + super(); + name = "DelayBlock"; + type = BlockType.PassiveBlock; + lanes.add(new Lane("delayed lane")); + } + + public boolean magic(Data input, Lane lane) throws Exception { + Thread.sleep(sleepTime); + + return lanes.get(0).invoke(input); + } + +} diff --git a/src/main/java/net/persei/dionysus/blocks/IfElseBlock.java b/src/main/java/net/persei/dionysus/blocks/IfElseBlock.java new file mode 100644 index 0000000..10fbadf --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/IfElseBlock.java @@ -0,0 +1,24 @@ +package net.persei.dionysus.blocks; + +public class IfElseBlock extends ConditionalBlock { + + private BlockCondition condition; + + public IfElseBlock(BlockCondition condition) { + super(); + this.name = "IfElseBlock"; + this.type = BlockType.ConditionalBlock; + + this.condition = condition; + this.lanes.add(new Lane("false lane")); // 0 + this.lanes.add(new Lane("true lane")); // 1 + } + + @Override + public boolean magic(Data input, Lane lane) throws Exception { + if (condition.parse(input)) + return lanes.get(1).invoke(input); + else + return lanes.get(0).invoke(input); + } +} diff --git a/src/main/java/net/persei/dionysus/blocks/InitialBlock.java b/src/main/java/net/persei/dionysus/blocks/InitialBlock.java new file mode 100644 index 0000000..00ffa59 --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/InitialBlock.java @@ -0,0 +1,23 @@ +package net.persei.dionysus.blocks; + +import java.util.LinkedList; +import java.util.List; + +import net.persei.dionysus.MidiTrigger; +import net.persei.dionysus.Setup; +import net.persei.dionysus.exceptions.UnexpectedDataTypeException; + +public abstract class InitialBlock extends Block { + protected List<MidiTrigger> triggers = new LinkedList<MidiTrigger>(); + + public List<MidiTrigger> getTriggers() { + return triggers; + } + + public boolean trigger(MidiTrigger trigger, Setup setup) throws Exception { + Data input = new Data(); + input.setEntry("trigger", trigger); + input.setEntry("setup", setup); + return preMagic(input, null); + } +} diff --git a/src/main/java/net/persei/dionysus/blocks/Lane.java b/src/main/java/net/persei/dionysus/blocks/Lane.java new file mode 100644 index 0000000..ae0cb72 --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/Lane.java @@ -0,0 +1,41 @@ +package net.persei.dionysus.blocks; + +import java.util.LinkedList; +import java.util.List; + +import net.persei.dionysus.exceptions.UnexpectedDataTypeException; + +public class Lane { + private List<Block> attachedBlocks = new LinkedList<Block>(); + static private int count = 1; + final private int id; + final private String name; + + public List<Block> getAttachedBlocks() { + return attachedBlocks; + } + + public String getName() { + return name; + } + + public Lane(String name) { + super(); + this.id = count++; + this.name = name; + } + + public void attach(Block block) { + attachedBlocks.add(block); + } + + public boolean invoke(Data input) throws Exception { + BlockHelper.addPassLog(input, "lanes", this); + + boolean res = true; + for (Block block : attachedBlocks) { + res = block.preMagic(input, this) & res; + } + return res; + } +} diff --git a/src/main/java/net/persei/dionysus/blocks/SetDataBlock.java b/src/main/java/net/persei/dionysus/blocks/SetDataBlock.java new file mode 100644 index 0000000..caebe57 --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/SetDataBlock.java @@ -0,0 +1,32 @@ +package net.persei.dionysus.blocks; + +import java.util.HashMap; +import java.util.Map; + +public class SetDataBlock extends Block { + + private String data; + private String key; + + public SetDataBlock(String key, String data) { + super(); + name = "SetDateBlock"; + type = BlockType.ActiveBlock; + this.key = key; + this.data = data; + lanes.add(new Lane("lane")); + } + + @Override + public boolean magic(Data input, Lane lane) throws Exception { + Map<String, String> blockData = (Map<String, String>) input.getEntry("blockData"); + if (blockData == null) { + input.setEntry("blockData", new HashMap<String, String>()); + blockData = (Map<String, String>) input.getEntry("blockData"); + } + blockData.put(key, data); + + return this.lanes.get(0).invoke(input); + } + +} diff --git a/src/main/java/net/persei/dionysus/blocks/SetStateBlock.java b/src/main/java/net/persei/dionysus/blocks/SetStateBlock.java new file mode 100644 index 0000000..85f2351 --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/SetStateBlock.java @@ -0,0 +1,30 @@ +package net.persei.dionysus.blocks; + +import net.persei.dionysus.Setup; + +public class SetStateBlock extends Block { + + private String state; + + public SetStateBlock(String status) { + super(); + name = "SetStateBlock"; + type = BlockType.ActiveBlock; + this.state = status; + lanes.add(new Lane("lane")); + } + + @Override + public boolean magic(Data input, Lane lane) throws Exception { + Setup setup = ((Setup) input.getEntry("setup")); + int i = setup.getStates().indexOf(state); + if (i >= 0) + setup.setState(i); + else { + setup.getStates().add(state); + setup.setState(setup.getStates().indexOf(state)); + } + return this.lanes.get(0).invoke(input); + } + +} diff --git a/src/main/java/net/persei/dionysus/blocks/SetupParser.java b/src/main/java/net/persei/dionysus/blocks/SetupParser.java new file mode 100644 index 0000000..6b58860 --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/SetupParser.java @@ -0,0 +1,63 @@ +package net.persei.dionysus.blocks; + +import net.persei.dionysus.Setup; +import net.persei.dionysus.exceptions.MalformedSetupFileException; +import net.persei.dionysus.exceptions.WhatTheFuckException; + +public class SetupParser { + private enum Mode { + none, players, triggers, blocks + } + static public Setup parse(String file) throws MalformedSetupFileException, WhatTheFuckException { + String lines[] = file.split("\n"); + + Mode mode = Mode.none; + + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + if (line.length() == 0) + continue; + String tokens[] = line.split(" "); + for (int j = 0; j < tokens.length; j++) { + String token = tokens[j]; + if (token.length() == 0) + continue; + + // comment line + if (token.substring(0, 1).equals("#")) + break; + + // mode selection + if (token.equals("*players")) { + mode = Mode.players; + break; + } + if (token.equals("*triggers")) { + mode = Mode.triggers; + break; + } + if (token.equals("*blocks")) { + mode = Mode.blocks; + break; + } + + // TODO + switch(mode) { + case blocks: + break; + case players: + break; + case triggers: + break; + case none: + throw new MalformedSetupFileException(); + default: + throw new WhatTheFuckException(); + } + } + } + + + return null; + } +} diff --git a/src/main/java/net/persei/dionysus/blocks/SplitterBlock.java b/src/main/java/net/persei/dionysus/blocks/SplitterBlock.java new file mode 100644 index 0000000..64fae48 --- /dev/null +++ b/src/main/java/net/persei/dionysus/blocks/SplitterBlock.java @@ -0,0 +1,23 @@ +package net.persei.dionysus.blocks; + +public class SplitterBlock extends Block { + + public SplitterBlock(int n) { + super(); + for (int i = 0; i < n; i++) { + this.lanes.add(new Lane("split lane " + i)); + } + this.name = "SplitterBlock"; + this.type = BlockType.MultiplexingBlock; + } + + @Override + public boolean magic(Data input, Lane lane) throws Exception { + boolean res = true; + for (Lane l : lanes) { + res = l.invoke(input) && res; + } + return res; + } + +} diff --git a/src/main/java/net/persei/dionysus/controlroom/ControlRoom.java b/src/main/java/net/persei/dionysus/controlroom/ControlRoom.java new file mode 100644 index 0000000..4f54de6 --- /dev/null +++ b/src/main/java/net/persei/dionysus/controlroom/ControlRoom.java @@ -0,0 +1,53 @@ +package net.persei.dionysus.controlroom; + +import java.awt.Color; +import java.awt.Graphics; +import java.util.List; + +import javax.swing.JFrame; +import javax.swing.JPanel; + +import net.persei.dionysus.Setup; +import net.persei.dionysus.blocks.InitialBlock; + +public class ControlRoom extends JFrame { + + private ControlRoomPanel panel; + private Setup setup; + + /** + * + */ + private static final long serialVersionUID = 7130672040530068619L; + + public ControlRoom(Setup setup) { + super(); + this.setup = setup; + setBounds(50, 50, 1000, 800); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setVisible(true); + + panel = new ControlRoomPanel(); + + setContentPane(panel); + } + + private class ControlRoomPanel extends JPanel { + + /** + * + */ + private static final long serialVersionUID = 7915937062340285742L; + + @Override + protected void paintComponent(Graphics g) { + super.paintComponents(g); + g.setColor(Color.BLACK); + List<InitialBlock> initBlocks = setup.getInitBlocks(); + + for (int i = 0; i < initBlocks.size(); i++) { + + } + } + } +} diff --git a/src/main/java/net/persei/dionysus/exceptions/DataValueNotAvailableException.java b/src/main/java/net/persei/dionysus/exceptions/DataValueNotAvailableException.java new file mode 100644 index 0000000..45f098a --- /dev/null +++ b/src/main/java/net/persei/dionysus/exceptions/DataValueNotAvailableException.java @@ -0,0 +1,10 @@ +package net.persei.dionysus.exceptions; + +public class DataValueNotAvailableException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 3826451107086625794L; + +} diff --git a/src/main/java/net/persei/dionysus/exceptions/LibrariesNotFoundException.java b/src/main/java/net/persei/dionysus/exceptions/LibrariesNotFoundException.java new file mode 100644 index 0000000..b2c59bb --- /dev/null +++ b/src/main/java/net/persei/dionysus/exceptions/LibrariesNotFoundException.java @@ -0,0 +1,10 @@ +package net.persei.dionysus.exceptions; + +public class LibrariesNotFoundException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -1839814203088638288L; + +} diff --git a/src/main/java/net/persei/dionysus/exceptions/MalformedBlockConditionException.java b/src/main/java/net/persei/dionysus/exceptions/MalformedBlockConditionException.java new file mode 100644 index 0000000..bb09435 --- /dev/null +++ b/src/main/java/net/persei/dionysus/exceptions/MalformedBlockConditionException.java @@ -0,0 +1,10 @@ +package net.persei.dionysus.exceptions; + +public class MalformedBlockConditionException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -8751303849610920723L; + +} diff --git a/src/main/java/net/persei/dionysus/exceptions/MalformedSetupFileException.java b/src/main/java/net/persei/dionysus/exceptions/MalformedSetupFileException.java new file mode 100644 index 0000000..e4054ac --- /dev/null +++ b/src/main/java/net/persei/dionysus/exceptions/MalformedSetupFileException.java @@ -0,0 +1,10 @@ +package net.persei.dionysus.exceptions; + +public class MalformedSetupFileException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -2464874594169642335L; + +} diff --git a/src/main/java/net/persei/dionysus/exceptions/UnexpectedDataTypeException.java b/src/main/java/net/persei/dionysus/exceptions/UnexpectedDataTypeException.java new file mode 100644 index 0000000..6265caf --- /dev/null +++ b/src/main/java/net/persei/dionysus/exceptions/UnexpectedDataTypeException.java @@ -0,0 +1,20 @@ +package net.persei.dionysus.exceptions; + +public class UnexpectedDataTypeException extends Exception { + + private String dataKey = null; + + public String getDataKey() { + return dataKey; + } + + public UnexpectedDataTypeException(String string) { + dataKey = string; + } + + /** + * + */ + private static final long serialVersionUID = 3634084166179938086L; + +} diff --git a/src/main/java/net/persei/dionysus/exceptions/WhatTheFuckException.java b/src/main/java/net/persei/dionysus/exceptions/WhatTheFuckException.java new file mode 100644 index 0000000..fa63285 --- /dev/null +++ b/src/main/java/net/persei/dionysus/exceptions/WhatTheFuckException.java @@ -0,0 +1,10 @@ +package net.persei.dionysus.exceptions; + +public class WhatTheFuckException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -2453004182880966130L; + +} diff --git a/target/classes/net/persei/dionysus/AudioPlayer.class b/target/classes/net/persei/dionysus/AudioPlayer.class new file mode 100644 index 0000000000000000000000000000000000000000..5eb9cd46cafeda4bbd6d81584678df74e7b1ded2 GIT binary patch literal 1477 zcmbVL+fEZv6kVscY0FT`U0MYZkant!paKelhQ#<#(TJ%L6O*AFaj?ux+9?VD<bx&x zL8BkwM;Z4%t?dZoiw|>d`|P#XUhB-yUtfO!n8!m65rGLu`lcuA4QZRZw(A@<nho<& zla|kG){(4hhzVr(twYPKS<asMY-e9qeGLhLTv%!=OCaH?bb;k^^MhG+&8p?q?W$!S z)~froKk!^fI)1CvQ@Lwft;~%-krjbh&2>Eiu}w?II*<Yb<t~#gzivBwbS<%JJGQ?j zFkHA8E><Xc!`+o>MA5IK7Xt#(La~y9z>tm<(!3hc(F0w>C4t5N<D14P`WY&(Lqk%a zuWUPVvw5&1>o2XHnqu!(ty;yZ+q`cd#{BnoLtwHTre?qhZq#m+l_JESG)c0=kL?<@ zCNQmI2G<2Ld(sccDNrmF!yIVYV+O9SXej(;bxYtL7`UOKBrp>q%taU-H!&xW;)p^Q zD1`X(Cd4ZC`5pB`6K8Yf1s%88vAAb78<J1%>bT7(T0{CRHDZPBVueHZblk@h)uzx3 z=}F6HQ>N)IiL$94&=9E+@`Tb`ZnIvMEG9`1P<@UsW0C}p(if*O!tT-!6yc|%W_ma@ zCn?^G42^xXd#i2&IpY*rBYKQMqjZd6;~Pd_pJMD7xz8&1GL0jI3&MyIVoG6TFh(d> zR4hVc4&#`hnO9tm{s~-Fthkn`_CVbDg29h;5COv`=olDKFq}dc+AspwIz*qeiDr!x zOqHVFF?)t$6tBAU(uBt(`$)?!rEG^%mI$;ckyBKMDJ{1tr5W`M^8)Aba@1-*z%AY3 zM(&2A+_{J{PAC(hD2rHXqm+q1caSymYy%O>pJ6!?V3Z*ZK$^rcMeL{l(Iwl>!qaco sMqW^RvYv#`onYk?p#-&`4KPb~`dh_=c7D*f;q%F*Kyuf(HC1B$H^8$GfB*mh literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/Main.class b/target/classes/net/persei/dionysus/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..fe4fd7157fdabe41a4343e5876505846d50edc2f GIT binary patch literal 1098 zcmah|TTc@~6#j-5mM)8wLb0HTh?jDa5pRe^jNxKPY9(oHqCSx6cC3Tj-DY>&*uUa$ z@I@ZLOQP@oDC3!hf`lgSCNq2Hob!F(oOAZ~pYJ~bEa9nv9)^r7L*9^nAQi7F&us_I zfWHvRH4tY=?unM*j&N)IWo1v=AwzFzyOiH#Naas`#n4x7Eypmp?zurI+^{U1rtC+8 zp?~8Tl_Ak^L|gjLUu`o?<+~B@bOH#gZ&kS}Tw{o3XUh!nb+0N-#E`ULVUS@cuUuJZ z)+^F4iHak&B+nL3S@=rZ$A|Ioy$Tp6y7K9Z5>>oTJHuG^?fFY-ZgcaaEgK<SBrq_} zu+mMtJc;3XRq;uM3<_Sj<u%>vNxlh&OBOC;k}C5~xm5}!b#%oyCNfASa23}KOrI%z zu^oi6Zea%3Db#CH7t%*UmB)9e^dU7sih3@Ao5&it#W3Ccz-^D)qTwrB@Rnom@e0vV zo3y&JV_TTT9EsR26id$v>(tSi{C|^j1H`ak;Wiej+>WXc@NP|pyDgd^Di6bGcJ_P? zP29m<14|4e(a@ZgZQ&m7GZ-Y*4IRQrXU{`KBOv@56>FqRmkc~&Sm>g^ssh_1b!}b{ zp=!yEj%{KYNxkGOtVZqVgi^nYUemYbmeNy|&_lAQbz_>k7o(r22jl2PA6Z6Z^~0oh zfWBjNM$<{_1+qBpjP~BSLkxY1LWgP9iJ;UJt=3ThMlecN0%?p9{6+eXlP43w6zN1~ zOn$}0Ck*^R=Jg@2{MyIVK5l%&Ji`I_DSV1jfnlOaQTiwiTlycWNj$(q@|$`H30CWz fCj$Kt^fE!O9N_V1GJ6Q5qc#&k=rD#Sk#FrUsqz95 literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/MidiTrigger.class b/target/classes/net/persei/dionysus/MidiTrigger.class new file mode 100644 index 0000000000000000000000000000000000000000..dc175c83b48ad8a85dbb437d6d35ff176bcccd9b GIT binary patch literal 298 zcmaivu};HK3`MWgq=8Uq#1Eiuz`zqThy{r$(1EJ^OJW6A;RU@UNPHF(5(6K=M<M(w z2DUEu`r5K}{QdL!1>h2SiimLHcrY*Qdlpkm=id6UH}_J@%1hI*PZ1OHjeWJIwXQMC za>La?m|lyM;f63dJzEpv+pgve6YS5BU`m)5;`m{FF4?ba*)rj{=qlT;t(TDhn(^=? zJz-Joz_=o0kKO1izLRh)|A%-H=&*pY=wnc)z@VCHGTRI!=O5U6*G7a)HH@JP2dcAe Oov0sbA{?nknEwK1<U+In literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/Player.class b/target/classes/net/persei/dionysus/Player.class new file mode 100644 index 0000000000000000000000000000000000000000..eefc1ac87c8465881bad095a855b6ba80b296f41 GIT binary patch literal 351 zcmZXQu};H45JYE#V}}GnfY9&-cEgD}J(Yn-ky4~PE-UMdv8_8hQhtqs58$H^Ya0n9 znj5Y3W_I>IzurFp++!JGM7S-vQ8hcyR_$$79)0W8y3j{<5dy*@*9WZ%U1sX}C1=wR zLhIA2stG4?vLj4tp&x9)gqt}1#W#(!WwuJTgrGxuUWRe4TQ6|rxfybTc-K+$jGIT^ zTRp5NByp0qugX-)=-OGM)uAxC>cZHmKj=!*#Qdb+BzGyUe=P{pP1QQXL($o=;;!RD qf>e_)0U|kgj1b-75hlH!V%qEMN6&EH&vRV#y1=D430LxtaQzK7XHo3{ literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/PlayerGUI$1.class b/target/classes/net/persei/dionysus/PlayerGUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..7d7fbb6b78e734f20561c123ac2ed93c9aa9e777 GIT binary patch literal 1052 zcmbVLZBG+H5Pp`PTsaS@Rj4l@FIFueEXDWKn3x6(NiihV^2IO9-KH#F_nNyc$j{O! z5<mC@{87f)Yt@*Tl6cA8?#|3UGxN-I-+z4l2B3<^E=CyUv^2aclT<1ms#u?-y_D}p z;zTAd-)xtwE*yrLLvbXyI5u1!Np1L^(qVl3A{1RC6NXW9pwjX>fi;Gr)hP6t(#kw% zSgf2AyVPQE>TxK?z;MyW1&n&gVcds{35Hz7223`Tmalr9eVM!#`;lZQHsU};Es-dD z9vB^4Aj87&l;tWFIDVY<R*<={B`gY5cSKO-n>=spVlBS6!4CW{39f;~K6r<V6t3 zG%Z&d-k!@qqxX&nF%LvHQGwt`QE*7-PB+$e2%FS(7|L)*hD!7&R{!O!d6>aX7qbjc z{~N@|oMqZgWF$pOb6CJF7mEyqjFCv_HgBG!Ms|FZahqlm_YA{SpD-2k-9%~AG>H_Q zS{`#ADp+>0#BezS_&dVK3hq%h>Q$Ra6V8D7ejY>ScE<Mt)_ib~+#LB{Q9`G(ZMDE? z`ZL3Z#o#sLUJ}SHWtB4VTjguE91_!}4*Fx?k>(%{8T@UnWm1nsn#vUOB*Yy3I;>Ez zYNXu=y)N=(AEVt9I$Mjkyz-eoU*LbpVkWIE^Dw%%iUOT|x?`=EP^6U@!Ic5Z-T<Yv z{0ZI}rcQC=Bj$^DPH{JPhSfiiML2YIoj|GtvOzk$pFvM&sY(NAphW%+0?(1(mizz@ RX>}-m9FJ({k<S)G&rhlG1SJ3f literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/PlayerGUI.class b/target/classes/net/persei/dionysus/PlayerGUI.class new file mode 100644 index 0000000000000000000000000000000000000000..41afb69a051b08e90118484596abcf9f7505034b GIT binary patch literal 2491 zcmbVN>vGdZ7(E+1v13Hy5bi0EKmc1@)Nlz&1GJFD#HoQa7l#17EY=1T6v<=B0p6nh z)0w_Qf0UVGhIZNq=)3R=ot~9UVuHC$Gh=CYwcpwEoju=|fByaBZvZ2xrqCg9$Wx(J zRkc7lmhJf7v!EVWbFO@*YB!dODI^7Ut;r4f)C!(B-a~7)P?PH_g)V`E?++Eo2CC*r zw@hTBE)}N)#H_&1N#6@X>4jzK)>Y@?X#d9RpI)C9=&D9%3QUyhkFAPtRb;j1RHU`x zR@OLQulk<yLTh^cfwFC7-&D3EW1f?5K28WEUEi<rsJjB0)w=5jm6}qXfZ+s%mT4lF z=Z@s0Z>w$y>@ko<uRw3f@zkw4kEkum2d-l7CBMQfBy-`sxtI(eIf1~D()$IVc4X6a z+3}q4Do@JY&6i1O`e{W~Lkbe4aF_~eWi9z6v}TmFT@?hI8#1IdXy71*1jx3m=f?~T z>v_s{f~p@Vy>`ODN#r8E!|A7?@~F*1C_{2j=8AEgY2XwF1bPA$E^$M}uW^H|!_OEv zt3PG<sq6#}lT71tf%H_<3mGJEPV+cVnR2Cwuq$bVg|J3HOytWcTof4p-<Oub1q|v- z7&BmCryhM_pa;F0-em(<K>fN&@48?2Y|5U>75Nuu_LYHaI{W?nKBZP=-3=#QDs!8T zmRe^GGHGB6({cK=A2kZ+q(_1FHS^IIpg&07el5!A25<L+mpeR?K><ZA3|)OR_Yo_^ zY)b}i;+8<4wC!cbv;8L}Cm<bFiy$`5pf<GA-`+u5^pg{mB7dituO8|2<_#=hk?B2D zVM|p|#$3K#Eyaaqsb(RytEh<`DC15F%L1cqF7^`;46JBd>3f@3RV71ON{1C3m(Alo z{kq*r`pEALe2*U(rng492;|zB?p_-o>Uv%!x~|#n*eu1QhSX;$0~K9FomE*6lwNsc zU=>5!hw}pY4~o{JFEP`yQen*wj|klVr~}$v#V5D5%z|I9Rg_kb7d;oXO17A@I#D*a zqDK!+x-tk<fFXJ!!CxnmbY}`_j=S0MJCNazB^HfYV9}d>kMAAa(}!Jr_H$<OE%@#< zf5+}$qiuWn?1~l-U?0auyaD@hfHQV73=sS?j+2}nieMbBba3U6`4UIW296H=f*v#5 z)xdEx*+5=DPCw^{4rutp<jTziI84q*c*GzX4e_{R1Rjo#-5UcokJY<1f6bPSlHcAY z@G~{gdCZu*td|%u|HOrrml%D4OJ?E)#`R;jnYFWaU&oz3@nZuMW}<;FBVHzRztq5W z1{GGAz)S;QZ*euLC2)e0^i#Jz<iD2!oJ1Zu_R~Dhv*AwQ3~u0Ji(E6Ca@}sL_4szJ z$6A6rH-qPRRD4k-rmPjtngcqY2EG}1g{2N`5$&NBfXfu(3Wd7bB4Tz^#H{YNk%)Im zJVu^jT#QW6Q;END?-jmHV0jB!n+fc`y}14!REY->D$A{jIu^}=jHdbuwrF7*<4x15 zg_f){n_06&+oL>u7o|v)*|sR`lueX#O)ly9qMhHEO>D&2=Qms8(=m(eHFnyyX8iGH qe5cN3docgEL~zKa@fhwqA@tVvkp4FzWU(Fvd+_<zExy1v|NaBVWCYd# literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/Setup$1.class b/target/classes/net/persei/dionysus/Setup$1.class new file mode 100644 index 0000000000000000000000000000000000000000..04566c80057189940f72dbe1a2538373b5729405 GIT binary patch literal 603 zcmaJ;%T59@6g>rGWE^08KM=))1!CgJ8pA@PiOHx74Eq5ZD2^R6?U?vkF4V+@AK*tB zZwD8~1l#m+Z_hnFJ^lQ8{{Ya!frSi1MRM&;d91kbh9Z(rDp6jS>ttGQS;#T0O@hb3 zOSA|*U&wnt^o7z4c|8`YenJHPT!uEmPK6Y@!?4%*2Y1+G$el++UI4?Ag9YSmWKncr zp~R4F9QGFB5=KUn+k{zhu!=QGOcOO`Sa0~L$}o^4@3ueT1Kl>9Wm3#<l7~Kz?}C2F zsnCxGLD&moVd9@;&b)=8I$vSEMQ^dYQ4$aMr7%Qx>d~>emZ8uUBN^x<ri128${)i{ ze+lgBSjbVkLzLwUIS3;~;WgLeXlP-dVSBEj49=C5JU$NtrMN<ktjN-5GS@YpnH>!a zi?kMKcZLjgz-=DAz;3?5X|9xCvHVQA4AyBb&FZPTNEIb)P|itNTx?>Cq8zqU^bRWN Sx{GR>-J`ii!+eLimD)Ex@QrE! literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/Setup.class b/target/classes/net/persei/dionysus/Setup.class new file mode 100644 index 0000000000000000000000000000000000000000..75a6bdd54adf6a64603fec7992138b43b062f7c5 GIT binary patch literal 1506 zcmb7@>rc~A7{;HoTUjahn=plO5x0R9yz9n3Kw`3FQIi=GK6c||7HUV<&V>I;6A4ih z<7fXU<8!(TWm^m`>3ZIC&ii{W&)eUBzW)TUhoXjvz@jUC^ISGPX`3f@!@clYo>`H8 z>s&)jVDi-ZWSNfT*3GxoQ(5x`blbK41E*0t^LSnkF0_2xG0V2+=LM1#yY5<kt0@KY zeaD6JuyEA?W|qjcEhj+dizI31j&;G*1a@x4c^6y{Toaye`I4R+1D@9vRs5#y)`R=; z;J$z;2_y=t!lFPllRXlM9X3v+jwogfOkh&OoWN|jYWGZ@sM>YRVkQZJI|kxNsMV5z zBoZ3#3Z#Zr9yEGmPe%&NioPPSoEh4q;ATF1q^PR~M%(;#17jE$m?+z>eAD_^mCg57 z)nVtS%Z-}l99d0U*`3Xp|G{QYQvZk`FjkkolA<f|bSB%^LrSwhu=#(|>I~ABi}~!{ z5*E^Tg#HyJF}3J=2UFV7bQHUIq+w5BJS>&x8+eQ-l$QPibD2`7w$Oy<H9Wg9_-&-X zh}Vl5qa#Nn+0BAQY<AP=eG7$l+rnw7sn#ovR<kBw+e#)q&~-=UC}5OaS2hnF%k!j% zRVp3jml{JvjT0@6Rs<t_I8;4br_FKb*#>P61@EdoPAvbYXq}QI_}<Q4VLJB%v&UDM zzr@1za*@l_F^}(EBAts~V(m*1afAO$q=B(xj6DIJ_82zF-s0YUo)~R5_a4v^$RNu+ z+8O79_$GH%{CMsw7Cv(kfdZ=}fte5_-h*s~Aln0w#eT@bP{>2<Fofzro*`ARDQ1x7 zv-S;U1i$dKACwA#rh3^t$BPcANKi!Oo=e?ml9B>gp<L;JFyFq_A*foFFscnNLzTT6 cs4U%|(0VALZhIoEM>Vm4eZF-<Q+)IH7o<-)Qvd(} literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/Block.class b/target/classes/net/persei/dionysus/blocks/Block.class new file mode 100644 index 0000000000000000000000000000000000000000..a974abef745f95f8654f2e7fb4c291ac55aa32ab GIT binary patch literal 1448 zcma)6+fEZv6kVsCGG!PGl;ZtTP@yfzsED@`9#9Mq6-Xc?`ZjG(>Oh$`of#wl<bx(E zMiW24k20=vrczQ#;h{5U_GRt0_THzz|NQs`-~pCRBn0xl44t;@1k!WrUdulWqQI#( zTebbbSye9+hQQdK``&e$uHSGrt9!B*3K+h7AO*6Oo@+bocz&ZyUwGK2Z>Dk<_zvS3 zpCYmhSSALGLa*smydb1&c-w3EZWwilx7g=i9)w>ZWO;=ML(87;g)0KdLUEVeUbO1c zLK5RPE+AuKLLjF#bj$ktvaX6-$YOjL0vBxz!x9*+c)r|-4yv-V<5rtme5>X*cioPs zzPm;veCJWi^dNG&v*ea($Z#_X+fk_KGAmms_K9TF(tpPDDL09}p{JDlhoDE;os-fw zWg~?l0Trr-Ay8oGxyGi_@7get7D%@{^0nLWY65G8LFq5u&@B%N&|@pU6|mMm)MPv4 zN(LrM0u#MGJNBe8&-upNYGDEQO*mY;v*@qOCO6*Z9eBt(ZoR(c20^9O5LiD4`5upM zA5YwX_;QqsyB3@C$i@<8x!nhGXHuTeL9^$B^y>z3OF1YGV_>Lm6$Na!qE1b|^3+CJ zdb1W3M`MZ{lDz6k7;4Bo8ERVk&4s3Sgy#fo`h>a*e2&tx$_&BxSm}trpUA#BLhdUj zKkMjAd}cImns_73NaHeXcASGNxXLeqYq(DAxWWyM>(HujQ>8DM{KP{73QQGOkUfyp zG008aqF0eRnVj!W9zQjC8n;hLzSEzaJ2iO*v*cG`WrH9^&0&kORYNm#*}2kp+$+t^ vf5YNOT4E&@-yoVv{z^?gj_#^a8Xw~c(bVZFo*}`1R&EF_y*dKVHD38Ia>7d) literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/BlockCondition.class b/target/classes/net/persei/dionysus/blocks/BlockCondition.class new file mode 100644 index 0000000000000000000000000000000000000000..cffc19cc0592d0c04bc1e2d3ab2f7d78ef3b3e5e GIT binary patch literal 3877 zcmbVP?Q>jJ8ULN^-R#Zgrb)MHN($)<LfGBAO@Q=`yp<+xASF$Klt`<D-fV8tZ8p2h z=5A~etJardRaC6jl&S@RAVw_$8#FVvpBTp(zd3&5li&RdoDqM|y>~Yo5-H>C%stO} z&h!3u&i?g3fBG|k2T%;5N+Fi9o%WoapS4r%6RB+G+-zaCeLS5_PS3XY$<m+AOr#v1 zgrF%joU!Jt_Oz9mYCkr9#!fm4HOUf%LS$&=e8kD8GE-d&)!nH~%IQ_u99?@H8&%Ny zvlDh00n{1@!B7Z9W1~7YD5xDe8Wa#l1dSnVT4jKzz`$lSDTMNNE^Q@kg+rBE`cGT= z5&OA<ok`kV71~$fV-*L!)jIB=_8J{qxrBAx#igzW3fl|>QLRuvl*-t{g_&_Xf7}{R zQ*UG_o3zrSRz4+rAE`N~Q?m-@&}R-a0~X9#%!k4~(NAMLWI0w>?4&~Y@Y$rDlN8N{ zaG%0~^>o=~n)ahsdNP}zu_spNw=5-um_pBOgoyT0D_yXMv(CXeE0q?f%OWISrX*9> zv5TRL3ZmV>{dj<>N@XVOv&Sa?M?nk<ZHLhAR%ohBrk|U^*r1NRlo|`86}3YCkbzDx zay7Gs@maU-gmrLmoy-b(kC3|sxgJFb4=Zf>WFhwzQt1ghFYJ8=`f-Sk%t-*mk=9Bx zy~gNTSN8#!VOG&21|G#ACCsEU$L;)#!rn>=zN4QZ`(YfwV+MwBlznF9a&~4y;jZY( zwaR__yM*JIa6GQCYaOMZ&iSN)5gb?0ovdf1LSu9-ixhDxlPhpM?7XcP?007-$1#wl z`AjS05=^GE(g6YHla7tsELd)X)}&+Sbv#RACtu*qh`=&1jwFfL<yM-#wra|ha&c0J z@K2J$)-gpbtvXU%UeGbkWlRT?pmyrWDpd9KNRpm2kOu|UdKKkXJ5#q#%x>%AIuX)Q zpu%2J^d$plagISvWgK72|5py|i!W1Xw~nvSi{2g`U*+1(_3Mn-1Y1_reZ#;v#V=#Z zcFJuW#<%fe2p1JLu2lYD#<8dDyn*jX-|FsIA})mQDr{dN^Tyx+XNu)ijDSn14dEq) zO)He;Qyo8)z}ikB*EZ`|4wLdS^W!4IxQw5M@Du7-ZwUF9lUQ!x3Vuez=*Z!WlV=E5 zHKN}}mBIJxA%v?6&Fe`Y5tG80$29{#cPpL3M?4FENed;2ZBloy8h8!AV%??f%#?H5 zy|ftrH#me`3&p+=78L4S_X|!c&B>dq#hduGfw%D+a!~XqOfJ=H#f{{n!ib`l>bznk z^R!KW>pjAfboO1->TBp+u5=acSxwqqp~4T;T1;=3j(1s6ck`AR$rkcSdmtru-KN!7 zN1M2aovf_@pB5}Rxg!Zx6XqSjZw+_P^R$X<TYL#&Gg23+FJj}68QD?-noGc)9uPO* zN6S0psKR!Bw^0^Q2Mrtetw$3Yh~LP#Y{D)yVh2x~JPowvZtkedwS*qvbGV0R_Yzml zwUu17Nj*$yI&qhm5jhcm4=qcGA5BCOMYLT*^#aZYdKXYfM2mK+hzEPi(6x{Mm5A(V zA#Sg>S*yB^+GVt!Si-)WLb_SgCW_eK8B7FPJg7QB97S|@hL&;QM052AIJktv@#dhp zgn=TCG>3{9F5-!!3m;#ICj_}jyFAbP=qa!T2Db9Gb0_XV3!!cNZpVFGJLqpWJ?x{8 zN9fz<iM8nAG-9}fW_%wBH#$#xzLukN8Bbx9u`%!>c_c1dk;BtC!Ax~y7$*s7Jn6s} zcp9Y47`{lTnv%EU8LoUo%1y>^DY8-OXJo5hCOxY`ePl+)ia0foptfj67!?5n1Sc8e zS6B>Yz=IjD1ihX|bKLYWZoE7knT6+c1&_c!&sC2{FlC;rqD54mad}!@Jp%hYqC~c3 zh6|)kyR<EGCSdt&9-+VjG!d6^NusVefjx0KVUcZ#B}Yd|?YPvYOD(WRJtx$%Em6<C zF5wXmpRZsLxPn2pWro*E3@=nL2wcG++cLweC5H1A3<6g$$aXEm*Ib7Bc-&+zE=WEW zOSN9E(DQDGwlnkhqn3Xz8u1`|v4hy%g!W*7>k;hb<6$2rv7fVGAI{?;T;xOS3cBzX z*SA@7@1h5PLofcpSIWQn4%2W@CD5n#pkF=1H`gQ%tCujKuHX@M6OXFD@D=rUJmyyS z4zJ!y)vZ2qtCs&B2uYn+@yC1CpGFr+t<nA#^8<WqaoBUt1)1pKWn5x2fA6M<Bw3Jc zRLzmo;IEBrDX%rR5)V91iYEviC&g2Aew1zc^omhz)Y3p|p`$Vuskm$uZ)3lKG@iJF z3IC+#AgRX8$Pe6}X-GtVRK$;OVZMl0ZkUl@Fe_Kl=>pf?qzxw`uan|K-0K0i@Mfph ztnK<E-m1cfs4s!H5V^68DE(W!Neuxvb#BwLxog<gO&BBYS(rG*v{_8WIFpy8SCg(! zyFJUwK8@kGzE5MmPbPVPM_hosTkr;c&lujIE`$Dgn0JV&lK0gb&(HBhqTXQ!G}dP1 z53c(=O|yvWGE2LCOuea<Q2TFq=@S)RS~j>M&d}Ux&c2z7RLHFK?uL%C*&V*w3h%iR G-v2KovYJu= literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/BlockHelper.class b/target/classes/net/persei/dionysus/blocks/BlockHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..c3606812b2fff56298ed3d7fb2d812a3ef193e44 GIT binary patch literal 1124 zcma)5T~8B16g@+?-Lh0@`KVSw1QA<kSuv3ZO8TH;cxccB#NgYuoz#VOx9Ls|{1yLz z&%Q{M#E&Nvew6V{yVeSXxDPXT=G=SFoqNxo{rd71z$zY^7!p|YrLtSH9ZJ`3xPgBh zc0#-61@*(weyq1G=@B+z2&503caH5je$#$lJCJoHkl1j2S5*XJ`NE!n@g!(S3o#6* z5Jy5_tm^u5yYsdt+q+K9lLF(_pze5kPTSSz=+aPc+)yB2{l99;0+!Qgyl}#>8Z-sA zt_*zYD5qTgTl<b`yMA-<ruUk%eu1@lRF^HqPJ|}L1=cUCNcMf~m%cn|u@$nRX?BlW zvY)`hB(f%^1ZFQw5;a+erEncL1d>guHhtAT=2-F<3oZ;?MHQR4DKOc6T1UB_&2Asc zM%4|Kg&c-W%m|DQ!Wzh6R!`@Sz|>_ddn1^}d<u85z_GH;=luRO>$O1K^;;dPVD759 zb=yyADE3B=|H2@sq9BsfAR6(o2BKU&J?V5WJbG-XsD$jlf+9;Ks)cjD8w1o)@`_f{ zPS9!B<ug~SGd-aB6<sOjKyLmpzz{8pnybl^&0TPhFP$Lyu?t&VH4G#%!Zp=%;C`)p zH;OSPNz*onWV&h2m^{v#wWZ}xnAk4;#Mmiv`zN@yZhSzl^aIoHkvc_YfB6Krzm>jY zdfmtw#m|@<!Yj=igXWzlCuk+eW|40KqnIJzB6*5DJ)#(OO%-~O4flxXZw>d6@7B47 n0+v``0uQiEE5@i8V@s^I$ecZEg)v!r^)S1SX-hCtw`uh^RU#5p literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/BlockType.class b/target/classes/net/persei/dionysus/blocks/BlockType.class new file mode 100644 index 0000000000000000000000000000000000000000..2f85c372588190dfa9dd565715aa740cb7cc1c06 GIT binary patch literal 1201 zcma)5-%ry}6#g#V)@>9R6Nd~Ce;{lFsZ$}wEd(Tx5C@nPmMlJXrDCzPOMeje?jNM% z0iu!k>>p)3_flD3Oty!e``w=No$u>8{r%_rHGnGCWDGIPJ7%DEOwTth_1JQqt{?hp z+jfmlzWRoT!*0ivkzg1-)z5X+)}0e|+X>GYly|!CTj!=oV_0YmLRDiJ-ZX-KS#Ha9 zj;(-N>vqI6z8Bho)v?XbmU9x_4R7xs?aeng8%Nt3!{Ylvo2Bc9Z8=u3&LEY_O@_pl zdu*nW%z|NDK^}J)QuQdMP-^sDYJo@nYrExUhH~#JNFtSn%)vbcG6!i6rWK?)$Z&99 zK?W&)dY~YSVTQ4W<(T{7S=;mu^|oy?<QuM`+fCiGI2M;#NEjz^!AHv{J?FX|nsg|a z$^$yhqJ)Z!GD9xrpz8<bnSv!OGh}qn)4PV-=`vK}J`dWbrV-S3W7hv&k#`1Js5$t+ z@H$==y`J)5li&uQDR_!1!)lyn%cd==#d_cJ_I>buqs7T;Zs-~2j>TW%=<Rl{@I>;b zStpJjgdRP7731T@^}$50*EXs&If=fH<i-@AH$ag_Eh0@>L>e%VEAsJDW`d@#V1(*M z34I~Ve}_N7TKO^Q61fXZ2vA4}Fe$)PQh=fWGbsUP<)2g}^)R8e5<N_6tz-{Ht(EFw zR=dF5H{u<_L;5d}Hr{!JVv*D=lE#;$`;o}tS+v)YqAJ~UM{;Fp<`R$lBq>TjRHTTr zjCpR2Huwn^qVhFr!OIIh%(dQ1mFrfWtK5^OudulMm7d&4x?y9t5;8RFm58H4IlNak X&nj0?e}VnKZV1l>=L<5#xmW)JyJinj literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/ConditionalBlock.class b/target/classes/net/persei/dionysus/blocks/ConditionalBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..18dbb8514afad1556f36d0aeb724b30215698ffe GIT binary patch literal 343 zcmaJ-yH3ME5S(@F7)(MC5<PSf1gF$N6hxx3Xh7-D_DL+5JLIz?<+D;DQRD;oD8!yc zl_JgT&g^TnKfm8w05hDVhzQr#wCd9|-mt3J*|qPyDr#50d$n-3;#NdmKLjO3OgP^& z(037rcWk-6Ck!sHmV|iWDwAP=!x0h;36q?ydFnn2)4b@SHiXmMmAYQ)h6Dc><Mx$3 z;U?d6ao6IUkUhJuDa|8?#b>(>w{Lo-;|qv6`2r+TFeR7@Q#}Wg=@$+*B1FgpLm4t~ RBsl8xMB-Q&;aD)j<PS|RRL}qb literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/Data.class b/target/classes/net/persei/dionysus/blocks/Data.class new file mode 100644 index 0000000000000000000000000000000000000000..6821fd802d66cb07fc8935bb5965d0740dc1f882 GIT binary patch literal 948 zcma))TWeE66ouEE#H2}1u4=v8)=N!N@!*3Xq*U;RNURT$f{%03A)PcmC!CAWf2E+5 zD)<BZQR14Dp-r@+FEi{tdw*-~nfdYa>vsSTu~CF0uo9@mo2n>Q+S}D(a2Tht=TE}n ze(XJ$i7X;7&=|`P(woR&<h}LBYM2P*4&+pz-p@|bL{Gdoa@rFp4fH6GNg64EM~kPM zvoOO9l1K-m-dtt|?ro7#*wleewkXo>><Hwag}bVZ9I7r#C>K!|XrAi6lJOq3%c!AR zf<Vi~ITVaH9jNW}z*o^b=}+jV)enbqvLhpHVw=n-dpZ_a>;K~-=xb@Dk{3Y|9SW?s z=d9adI&&#IO$AqRy@+c9)l<VX>*5A(ay|loW7)<tSS;UHly1$*SY=v^PpmyY!`fWS z-vx}>J1*{Gol?`3&K6L%@xM?6g#LKZtL+yk55hDWs+ZclNy&V&2j+6H#>dO?YYI5# z1-Ta)Iap$rg(!2aF!MBvfkyWTZuc8%?~l;<g65~J`aIWK#wj3ALY<@w%(?7l4=!Sv zyTBz}w!A0QaG0xfKcl&Ej4KX4GIU^2#s(;D5X-YNi(ms*u*!4(9^A69*OWFxxEbvJ eF>dGnpj9*4>a6aB=31JudJk=C33Nzu(ESCq$J0Ro literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/DelayBlock.class b/target/classes/net/persei/dionysus/blocks/DelayBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..8c2e457cf50b4eff6d98ed32560958b97724f622 GIT binary patch literal 1430 zcmah}YflqF6g|_|(q*Mm9szt%6rtTBE55ae%1gltBs4YZr)@ha17+KEw?zJve$a@B zCdSYH5`Ts9&a~+&CTl<J-nl#X+;h&{>5pGuz5$rSmWB|+6^DCPgEw6+tcs{Rhi=QY zO0{}<&$X6$%|2X|v4#jkDqySH#SnLEoHq($pEIy^2BXToZ9f%GXDAt2s#ka%47~=T zh%qGc!r>dO{St2$>{5+tllgktt`+U3kn2t|;_V2RVLBhc!>631?(SdRBkA=_ks&rO z9N{f65SyZoFop~yF%TtF=okLkgHZ<E2a-(B890v%MBTBav}AtQKCrEt?NqI8uPK~r zE{<_bXh<<k2GCPB6%HHRz$IKJhFiAliUZ!UZz@Pyx0ZU*xfz&}2oaCaWFl=K1Ct?2 ztT@?pw#~8SiJFxcu9wp=!!RB|E>DF$m?c&fdGNfFl2AIbxF#K%V;D;RD?C%|#SPrj zaFd}=+0t!k;5P1%&vvD9s&=!q%gbIa^NRTH+f`9!SV;$oU$#9v7qmf=S9to$n=)^B zG|H}qd4>W1sJdTtEZ~ubhvbs~wXoCVcE!MB^b;#J$Wqyofn}_a3L0gpVlDHB2OS;K zqbCNQVvWX2I0yAT8j{KX3sU-p(`XU$M36cqpAK6d$bYsfBWQrP>#b&)uL^mc68<#L zO2L?*feF*JGlb+7q$onMh8}vxX=PEK(K~8>g#M0#5Da?8R8qqkijDRL^dUhjauWUY zl*J1KEx}{v_!0E?6t$~$dIP=G&`=1&Y8~q!NOVbs{y5}y>|pIGV!(`fj6rh{!-Qxi zM~*ONe!#^eOcKHAugJbkUOk3&g6ko?@H>tvX$iuJP+!TgA0vdGC467QOjpBQ+#^o+ ziKVn7r_{Wrj8ro!t@w-wvSIiHiy?eRHv0*yZ%+vvCLc!>e5zg86*!7@JR@KNLmtlw Km|;UzZ~g{oRzrRO literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/IfElseBlock.class b/target/classes/net/persei/dionysus/blocks/IfElseBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..a71dd742f2f8fdc4703adb36c3891fac8b625748 GIT binary patch literal 1446 zcmb7E+fvg|6kR7xNiX461aF{#h)t_RylVj!D2i5nfT<&IX&UN*kaU`akx%dw{0Coj zL<XI4eD<Rp_en7pok_>(Oy=x;&f068wRg{tpI^QKn8h;%62r7(`Fhi8c^22}+;#T6 zz|(8CYi@h`>So#YtVIzhkQs_GXO~>3&V4Fi*dc%+ZT?OXvJwLg&qw$YL(d#{xWB+K zlm8E#R%MWv+`5%P0$CLbRE9)etESM$knOlk8Vmy}29YC#W9(QAxyqKYYv{J&H1svU z#hpeejT0DAFw8L3P5k;^(^7E~r>Jgpk;sVYu9pya;$t|Y;;g75`;-xhF%?Plh}C%& z<CtJbl19rTqPF6|=eAzqo?lXMflkFptq?GUiwv1fgZery3S}^fOTw!>!*Kpz6SQg; z1zc88WatYmiU?I)!3;TU)a!p?U(~iN(=TZoDO{yF@LNHfjG@269qW0pQ?pv@M$Hb5 zcTK~t8Z9p3qonM==5)o_?sxQ)MkcvqG`Pu7j>Rk+zEO(nhOmfqlSSn>rqvYl>?yd* zF!X0UqMZy%m{%~zpvAa;e7aRE;6BN18uX8&$?7gw+YlXisA3UI<aWdIh1;uIN3V|j z7QHO1SP=w0+}U-vi6P0IW<ZdMxNC>L(A0^E=yEi4i2PY|gO+KnaM8noj$X_NqcA}O zo1j;QK@#&zD~Z+$QuIwz^cFH@fce4!GKF04KKctEF|?1<h2lO&3!iZAD<)s%rVcQD z2u;GvD5XcK4`JC^`ktfGpyDzW&(LoWDn`%?4SkqHKd#a4NShGXaf2eF4uvribQ8B| z?>6ORitdC01ImaC=)^l({EU0=Ff1g<hj<|2J0>Z&{9a@d$1((w=xqfN3-}PS^oooT cxsWj4E*VMC@d%HJl4!7sCxm2pN|A)hFV)m@&;S4c literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/InitialBlock.class b/target/classes/net/persei/dionysus/blocks/InitialBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..b93dbecd42cdc1b2d504434409817f30ae108af7 GIT binary patch literal 1255 zcma)5T~8B16g^W~wropVmf}ZIOZ}oPlog4INeL!sO-KqplwkC2+fLSjx@~r6jr=Dc zG*L(-@dx;$jCZCR+~CIeva|Qjx#ymHX6EOw?>_)+V#`2^Vb$Z(o^U_l!XApTcN&C& z-5-qyCxN}^2`QY>u8It#8CL!Q)+mOo^o8pZA492o?0j(SP>PY=6@hFs%=LupIWqJ) z!`7AU?QRnLz8H$bDP?<y7-qKxsoG(fsW*-o($B|3Zej-WdCb8yP-G~_+j=K_sG6H7 zV15n^RvsD5G8DVQ;|JmUKKBou{)hxw-SNN~9XY;Gag<EUcY<bVB#KM$i6rJ+E+ffQ zY1JE71|`Uozmoqqy%D*~@T{JwC~j9GpvPr6X*b?7n4OOUK9O|hfq^>=i`ur4<GJ?b zj)4`1YSOtxqrY&ZW1@=rEGlZfpT`3{q-zjx+3}=*%J8&4onJHeXaLV`$1<<_$9y2$ zkx3d9rLw3qWQZu7m~?Q>Jl3#I)DxfYJFXZobdpVoX=^8%5COW5$F&u;L{!{MhUG-e z)J~Eqyh$h-l9}Ry$oSqk^auQ<P?v5Y{>V1e5u|H0><m3oy4~uk(rQqYLYA`hgrLmG zQD#@iK&g3-eDeZ@H|HpQ!@?JhUZih9^O(ewLy_vrl*>~!)nEzNXl1yL8^k^Ba8vWz zlvS8a^D7oU(@zSDObJnxe@HTyBo!<Z>K5&%33Xf31k^lDnd$|qq^x$(vhJ>(;oj?( zwYsj>W{aJn@rfYQ29}0fH0L7eE0eAz-K;sKiJB21DrjjjRn)OT)mfUt#v|>=rsjM6 E8|}h79RL6T literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/Lane.class b/target/classes/net/persei/dionysus/blocks/Lane.class new file mode 100644 index 0000000000000000000000000000000000000000..d3c243a03a2d38793e832839bc9d94bef01362eb GIT binary patch literal 1919 zcma)7TUQ%Z7~Llf3>n5!F6AbrluMh7WxTXS4WMnI(we4KYAQTAOpaknI>VZobk!IC zgm3-<UwrU}ExMM=Xa9$PL*3^jkQ7{@Su2@y`M&+_{aq%1{qx%&0N%ouiIl*FKqk(f zjAH3K6+aBVitDknT?@V4*eSY!G+_vwee6DUothg|o%`F5rI!etag)ULc4XzIwxvx` z8`TrP<`n%nDF~!D{A%DP^+*a_J$AiR>=0OE7FGz+?S=J#;lv$*lwT1r0{02w1{-ji z(nb>bL6ye6OJ2<n{A5L-E0ZnL_*PhvY0%t88kRtR(GO&){$yK558dsW1`0j5R(2y_ z?VE=KRhis4rf)ElJtlz>ub()4C0&ZrxQ%Y~kYlpr#{w5S<wF&M(M-}RY5Bv4aoZE1 zP%qf9@tQ!-QZo_fGAA>YEnDcqtc_{(o0u0EZZBQ1D=Vsi7UnRkFf%s#RPuTnB^Q{_ zbRyd*UbftaH?Uyh3VWp;K2B^nc#|b^E3D^B{2I+w$ZoOlx(5YjP7g(9e(*HhWi{tI zGFx>MSA$z?&pf%8u-#)5ivmNf{yw_t#d~DI{L0uu0m~+q1TLM{wCl3QVY0D;4+JbK zeBj1$F{}!#pHA&$rP@vobEETm!^TbAV#oW5jNBxQ1V#>9LQmkG=6RtHYxu~-ZO%Ze z3Wv8g*1^Ft0{M(H_Ht7-<C*waVEQ!K7VhGnjS}vY(_SR+xmDj2SbGJ{9iVmFXSbAu zPi%aO4UWK$8<#X&PPl3lKiI32d&lw7b!Wpxl7lAbWo?A@$dk8y^#(|*FbgU<xX5nr z;>*!MN)0D>CU+_H!cy-Kt_Rg9=qJaF&mP{LK|d|eayQSX`g9vVW8g<FQW)Z|0s`HJ z^$EB;hY{X2z(=*K!&7C|o%;o2KWM|2Yrl528wQxb>%143#CiUzxb4nU$DN1%*Lhlt zRnA{(xxh^BIlsSSZu2=V?PDzW69zVoFQ{Z6mvi}jOtln^Fg?I1J<}9FMk?dPo6wPz zGNLtUs+CHWQkO-pNqChu%F0%1^9RVM@Ti4u>AUkx^;8?8eS~Q9-|KCS_ztep_8O54 z?yu`)e8Undc8mGJcXKcBzOk%=9N<I2^>-K@Hx95W@F(t;uH<vSqB!~WvO0Sp@a?~U zPkv9=M%gA<I8c^}S<0NFka^_!yoSq~R*pd#=7`oJ9^y07NMiwIJR-^r*NSQvPe0eV GoBshEAF_M^ literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/SetDataBlock.class b/target/classes/net/persei/dionysus/blocks/SetDataBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..2c942d4d863a5c15d4b845cfdad7c91445277c9e GIT binary patch literal 1782 zcma)7Yf}?R6g`~;CWPh{6<>(pMj!zhU%0MeT}2RGBR)V7pEV?1I1(nQ%!FEg!2TP* z?A8W~waW6FRsJZ;)14HAO)74slIgyE``k09Pv3m~_U|VEm+;m?NMO`cfn8K3U%7V9 zEqL30*|*p7h3tlJFREbH37i={vk(y&YLRTR1R^=^5Qt~qJ6n#Ocf56bF(|p-dRid7 zp|%Cur(MqtZnE@PV^U)zxlGVIg`A2Z3@H&s7m>!2%Te?Q$SOx=s&_!3Pa=+XZt<K= z)q$hvw{T1#@gwF-+eIaD947=iZ)XE{s|qPFlKDSd)4KL4iPIV&5)e!W&PZ5j*Q2u% zZPn4R#5w#V&_->PFVI_k<#OQW?TqUOX$$9>-=b)S8>1Ly9Sspf0!b}PO5j)%MU%^& zn82ik3j*EdQ1(kn*tkeBom}oedmpX6SJ@z)d?C=2aXqzA-dt0qC1)+K^w}1&PJY=b zxq4m;MuK-P-zM2gt$IJv4sDyxx|<c48*8;mJ22fULCay7#^(OWs$xJB`xbr?IC5aY z{go(KxWo8c1IO?yezQO`wh~-tO5DP2f#|vl=DeUpACEK>yUxEg4K3Ue=sFPop;NRl zN24Bu?m7NDhGUq8)Qs*)+{f=M=I<A~-lSM#tz=`U6Enz2Jj4PIx>ybb4nfsOHtuT* zHG#(xPw<pb)IodZev>@y$R&wq;LUA!y{*CqO_TWXA#1m_xt<|8-0H-QB?MaL7*}Zb z9>`3IdHDT@-OHO=bMVyR)ag1+Y8|XGa+83u#X`B1Rd-!|H~Q*5KB;SCnAbndjvL~K zJ;03E70i=o4BZ}Loc)Q2$+J_t=uE}CE9g!AjUyGDOpRACkeaAqF!c|HJ|eLiAKAs& z9>zmh`O5%Z;_o1v4Il~AMZj+Kp$GlwWl!qEB)j5et`1d8;0msC1~vdqMVOH$7vgvd z*ZBOIu?T0^4Y>-(5k}_6<2QCN{TVY07rx*$XCE=Ux{JFzm|v+|BhdkV2lwzGj1^5g zyoX02d`4n?2a6vF73O~saLOpr&mzZ3`2+@V5+kHMg)@e5s#<oR@H|%V+z_6}C{{^S Z-<ULB5bq`NB-g5uSBwa}W-Np^-vQCm#!3JH literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/SetStateBlock.class b/target/classes/net/persei/dionysus/blocks/SetStateBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..5cbff2ca043f15fb8f164f53293d064d8f5b1bc5 GIT binary patch literal 1603 zcma)6-%}G;7(F*^*sv^6qd}1t!BR+qxYkl@jV+==8%?1#7=J%3$!)w6Hkssxk-w#X zfG>T~DKNA%j?>5fQ60~{FrbzOA9iQId+&F?^L^*+{pa65Ujz6OPh7+V(vj3bLpEDd z1r=3~Hd^gguu`j+S6e|*>Y@&{ylz4lj=*S#)Ap1=yk$}Zl7(mCdKlEgs2UV?Q$^LB zK=)M@DgC`bD*fN>Oi94GQLji3UFh}U!WZaDXG#h53-rCmrUwF__&A1c=0xF|?7?xQ zT$~UXKZ@h>Mnn1-#7TkPxw2O4yA29V6h0<3XKD}mIBftNO)#_YsgF3i&DV&JGZ^I{ z*t%?y=5D8Lt!hC*wRFzKS%EVhN)?!xz&OzjgoiOqm}w+>kw(@<Mxfu$b|2Em6wYy0 zVWslHXqQ%=$+FI69tsQ;R3sPMYb&z39In)?MD=o5D}_yE;=M&jKUHL%?KF$`q%g7? z&D+e1uZ2}r7MM?WO1~NEFxTmT8Gz;N%|9>8hNdrDE-nciKk(H4P6C&W>!fZsJY2z5 z7i83Fyr#U5??4+Ss#4EKy17B|4|C)@Cf%E)i)&Q>F!4AP!(bNIecZrJfgXa}|A&J~ zrZXSfz^J+4;|KgG;Hs!1pD+FTKkDTT>@6R+Q6OiwYGLV*bUsruIEy}(@G~92k_IEc zSB?Iu27AnnkM8&=Vwr-eXuZBl3ydEvl<`hnMU6I*$2zHIWj*4IRaRj5P#il!iYFAG zynt7%x0_|TpsZQBYumQ>%z0x3HpG^BnF++q-^Z^Qzxk)|-NUE}hburfyA3a!?AydZ z_7#$wIF+5+#BlZxeD)W{9wa~C#uq!7jN#r(i!sgjX^ZC(p%)&^Rnx~iqaPUz;5_#S zcaag`0wdPomD<g^0vGWW_hz`}F#6gu`I|iBT)97${ALT^zQOF`^cLpGV0Z`fF<f#| z&TsIiQ_dFhFL3r?)3BO82ziz#4D+rX{1n3*j7@Ffm*0sUgW)~G{=v)8!wC!_#dr{t uI7J>qSirF5KC{bZpZk5>MTuO=597E;BoB+Y%&3c5vv`1qwwFh?%Hy|CqmKpv literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/SetupParser$Mode.class b/target/classes/net/persei/dionysus/blocks/SetupParser$Mode.class new file mode 100644 index 0000000000000000000000000000000000000000..d87f9165fad4ac9c4e240fd4329de225e741dc52 GIT binary patch literal 1284 zcmb7DT~8B16g}g%yKPyaR0Js?ejv8xV?hN!+8~5rLM&ji(4_HcTgJM$>^A#B?7!0T z0MST%_D31-3>Egp#O}k+oSA#?oO9>QuixJ;04(E`h8qlXE)R`1_XBPlhqmW-f+#Q= zj@SGY7$y&+_B)IA{Fxo^kZVXV3?5l0mf=`#%h+<GV}^w5xtw94+DD}_gVuJe4xP)8 z3VplPl2i5aWQKvQ-GiN(+D7$Y%Vb!5-)HeurRmtN9j-Abg<_3JZW8|#k{K`z>&W32 zgIei@j25cbqD*4rw#wVZTAE^S>qtUPK@;GP4o!fR024Y=0;C1Ft0N6n%<k#PV1Qw$ zYP)<lI&N@(-)cD2pj_2!T29UKZGq)t1`39WT=>zZKBy;_6LFd>6^i`{&Y*yjh9W~Y zCZrRD{8+~v<{8qK?^~Uw*X}Ts;&S&IN4y!9w__dnyF@LZYm%h)J}_*=(|TPh_H{2p z?vjoLEHkXct8F?~5R_vSuF7A_5oROXWK1veoBWL}TAGbHbWwzoP}6R?Rv7uT{W?}r zq*wZ4yGEz!+pf!fNsk8_UNFr5pUde|#fw>AB1<Ur+>-0#!bkv(<RLkdedI{a0kV1F z8;VSjt#sU^yg@>r35#$4J6Jt8q?{ppiV+D$6B3L`FrJhkFTtcL!Ibucl9Vn+%zC1W zF|(fRB5&5!E~d;=On;@iH*lZ+85%(jenw|MkgH;c9!ZbIGHDPhw9?$<86I9IsuX}; zk}l^OW`rCn_6W1R^i`5B(nq_PuD?}E7xju@wxdj(<MI3#+PS20S&dy$NRw3-do@ZF kBhJd?Sm_+bPq2UIDR?4lJ|#h-_6k--Cgn3c$IJEnAF5a?mjD0& literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/SetupParser.class b/target/classes/net/persei/dionysus/blocks/SetupParser.class new file mode 100644 index 0000000000000000000000000000000000000000..7f75c75b528de499e90d3029f7a35bee9c04c6bd GIT binary patch literal 1942 zcmb7F-%}e^6#j00Z3wGHXlO%A0h>Y+C~2t$3$#KJY}y2{K_W$3H(?74%LX?|$3E$3 zM@L_L*73y|XENhBBhry}MCp@t#__=iUmX7z^}8EFafqWn+}%Cro^$SZzH`pqpZ@rE z2f$h66u1OBExj0D*X@FC#21acb+=F|#It5Tw_1p&^<rs#TH~Irz$4JGqTSKrre-b0 zr?M-0t|)LJoX#X>#;)9&8NHkw4>MS}5-eN|7On&f?+X@A<rj4U*L*_2H*8o&@sfZ$ z5}g(BjBzUfH|kX=@CzJD8kRm;TFdJ8jFvU&)|kxaG;>z74Jq#`J;i0CAP`CZw{(UC zyz4SCfp{eOB&~GOHms$gXw5KA2J{S!znRn5izKU{;IP18tuysKn|MkyZ|ChbebEUp zVVL?}00qqg=l;b%v#b?omi38JZgtPmkD~%25I_r#D>(MI+EkKI(TWpHv#@R&EL2ym zH0KYdUWax(tDr-myB4g2o#7Ny#Yu!&Ju7dK($h8R`v=z{nM0?FE=1T3rfw}2mz{1% z_z`1{?Q*|I#cA{k)D=qEf>R@b=13wDJ(z$WXXtfOdiAL|hvyhof1{+CY>(i65-Ke` z6usd`zkolsZfbWq2a<s2Ra}tyD7!j8SoXRY4_;c@HMywbk~HyGm41xSAy&y!2Dz+a zOj`IVssIGWRd_K$o+8otM1VF|R3v2HO5R>HEX@p{3H1R4QBR}W>=fDV2ilWWH8~Yb zsHsK;>AB|2moP{~f}%7gj$(dQx9B8R7{C$gi0M^{$tS_wP%)3!Xn036OEUTy!u(&Q zRB%(E<q6)&e7cldo-lNCaoo1^HfJZDFWEU=4gq_1-<{Aay#&;RW$E^qsTB$mfk)mH z=palt?<~;}kXZTUriRx8pLLYtd<(w4u?Glz%?}q;K7Ec-!BhNJD+YKPhbYyd0ngB? z(Xn!o^q>qReq>-jb-%|Nk8B~7+(cW-eW{Gc-K~9to{(n?r#^wNjQb%^W0VGiUUxsm zPeb0IuWwKZDOH2_LyDW$-Hq`roc&n3yd6>+&pSe369cI-@>C2~6~k2Aq~e9DVw8&1 zL%i6tg_nB2AS5P9fLtD~F0Kx)FxQDPLS;0U(X@@Gxd*uVXd6MkuRXfw6G30dyYtzf z*?Vr$+Rcwau|by#J@2sOk{E@g)RPcNNsyGZl8$y9MwC(<&FIGww)#<w;uxlJ9BH&+ zffgDeEOPEG!mx1)CBk|O5xh&!_c*Q}aDB-LU-4hF$wB-E=kYxT@B`!i!qa}kMW-~^ zE0iON6!9qd6_c1^s`a#*W^5O&e#XnV&f)~I&GS<vA&N3)Xy-)_KF2HE^%3bunB}h0 z;Foj87_vJ)bh-t&x{1u(V|X?)4>7m%UEo@56QiV8nJUARq0mObQxyg%c&oxN1z$y& yyN}EU&u>78Tr7~SPGVU=j2ZUxJ%AC8{X&fvbP<aSx18teWDk&6LOWM>q~$M9B*ljS literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/blocks/SplitterBlock.class b/target/classes/net/persei/dionysus/blocks/SplitterBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..801dc5d9193bd82c84ff9f7cfde7322ff76a21b8 GIT binary patch literal 1550 zcma)6TT|0e5dOAJo6<&sf+$k7C~8|T@q#y^peQO@@d8#seF*ItJQ~tYk}~-2Z*WFu zeDH}EUvvZpopF5jC-`I3JpnJ3nd(Dwa`x=*xBKmP^5xryPXLbKp^gY4=Ze6r3C|bO ztjMbS)UW&Ij8iQ?@y&^vBZEMABWkNdBV?O+hhBvE8R^Pkh@j=h@+Dp_R4XEhC|V4} zkR(KN`BDoAhJj7kOo%zQD||v*@v%K`oAp3CW>NZqrK63ovk79619hYcTf<1sGiy!+ zo^)qN>e8tQFM&=%%2#b<6-qXVc66yawi34F)&Tzqv+^b7(QRNmdbkz4RugW8kl|J~ zIIm+^Dx%lG4(uc(g6diUgwEW?5cX|FR|>n(uVXi1b7RK__Fyj)WLFrop}ZS2k3~7K z^3w_A2%8!Pqqr;>*pCBDwrkG`LV827RtpZ{unv>Z--OX{hLcZg!eD_MCA43!JAte@ zVnLCrWI)(k{GS92NEk41T&2+hPDyAjN>_~6=VpXAY0o%eq1CeOlx$C`{kl;L9!b_i zp&3pC0~Uc?e#ZEbET}nqR+b5)xn>zI+JS8~b5QDH#tF&Mg|esxd^vm_=LsFZ)%NQ| z&GdqSix_1QNWL?6Q1u91KSdC#dTiZprEnQzI<D}fek<VTse!Awrba0ig1=?7t^*~b z>juVggGDOc`RWtqvj5-h=BE|%Ed#ePLC_!B{&)z&SCadTNw-#K$i8N*gtT#W>N@?y zH6)Pb?5W#L3_uQ(IZ>^9WpPP{<8K(_A;ksyST|ArK>-o|iXqN#op;aqOWDsAR*;CE zUBte^d!#<1b?PJ9r_voO*pgYswq;~ikX=Pz1b3fBDAV)$``1Ex-xBhLcR09&V{gOE zC-}W1%o~TsYYP%6@Ol(UoI(o2FmRH6vTK-ZJIy;r#~>`OD2@X-!(Xb#vl!xam`^p{ zoeQ(RVoRJYmNulyT*U}sFt&(Y-LX|%B78>cpw_MJUq<l-QoS#rYm3mLL+bb@;pO+Q zy>B=?0##@i(*U&bt{oYqVe)z!one6k;hFWTKns(&!(}iuO1R505%#@@DQ+Z#4otI6 Km3cqR{@@1y?S5?l literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/controlroom/ControlRoom$ControlRoomPanel.class b/target/classes/net/persei/dionysus/controlroom/ControlRoom$ControlRoomPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..6af9a0edb2d1ba4243cba8fe2a6349ba2b0d8f4e GIT binary patch literal 1554 zcmb7E%Tg0T6g{1U41@s!Xb==diI@j4LGhUwg&>$1ElVU-E{D(sqm!A`^hCt9pWqL; za;>GHF8ly@uKf>}>g~ycpjnv3^z`lSd+xdSp6+kIzI+9+fPw-aL&oB+R^^W1hPGwc z)}E*dt!!JaW1Eg`SF~Jx{)pz$w)sQd;--QC!^l(px&A^EyN0!`6})wZu;7lNn<WA! z(2e{G11m5L5Q1=Z%Pr|<jrUZ341RwS-I!+xx;uu5rWodmT@Xr>W5%!yH_MQUb>$f^ zF$8k<7ViVGRS`me2!4#HP%+BjkI4f=MZ@9`YL!jyJk~c&PRSPSGNq+ca%49a1Cl&L zwi^Qf)RJ-;tm=m4=Ilz<wz%aoL}Eo*Tut9~wKYet?igi}j+Z3SlPXSOoG2dk5q&s~ zDFtT;t>v1tP1{j%7UvjxmWxZddzA7avbUWMA&MCV=NX1uj?I`VE+EFxD>$(uEQZlG zW_5o_D}h-BNrq$>JybCV5<stBE_2~YpwML}JC=Q&yR|AMmBK{@3k>6(D0zoeT*4wr zbDO()lG3tim!DBLM`H1MiE6H4YDGi1>3&?nH3e6jwQcRFxQ-j7Ct<uKjgWToB=>Eq z(qWOCrKC28q+*+48hvO%(LOWiBZSCNt?gBtdQ1OBEYq<9n_eQC%!zKI7cZS9c&oee zcEtYQ2f`C8!yS361}O7&yXKVnsv)mZxa~EWmy%;p^OnV(oT&@JsRivPymtjtbXooM zdigMc9t6o!JgYYxmN%H@e%hm0v@=N7B3VBAhZ4z;7)l&q_?>tD7>&{!n8tA$Rc{_b z1Y=|ca025EgxBOBptVFId4P%Jdra<QI`IKRpAg@NcHf_Ui{L9io1FcO%M5RR|CAB@ zkP#xp5tyZMjv~wxb_#J)n~a#Kqc$Q+JB<v*9K$GXB1=)n5ymatCafhoFB#VNmf;Ia jJJ(=1LuX}8f|B7%=lo<1d|36yHQc3th`bp^&BONxPI#8* literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/controlroom/ControlRoom.class b/target/classes/net/persei/dionysus/controlroom/ControlRoom.class new file mode 100644 index 0000000000000000000000000000000000000000..2a4127f56925c25d4014d23e0605f06d9d2c1fb1 GIT binary patch literal 1193 zcmbtU-A>d{5dNn72Wy3b$j^cZD@eBpMO3(eaN!aX$VQE56TLeuN3ALCrl%Es0xx_6 zpF$H^5>34F%D3>&7x30Nr|boZiwUtw&zUnbo%!aQIsN|o^H%^jv08#bm=9&*wq&fN z@9z6i_(rA5ZAM`dM?oA#2X6gDe#mkOdBWgJ@k+dQ)uA6gcXzg8aUcnWmI!4)*l3(1 z+{~%a5A^qI97xF|Z4t)12HMp|_Og_WeGzyJn;}2m-Xzct;UWiAi3k%<1gR|S{aSDR zc>nDkp}6jcezHNBwEq#e<`MGsXkV6*!=Q;iTq5M`n%4`$WfLXzlvx@vF^VxlFGIZ> zrQyCJl<aMOYM!=_o0z~A!YJD}<uj26Nj->^yw5C)gz<6~yW@M+#1y6pW%l)a<?jVd zX5M~U^GdizSpOe3%cx>jS8<&XcCY)4KCg8p=?v$;yLdvFZK8mpCd4r@j~j$OE>gE# zhKX)BGif*UFuCF|$;M3hp^Vpb8~Ph8-b)YmWc)~EqzpEqCU;zL-}&58=93pbv%hd2 zygWWVqS=&6%`6di&PPnGYo^`KSeAFAG;Yc*Uw6^crSc`x7iUqINierVF0dX5r6j{X z?UBttrkSlAU(Os1O&&{zo;uzu=!NF;LZ&lW&wQevSBo`o+1ucK)j7t1Gk=63$6B_Q z2Xa3La#L*#JH<9CPQHyv=L@P&96H9#5#}7{6Xx2eeawO`@LJ81jUtaRPFTSR#(9`0 z7}z8hc~n<eT4cZBlXP&g#3xRi!6d7P|0~NKP_w)f+X|dz=mQG|bc$l8w6ZW7vw>UL PdK-6m*ELr8U4iij|GPPA literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/exceptions/DataValueNotAvailableException.class b/target/classes/net/persei/dionysus/exceptions/DataValueNotAvailableException.class new file mode 100644 index 0000000000000000000000000000000000000000..065ce0ab4815ce2e171e4d443bee7eb3705cc9c7 GIT binary patch literal 444 zcmbtQJx{|h6ug%v4Qf+b3M}0a3m}BW(1|ah7Nnx63y|GSEiejB6+0FDEG8rdegHoT z@e%<e3(NW4d-lEaeSE&X131KH2#;`LloJb8Sf#~W=jPd#R;Z^`EgUl|#?r||W~G|u z?tCeACTE$t_?d_B3F{AXDMcpDo%kIPdR7%$W(iBP(CuVQpesUW#HvmjSBnP2!Nl8- zGd9vZ)<(NiLStt)A^4+wu3BhdH9`w*LO0e%P0PobDsCzdgnpc-yg>3A=HE@<-D^uY zi~senBSPysFN;)N>T1>Y-!U9i31ACso}(oU5TMCt$jrkESFDFNW5gX%b0FAzMdziy Y(q*h3fCYMtQC$aEL!TK(%;;g`3%h!8zyJUM literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/exceptions/LibrariesNotFoundException.class b/target/classes/net/persei/dionysus/exceptions/LibrariesNotFoundException.class new file mode 100644 index 0000000000000000000000000000000000000000..2a95a296aed02019d41d3c28932cb6d9ed970318 GIT binary patch literal 432 zcmbVIyG{c^3>+tS3Ce?n01XYI1B$FDQ4mca66ll$NWV!eSaj?~w|fD8i3%#D6np^R zfhhR|gzp4&G&Hjwdp-8}^>gt8U=Qn6lnDEly_#|A*r=&V?7hpJ;=2jYyfCLCGfs7C z*bNguNHRM;{;5?F5LU1CT&q~yOZ8hIv>m5L$0Lyyk&BZf0-X|?eNpt<`jL(^4&QGd z7H{2;M?&SmSmO@~<?WpjA?PPluAz+O25P7iT9L6l%x=b<p6hYUgie%9WPogz^Y3Kf zuZ$z~qJMkp5o%{imQHwJ@-dr#+wbPiu?1OL&Pmunh>E;bVI?d{BwDBoHYB484ureU cXg(ERT7r24M4&C$DB=(+=m?Y33YM_;1!6#PhyVZp literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/exceptions/MalformedBlockConditionException.class b/target/classes/net/persei/dionysus/exceptions/MalformedBlockConditionException.class new file mode 100644 index 0000000000000000000000000000000000000000..afb1f7fe40565225a0b7df6e6e3dfe29f1736dad GIT binary patch literal 450 zcmbtQO)mpc6g{`?w9*f)Vq+r~5-hw}R|rKy$_CxP&RjgE?=|yggtf%ZkFk=7_yK-~ zy}uytG}v0$oO{pxI5+paeLlYeSi@`u1;VD~RE;?CY*b{Nz4e(_d=v6073S5Uj?Y{& z<Y+r~;Z@h!$mEUPpNR@egy~CttyQe;x%zDoTAmZ5<GzT?#_9eJfer`_5%H<EX<x?~ z2lo&2cklM)gHT>K)}$MR;?i=TQ0lsft0-c!jw)(|X3tnY%7z0@PV^vVLc8ZeIiTf? z@b6+Ny)d4z)%)jX9YXckWl6|;CO@|LmldnI3s`_WAO;iW5TGovBCLQ3$wUz~!Maq` hm;=Ge6B>`>k)~k201;>j*2j5(DYS)&&4LBYd;!p>ck}=N literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/exceptions/MalformedSetupFileException.class b/target/classes/net/persei/dionysus/exceptions/MalformedSetupFileException.class new file mode 100644 index 0000000000000000000000000000000000000000..f9e949672ec0ec3639055aeea6b782b2c85ce58e GIT binary patch literal 435 zcmbVIF;2rk5S(@51UU`~0U9cx0t!yF5YYsXK!GNZ{$ek1$gwT^jNma8@B<o<D0l$8 zfv+Ie7En^q%<b&n&ECx0=gTXAEi5+S5Vm8sD&;I^qe7F!w|S8(z6m(B!g6)2qw^%2 zayVjJqz5MA{hwhIb;A6WzSb(z@rC*w5V|>MMn_}O6_vBYJpvsO+5?faI<{jS73_Yz z)7{g<>OG;+H?gt1gxcErm{1=iA$zD{)`y1{p))iwpA^#xXQz4+F`+k10$HGCjqvYg z-CmlU&>#Na)DFQLB}Eo+>6NhjM*y3pcdS6ZEr}AA;G!XCQ<#GpsYDDdL0>wm;()vH cjP_%7r6X8AfCzL2{i=2`hn_GASJ1)27xsa1l>h($ literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/exceptions/UnexpectedDataTypeException.class b/target/classes/net/persei/dionysus/exceptions/UnexpectedDataTypeException.class new file mode 100644 index 0000000000000000000000000000000000000000..f8816adfa09ceb9c928bd82cf61b5af3a44b5a84 GIT binary patch literal 646 zcmbVJO-~b16g{_}v`i_sfP#|1#<V4IqDv)i0283W1<?JYy{XUC*JkFG&?Wy!6OD-r ze}KQi#D8Kq^8{RISddB1yPxOWd*{dRZ{Gnt$9fq#!Aqw;o@kP)jR$t@X6ZDI^`fs6 zPcMy6onB0|?{%<iyg8XobnhlvMnTYgZ_Z6TGHw{(CIsaHiw|`sXmtM;9Q(w&;VZ#n zs);qD9%U(Vy1y%s13_(virzTiGoz^%U$~!#m!)4%1=XSYOg=C!wc7vVEbNR2S^>!; z6j2h?yVmK^^uw7ZC+2LV*(~EeRSmW2Uk3~RolOPX-TNPc8<n=Lv;MVUx%KaG?Oqjm zJc_W4RYAVh?y(^a$KY<q<7v{@H#VDa<BoGb%MOW6ZkXr)%kkrywAN6@9HW&Gtuii% zP$Mod67v<l#m;BcKZcSA#8L>(p+P(PQ-CIx=y3(C5VPjDK?bOIzT#m=zR=hrd}1nx gjHZDCah_PDe#E9)pj=^|ZP%2UwH71=k3;X1D^K2(?f?J) literal 0 HcmV?d00001 diff --git a/target/classes/net/persei/dionysus/exceptions/WhatTheFuckException.class b/target/classes/net/persei/dionysus/exceptions/WhatTheFuckException.class new file mode 100644 index 0000000000000000000000000000000000000000..01273eff638aad0125e3ceaaf354ae8b06fbcf6c GIT binary patch literal 414 zcmbVIyH3ME5S&fy80AfX0y;W~1Sf=`0nr2^fh-z=sV~k79~e8b&j>y%6%qv>Ku^hM z&>}V#P*Ks$?d;vo-0bV;^9z6-tazvpb`!R0%301vO-!0R=0&dfA>^qQmaD5s+fl^B zBD_8M>3VPoOE>ynt5_%3>i2@s%{enV4n$DKFHesNbVg_mM9b>L20AX-egD{+?Z5Tg zgxaA=j6EV$H#P%;Ge{>~M-}ZR>Sz!;zDfAJxEpge(&Ly3JwFY_K#Ps=@1|oTlN0v* zf227e)GyK^3wdbf2CIKX-kzt$I^?6WJi;1W)a3MpRj?qHsGuR(l#VJn;P#);nw3vF Xg7X20Kv%F?)-D#&6DI2vtYG;Ie<NsA literal 0 HcmV?d00001