From 4f0debfdf27bf3ea94d29da55e3bc0faf7c32212 Mon Sep 17 00:00:00 2001
From: TuukkaAro <59646565+TuukkaAro@users.noreply.github.com>
Date: Sun, 16 Feb 2020 17:51:55 +0200
Subject: [PATCH] ver_f

---
 README.md                                     |  42 +-
 bin/.gitignore                                |  20 +
 bin/.gitlab-ci.yml                            |  13 +
 bin/README.md                                 |  41 ++
 bin/build.sbt                                 | 236 +++++++++
 bin/pom.xml                                   | 452 ++++++++++++++++++
 bin/project/build.properties                  |   1 +
 bin/project/plugins.sbt                       |   7 +
 .../java/fi/utu/tech/gui/javafx/Dialogs.class | Bin 0 -> 1402 bytes
 .../java/fi/utu/tech/gui/javafx/Main.class    | Bin 0 -> 1516 bytes
 .../java/fi/utu/tech/gui/javafx/MainApp.class | Bin 0 -> 1813 bytes
 .../utu/tech/gui/javafx/ResourceLoader.class  | Bin 0 -> 1831 bytes
 .../javafx/gimmick/GimmickController.class    | Bin 0 -> 1593 bytes
 .../tech/gui/javafx/gimmick/MainApp2.class    | Bin 0 -> 1598 bytes
 .../fi/utu/tech/gui/javafx/gimmick/View.class | Bin 0 -> 857 bytes
 .../utu/tech/gui/javafx/gimmick/View1.class   | Bin 0 -> 2865 bytes
 .../utu/tech/gui/javafx/gimmick/View2.class   | Bin 0 -> 3153 bytes
 .../utu/tech/gui/javafx/zipper/MainApp1.class | Bin 0 -> 1594 bytes
 .../utu/tech/gui/javafx/zipper/Zipper.class   | Bin 0 -> 4076 bytes
 .../gui/javafx/zipper/ZipperController.class  | Bin 0 -> 8420 bytes
 .../fi/utu/tech/gui/javafx/alien.png          | Bin
 .../fi/utu/tech/gui/javafx/gimmick.fxml       |   0
 .../resources/fi/utu/tech/gui/javafx/hmm.png  | Bin
 .../fi/utu/tech/gui/javafx/package.png        | Bin 0 -> 8960 bytes
 .../fi/utu/tech/gui/javafx/styles.css         |   7 +
 .../fi/utu/tech/gui/javafx/zipper.fxml        |  70 +++
 .../java/fi/utu/tech/gui/javafx/Main.java     |  16 +-
 .../gui/javafx/gimmick/GimmickController.java |  41 --
 .../utu/tech/gui/javafx/gimmick/MainApp2.java |  20 -
 .../fi/utu/tech/gui/javafx/gimmick/View.java  |  18 -
 .../fi/utu/tech/gui/javafx/gimmick/View1.java |  69 ---
 .../fi/utu/tech/gui/javafx/gimmick/View2.java |  56 ---
 .../utu/tech/gui/javafx/zipper/MainApp1.java  |   2 +-
 .../fi/utu/tech/gui/javafx/zipper.fxml        |   2 +-
 34 files changed, 852 insertions(+), 261 deletions(-)
 create mode 100644 bin/.gitignore
 create mode 100644 bin/.gitlab-ci.yml
 create mode 100644 bin/README.md
 create mode 100644 bin/build.sbt
 create mode 100644 bin/pom.xml
 create mode 100644 bin/project/build.properties
 create mode 100644 bin/project/plugins.sbt
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/Dialogs.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/Main.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/MainApp.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/ResourceLoader.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/zipper/Zipper.class
 create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/zipper/ZipperController.class
 rename {src => bin/src}/main/resources/fi/utu/tech/gui/javafx/alien.png (100%)
 rename {src => bin/src}/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml (100%)
 rename {src => bin/src}/main/resources/fi/utu/tech/gui/javafx/hmm.png (100%)
 create mode 100644 bin/src/main/resources/fi/utu/tech/gui/javafx/package.png
 create mode 100644 bin/src/main/resources/fi/utu/tech/gui/javafx/styles.css
 create mode 100644 bin/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml
 delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.java
 delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.java
 delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/View.java
 delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.java
 delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.java

diff --git a/README.md b/README.md
index 1fb7c19..8acde39 100644
--- a/README.md
+++ b/README.md
@@ -1,41 +1 @@
-palauttaja: Tuukka Aro
-
-# Project description
-
-Simple template for projects that make use of JavaFX and FXML (Scene Builder).
-Requires Java 11 or later. Compatible with
-Eclipse and IntelliJ IDEA. Minor issues with Netbeans. Automatically
-integrates with Gitlab CI.
-
-## Installation
-
-Maven:
-
-```bash
-$ git clone https://gitlab.utu.fi/tech/education/gui/template-javafx
-
-$ cd template-javafx
-
-$ mvn compile exec:java
-```
-
-SBT:
-
-```bash
-$ git clone https://gitlab.utu.fi/tech/education/gui/template-javafx
-
-$ cd template-javafx
-
-$ sbt compile run
-```
-
-## Further instructions
-
-  * Java platform: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/jvm-platform
-  * Maven: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/maven-misc
-  * SBT: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/sbt-misc
-  
-External sources:
-
-  * JavaFX: https://openjfx.io/javadoc/11/
-  * Scene Builder: https://docs.gluonhq.com/scenebuilder/
+# Revitty Jari-Matti Mäkelän projektista. Tuukan koodinäyte ZIP-pakkaaja.
\ No newline at end of file
diff --git a/bin/.gitignore b/bin/.gitignore
new file mode 100644
index 0000000..5bfb48e
--- /dev/null
+++ b/bin/.gitignore
@@ -0,0 +1,20 @@
+contracts/
+.classpath
+.project
+.history/
+.idea
+.jqwik-database
+.lib/
+.worksheet
+.settings/
+*.iml
+*.ipr
+*.iws
+*.log
+project/boot/
+project/plugins/project/
+project/project/
+project/*-shim.sbt
+project/target/
+target/
+openjfx/
diff --git a/bin/.gitlab-ci.yml b/bin/.gitlab-ci.yml
new file mode 100644
index 0000000..4b3553b
--- /dev/null
+++ b/bin/.gitlab-ci.yml
@@ -0,0 +1,13 @@
+image: maven:latest
+
+stages:
+  - build
+  - test
+
+build:
+  script:
+    - mvn compile
+
+test:
+  script:
+    - mvn test
\ No newline at end of file
diff --git a/bin/README.md b/bin/README.md
new file mode 100644
index 0000000..1fb7c19
--- /dev/null
+++ b/bin/README.md
@@ -0,0 +1,41 @@
+palauttaja: Tuukka Aro
+
+# Project description
+
+Simple template for projects that make use of JavaFX and FXML (Scene Builder).
+Requires Java 11 or later. Compatible with
+Eclipse and IntelliJ IDEA. Minor issues with Netbeans. Automatically
+integrates with Gitlab CI.
+
+## Installation
+
+Maven:
+
+```bash
+$ git clone https://gitlab.utu.fi/tech/education/gui/template-javafx
+
+$ cd template-javafx
+
+$ mvn compile exec:java
+```
+
+SBT:
+
+```bash
+$ git clone https://gitlab.utu.fi/tech/education/gui/template-javafx
+
+$ cd template-javafx
+
+$ sbt compile run
+```
+
+## Further instructions
+
+  * Java platform: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/jvm-platform
+  * Maven: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/maven-misc
+  * SBT: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/sbt-misc
+  
+External sources:
+
+  * JavaFX: https://openjfx.io/javadoc/11/
+  * Scene Builder: https://docs.gluonhq.com/scenebuilder/
diff --git a/bin/build.sbt b/bin/build.sbt
new file mode 100644
index 0000000..e703e90
--- /dev/null
+++ b/bin/build.sbt
@@ -0,0 +1,236 @@
+// Project template
+
+// Supported operating systems: Windows, Mac, Linux
+// Supported JDKs: 8, 10+
+
+// Project name
+name := "template-javafx"
+
+// organization name
+organization := "fi.utu.tech"
+
+version := "1.0"
+
+// project description
+description := "JavaFX project template"
+
+// main class
+Compile/mainClass := Some("fi.utu.tech.gui.javafx.Main")
+
+// force the java version by typing it here (remove the comment)
+val force_javaVersion = None // Some(13)
+
+// force the javafx version by typing it here (remove the comment)
+val force_javaFxVersion = None // Some(13)
+
+val useJavaFX = true
+
+val useScalaOrScalaFX = true
+
+// END_OF_SIMPLE_CONFIGURATION
+// you can copy the rest for each new project
+// --- --- ---
+
+def fail(msg: String) = {
+  println("Error :-/")
+  println
+  println(msg)
+  System.exit(1)
+  null
+}
+
+val detectedJDK = System.getProperty("java.version").replace("-ea","").split('.').dropWhile(_.toInt<8).head.toInt
+
+val javaVersionNum = force_javaVersion.getOrElse(detectedJDK)
+
+val javaVersionString = javaVersionNum match {
+  case 7 => "1.7"
+  case 8 => "1.8"
+  case x if x > 8 => x.toString
+}
+
+val lts = 11
+val dev = 13
+
+val supported = javaVersionNum match {
+  case x if x < 8              => fail("Your Java installation is obsolete. Please upgrade to Java " + lts + "LTS")
+  case 9                       => fail("Your Java installation is unsupported and has known issues. Please upgrade to Java " + lts + "LTS")
+  case x if x < lts            => println("Consider upgrading to Java " + lts + " LTS"); true
+  case x if x > lts && x < dev => println("Consider upgrading to Java " + dev); true
+  case x if x > dev            => println("Unsupported early access version. Consider switching back to Java " + dev); true
+  case _                       => true
+}
+
+javacOptions ++= Seq("-source", javaVersionString, "-target", javaVersionString, "-encoding", "utf8", "-Xlint:unchecked", "-Xlint:deprecation")
+javacOptions in doc := Seq("-source", javaVersionString) 
+
+enablePlugins(JShellPlugin)
+
+compileOrder := CompileOrder.JavaThenScala
+
+// Enables publishing to maven repo
+publishMavenStyle := true
+
+// Do not append Scala versions to the generated artifacts
+crossPaths := false
+
+// This forbids including Scala related libraries into the dependency
+autoScalaLibrary := false
+
+assemblyMergeStrategy in assembly := {
+  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
+  case _ => MergeStrategy.first
+}
+
+// contains libraries provided by utu/ft dep
+resolvers += "ftdev" at "https://ftdev.utu.fi/maven2"
+
+fork in Global := true
+
+val javaVersion = taskKey[Unit]("Prints the Java version.")
+
+javaVersion := { println("SBT uses Java SDK located at "+System.getProperty("java.home")) }
+
+publishTo := Some(Resolver.file("file", new File("/tmp/repository")))
+
+val oomkit = "fi.utu.tech" % "oomkit" % "1.15"
+
+libraryDependencies ++= Seq()
+
+////
+//// JQWIK / JUNIT configuration
+////
+
+resolvers in ThisBuild += Resolver.jcenterRepo
+
+val junit_version = "5.5.2"
+
+// library dependencies. (orginization name) % (project name) % (version)
+libraryDependencies ++= Seq(
+  "net.aichler"        % "jupiter-interface"              % JupiterKeys.jupiterVersion.value % Test,
+  "org.junit.platform" % "junit-platform-commons"         % ("1"+junit_version.tail) % Test,
+  "org.junit.platform" % "junit-platform-runner"          % ("1"+junit_version.tail) % Test,
+  "org.junit.jupiter"  % "junit-jupiter-engine"           % junit_version % Test,
+  "org.junit.jupiter"  % "junit-jupiter-api"              % junit_version % Test,
+  "org.junit.jupiter"  % "junit-jupiter-migrationsupport" % junit_version % Test,
+  "org.junit.jupiter"  % "junit-jupiter-params"           % junit_version % Test,
+  "net.jqwik"          % "jqwik"                          % "1.2.0" % Test,
+  "org.scalatest"      %% "scalatest"                     % "3.0.8" % Test,
+)
+
+testOptions += Tests.Argument(TestFrameworks.JUnit, "-q", "-c")
+
+////
+//// JAVAFX configuration
+////
+
+val javafx_versions = if (!useJavaFX) (0,"-","-") else (force_javaFxVersion getOrElse javaVersionNum) match {
+  case 7 => (7, "7", "8.0.181-R13")
+  case 8 => (8, "8", "8.0.181-R13")
+  case 10 => (11, "11.0.2", "11-R16")
+  case x if x>10 => (13, "13", "12.0.2-R18")
+  case _ => fail("Unsupported Java version for JavaFX")
+}
+
+// JAVA_HOME location
+val javaHomeDir = {
+  val path = try {
+    if (scala.sys.env("JAVA_HOME").trim.isEmpty) throw new Exception("Empty JAVA_HOME") else scala.sys.env("JAVA_HOME")
+  } catch {
+    case _: Throwable => System.getProperty("java.home") // not set -> ask from current JVM
+  }
+
+  val f = file(path)
+  if (!f.exists()) fail("The environment variable JAVA_HOME points to a non-existent directory!\nSolution: Edit your system settings (Windows control panel / *nix .bashrc) and fix the JAVA_HOME location.")
+  f
+}
+
+val osName: SettingKey[String] = SettingKey[String]("osName")
+
+osName := (System.getProperty("os.name") match {
+  case n if n.startsWith("Linux")   => "linux"
+  case n if n.startsWith("Mac")     => "mac"
+  case n if n.startsWith("Windows") => "win"
+  case _ => throw new Exception("Unknown platform!")
+})
+
+def legacyJavaFX() = {
+  val searchDirs = Seq(
+    "/jre/lib/jfxrt.jar",     // OpenJDK 7
+    "/jre/lib/ext/jfxrt.jar", // OpenJDK 8
+    "/lib/ext/jfxrt.jar"      // Windows & Oracle Java 8
+  )
+
+  if (detectedJDK > 8) fail(s"Trying to use legacy non-modular JavaFX with a modern JDK [$detectedJDK].\nSolution: Check the line 'val force_javaFxVersion =' in build.sbt.")
+
+  val javaFxJAR = searchDirs.map{ searchDir => file(javaHomeDir + searchDir) }.find{ _.exists() }
+
+  javaFxJAR.getOrElse {
+    fail(s"Java FX runtime not installed in [${javaHomeDir.toString}]!\nSolution: Install JavaFX or consider upgrading your JDK so that JavaFX can be installed automatically.")
+  }
+}
+
+val jfx_sdk_version = javafx_versions._2
+val jfx_scalafx_version = javafx_versions._3
+
+val javaFxPath = Def.taskKey[File]("OpenJFX fetcher")
+javaFxPath := {
+  val javaFxHome =
+    try {
+      val envHome = file(scala.sys.env("JAVAFX_HOME"))
+      if (envHome.toString.trim.isEmpty) throw new Exception("Empty JAVAFX_HOME")
+      println("Using OpenJFX from " + envHome)
+      envHome
+    }
+    catch { case _: Throwable =>
+        println("Using local OpenJFX")
+        baseDirectory.value / "openjfx"
+    }
+
+  if (!javaFxHome.exists()) java.nio.file.Files.createDirectory(javaFxHome.toPath)
+
+  val jfx_os = osName.value match {
+    case "linux" => "linux"
+    case "mac"   => "osx"
+    case "win"   => "windows"
+  }
+
+  val sdkURL = "http://download2.gluonhq.com/openjfx/" + jfx_sdk_version + "/openjfx-" + jfx_sdk_version + "_" + jfx_os + "-x64_bin-sdk.zip"
+
+  try {
+    val testDir = javaFxHome / "all.ok"
+    if (!testDir.exists()) {
+      println("Fetching OpenJFX from "+sdkURL+"..")
+      IO.unzipURL(new URL(sdkURL), javaFxHome)
+      java.nio.file.Files.createDirectory(testDir.toPath)
+      println("Fetching OpenJFX done.")
+    } else {
+      println("Using OpenJFX from "+javaFxHome)
+    }
+
+    javaFxHome
+  }
+  catch {
+    case t: Throwable => fail("Could not load OpenJFX! Reason:" + t.getMessage)
+  }
+}
+
+val jfxModules = Seq("base","controls","fxml","graphics","media","swing","web")
+
+
+if (!useJavaFX) Seq() else javafx_versions._1 match {
+  case 7 =>
+    // TODO libraryDependencies
+    Seq(unmanagedJars in Compile += Attributed.blank(legacyJavaFX()))
+  case 8 =>
+    (if (useScalaOrScalaFX) Seq(libraryDependencies += "org.scalafx" %% "scalafx" % jfx_scalafx_version) else Seq()) ++
+    Seq(unmanagedJars in Compile += Attributed.blank(legacyJavaFX()))
+  case _ =>
+    Seq(
+      javaOptions in run ++= Seq(
+        "--module-path", (javaFxPath.value / ("javafx-sdk-" + jfx_sdk_version) / "lib").toString,
+        "--add-modules=" + jfxModules.map("javafx."+_).mkString(","))
+    ) ++
+      (if (useScalaOrScalaFX) Seq(libraryDependencies += "org.scalafx" % "scalafx_2.13" % jfx_scalafx_version) else Seq()) ++
+      jfxModules.map(module => libraryDependencies += "org.openjfx" % ("javafx-"+module) % jfx_sdk_version classifier osName.value)
+}
diff --git a/bin/pom.xml b/bin/pom.xml
new file mode 100644
index 0000000..d5e6482
--- /dev/null
+++ b/bin/pom.xml
@@ -0,0 +1,452 @@
+<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>
+
+    <!--
+     
+      Welcome!
+      This pom.xml is *THE* file that defines your Maven style Java project.
+      
+      Eclipse, IDEA and other development environments with Maven support
+      or plugins can *import* this project by reading this file.
+      
+      It usually contains tons of barely readable configuration. Luckily
+      this basic pom.xml is somewhat readable. All necessary configuration
+      for customizing your project if located here on top before the
+      'END OF SIMPLE CONFIGURATION' line below.
+      
+      Some basics:
+      
+        - Maven is a build system for Java/JVM
+        - the Maven projects define an artifact that has a three part id:
+          groupId - artifactId - version
+          
+        - For example, this project is called:
+          fi.utu.tech - oomkit - 1.15
+          
+        - The group id is usually a web domain in reverse order.
+          
+        - You can use these id parts to search for projects at
+          https://search.maven.org/
+          
+        - If your version is not final and you have plans to modify the
+          source code at some point, please use a version id that ends with
+          -SNAPSHOT, e.g 1.0-SNAPSHOT. Maven may cache the project jar
+          and refuse to overwrite old cached versions with new ones unless
+          you remember this convention.
+          
+        - This file supports
+          compiling the project with      'mvn compile' (see target/)
+          cleaning the class files with   'mvn clean'
+          executing the main routine with 'mvn exec:java'
+          executing the unit tests with   'mvn test'
+          packaging the application with  'mvn package' (see target/)
+          
+        - the Maven project structure is as follows:
+          https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
+          
+    -->
+    
+    <!-- ==== START OF SIMPLE CONFIGURATION ==== -->
+    
+    <!-- the three parts of the artifact name -->
+    <groupId>fi.utu.tech</groupId>
+    <artifactId>template-javafx</artifactId>
+    <version>1.0</version>
+    
+    <!-- additional information about the project -->
+    <name>JavaFX project template</name>
+    <url>https://gitlab.utu.fi/tech/education/gui/template-javafx</url>
+    
+    <packaging>jar</packaging>
+
+    <!-- HINT: More configuration here! -->
+    <properties>
+        <!-- Configures this project to use 'fi.utu.tech.AppMain' as its main class -->
+        <project.mainclass>fi.utu.tech.gui.javafx.Main</project.mainclass>
+        
+        
+        <!-- Don't touch these unless you know what you're doing!
+        
+             For example, the source encoding should always be utf-8.
+             You're probably doing something stupid if you think it
+             should be a 8-bit code page in 2019. -->
+        <jdk.version>11</jdk.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <jqwik.version>1.2.0</jqwik.version>
+        <junit.version>5.5.2</junit.version>
+        <junitplatform.version>1.5.2</junitplatform.version>
+        <javafx.version>13.0.2</javafx.version>
+    </properties>
+
+    <!-- ==== END OF SIMPLE CONFIGURATION ==== -->
+    
+    <repositories>
+        <repository>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+            <id>central</id>
+            <name>Central Repository</name>
+            <url>https://repo.maven.apache.org/maven2</url>
+        </repository>
+        <repository>
+            <id>jcenter</id>
+            <name>jcenter</name>
+            <url>https://jcenter.bintray.com/</url>
+        </repository>
+        <!-- UTU repository -->
+        <repository>
+            <id>ftdev</id>
+            <name>ftdev</name>
+            <url>https://ftdev.utu.fi/maven2</url>
+        </repository>
+    </repositories>
+    
+    <dependencies>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-commons</artifactId>
+            <version>${junitplatform.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.jqwik</groupId>
+            <artifactId>jqwik</artifactId>
+            <version>${jqwik.version}</version>
+            <scope>test</scope>
+        </dependency><!--
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-migrationsupport</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-runner</artifactId>
+            <version>${junitplatform.version}</version>
+            <scope>test</scope>
+        </dependency> -->
+        
+        <!-- JavaFX (remove if not needed to speed up dep downloads)-->
+        <dependency>
+            <groupId>org.openjfx</groupId>
+            <artifactId>javafx-base</artifactId>
+            <version>${javafx.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjfx</groupId>
+            <artifactId>javafx-controls</artifactId>
+            <version>${javafx.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjfx</groupId>
+            <artifactId>javafx-fxml</artifactId>
+            <version>${javafx.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjfx</groupId>
+            <artifactId>javafx-graphics</artifactId>
+            <version>${javafx.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjfx</groupId>
+            <artifactId>javafx-media</artifactId>
+            <version>${javafx.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjfx</groupId>
+            <artifactId>javafx-swing</artifactId>
+            <version>${javafx.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjfx</groupId>
+            <artifactId>javafx-web</artifactId>
+            <version>${javafx.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- Make a 'fat' jar, that is, jar that contains all its dependencies and runs as is.
+                 See: https://stackoverflow.com/a/57691362 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.3</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <filters>
+                                <filter>
+                                    <artifact>*:*</artifact>
+                                    <excludes>
+                                        <exclude>module-info.class</exclude>
+                                        <exclude>META-INF/*.SF</exclude>
+                                        <exclude>META-INF/*.DSA</exclude>
+                                        <exclude>META-INF/*.RSA</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                            <transformers>
+                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                    <mainClass>${project.mainclass}</mainClass>
+                                </transformer>
+                            </transformers>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- Run this app with exec:java -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>1.6.0</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>java</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <mainClass>${project.mainclass}</mainClass>
+                    <arguments>
+                        <argument>arg1</argument>
+                        <argument>arg2</argument>
+                    </arguments>
+                </configuration>
+            </plugin>
+
+            <!-- Make the packaged jar executable -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>3.1.2</version>
+                <configuration>
+                    <!-- DO NOT include log4j.properties file in your Jar -->
+                    <excludes>
+                        <exclude>**/log4j.properties</exclude>
+                    </excludes>
+                    <archive>
+                        <manifest>
+                            <!-- Jar file entry point -->
+                            <mainClass>${project.mainclass}</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+
+            <!-- download source code in Eclipse, best practice -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-eclipse-plugin</artifactId>
+                <version>2.10</version>
+                <configuration>
+                    <downloadSources>true</downloadSources>
+                    <downloadJavadocs>false</downloadJavadocs>
+                </configuration>
+            </plugin>
+
+            <!-- JDK source/target versions -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>${jdk.version}</source>
+                    <target>${jdk.version}</target>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>3.1.0</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>3.1.1</version>
+                <executions>
+                    <execution>
+                    <id>attach-javadocs</id>
+                    <goals>
+                        <goal>jar</goal>
+                    </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <tags>
+                        <tag>
+                            <name>toDo</name>
+                            <placement>a</placement>
+                            <head>To&nbsp;do:</head>
+                        </tag>
+                        <tag>
+                            <name>classInvariant</name>
+                            <placement>t</placement>
+                            <head>Class&nbsp;invariant:</head>
+                        </tag>
+                        <tag>
+                            <name>classInvariantProtected</name>
+                            <placement>t</placement>
+                            <head>Protected&nbsp;class&nbsp;invariant:</head>
+                        </tag>
+                        <tag>
+                            <name>classInvariantPrivate</name>
+                            <placement>t</placement>
+                            <head>Private&nbsp;class&nbsp;invariant:</head>
+                        </tag>
+                        <tag>
+                            <name>abstractionFunction</name>
+                            <placement>t</placement>
+                            <head>Abstraction&nbsp;function:</head>
+                        </tag>
+                        <tag>
+                            <name>pre</name>
+                            <placement>cm</placement>
+                            <head>Precondition:</head>
+                        </tag>
+                        <tag>
+                            <name>post</name>
+                            <placement>cm</placement>
+                            <head>Postcondition:</head>
+                        </tag>
+                        <tag>
+                            <name>postProtected</name>
+                            <placement>cm</placement>
+                            <head>Protected&nbsp;postcondition:</head>
+                        </tag>
+                        <tag>
+                            <name>postPrivate</name>
+                            <placement>cm</placement>
+                            <head>Private&nbsp;postcondition:</head>
+                        </tag>
+                        <tag>
+                            <name>time</name>
+                            <placement>cmf</placement>
+                            <head>Time&nbsp;complexity:</head>
+                        </tag>
+                        <tag>
+                            <name>space</name>
+                            <placement>cmf</placement>
+                            <head>Space&nbsp;complexity:</head>
+                        </tag>
+                        <tag>
+                            <name>correspondence</name>
+                            <placement>a</placement>
+                            <head>Correspondence:</head>
+                        </tag>
+                        <tag>
+                            <name>download</name>
+                            <placement>a</placement>
+                            <head>Download:</head>
+                        </tag>
+                    </tags>
+                    <show>protected</show>
+                    <failOnError>false</failOnError>
+                    <sourceFileExcludes>
+                        <sourceFileExclude>**/module-info.java</sourceFileExclude>
+                    </sourceFileExcludes>
+                </configuration>
+            </plugin>
+
+            <!-- JUnit & JQwik test integration -->
+
+            <!-- junit-platform-maven-plugin: supports modular tests
+                 maven-surefire-plugin: non-modular tests
+
+                 Modular testing works via command line mvn, but is
+                 still broken in Eclipse due to this
+                 https://bugs.eclipse.org/bugs/show_bug.cgi?id=520667
+              -->
+            <plugin>
+                <groupId>de.sormuras.junit</groupId>
+                <artifactId>junit-platform-maven-plugin</artifactId>
+                <version>1.0.0-M5</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <executor>JAVA</executor>
+                </configuration>
+            </plugin>
+
+            <!--
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>3.0.0-M3</version>
+            </plugin>
+            <plugin>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <version>3.0.0-M3</version>
+            </plugin> -->
+
+            <!-- javafx:jlink:
+                 https://github.com/openjfx/javafx-maven-plugin
+                 Use 'mvn package' instead if you don't need jlink.
+
+            <plugin>
+                <groupId>org.openjfx</groupId>
+                <artifactId>javafx-maven-plugin</artifactId>
+                <version>0.0.3</version>
+                <configuration>
+                    <mainClass>${project.mainclass}</mainClass>
+                </configuration>
+            </plugin> -->
+
+        </plugins>
+        <extensions>
+            <!-- Enables the use of SSH for deployments -->
+            <extension>
+                <groupId>org.apache.maven.wagon</groupId>
+                <artifactId>wagon-ssh-external</artifactId>
+                <version>3.3.3</version>
+            </extension>
+            <extension>
+                <groupId>org.apache.maven.wagon</groupId>
+                <artifactId>wagon-ssh</artifactId>
+                <version>3.3.3</version>
+            </extension>
+        </extensions>
+    </build>
+    <distributionManagement>
+        <repository>
+            <id>ftdev</id>
+            <name>UTU tech ftdev repository</name>
+            <url>scp://localhost:2222/var/www/maven2</url>
+        </repository>
+    </distributionManagement>
+</project>
diff --git a/bin/project/build.properties b/bin/project/build.properties
new file mode 100644
index 0000000..6adcdc7
--- /dev/null
+++ b/bin/project/build.properties
@@ -0,0 +1 @@
+sbt.version=1.3.3
diff --git a/bin/project/plugins.sbt b/bin/project/plugins.sbt
new file mode 100644
index 0000000..37ca261
--- /dev/null
+++ b/bin/project/plugins.sbt
@@ -0,0 +1,7 @@
+resolvers += Resolver.jcenterRepo
+
+addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9")
+addSbtPlugin("net.aichler" % "sbt-jupiter-interface" % "0.8.3")
+addSbtPlugin("com.github.xuwei-k" % "sbt-jshell" % "0.1.2")
+//addSbtPlugin("org.xerial.sbt" % "sbt-sql-sqlite" % "0.8")
+addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.4.0")
diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/Dialogs.class b/bin/src/main/java/fi/utu/tech/gui/javafx/Dialogs.class
new file mode 100644
index 0000000000000000000000000000000000000000..1562f84c0b6d6736eeac85bee405050ceddfcf05
GIT binary patch
literal 1402
zcmX^0Z`VEs1_o0G8FmIHMh2bYqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zzDs6ePJVhZI|B<Ng8*1zPGVlVzJF3yYH|r91Dj1|US^3MBLlOBW*8#_i*tTTDmw!w
zBLhD|t!q(Heh~))HzQM7XkJljaehu&YKlT~er`c#PGU)Bex5=>QGQZRYHqQW0vBgU
zMyf(dWkIR}$N)W%WqJ_H6p|D3^72a*l2R35hUh7HmMCNvD`e)SWEQ0+m*i9`6s4x6
z7NzDTr=}>R73JqD6r~oHW)`KUDCi~UBo-Gdq-Ex$7DH@FNlng41W6SnCTAz6rz$9=
zW$Kldl<I-PKrg*CQxD{Xv<fAKl>F3U1(4mji6zMy3MCn-3aJ$ZsmUd&DGG4S#YM?_
zpx^}S(!*gC#OBQ0g8ZTqun*HJu=tCM(=)dqCo?&-M4`B}Ahk##IX|zsq^LBxB)>=j
z5*iwsAdi>krKF~1=7Bt$U!;(dnwD6aQ-Z8oPr<jexCA7VnU|`Nm<Mt<#9$;Nxj2JM
ziZb)kvA9H`BwryB93RwF<d~CMR6@Wu%GH!57G)+T<)m_PF>o;O@-VP6@G&xoYWRR+
zRUeeF^da812BlnnpUk{eztY^K)S?iOCPoG!pZw&+oG_>%P(hZGjLc$220b5AGLJPQ
z1ABR5QC?<VIwOO$h7Z(QbXqfvgF%duk&%c@0x^L=2vScG<#7SZ(OjJP&4I@kBLi1(
zerZv1s#|7GDkB3Av<w1gEOrJdMg}&B*BBXid^3xSGxO3zDhpDJ859{98JHPBfQf;T
zft7)cfsuiofq}t<fti7kfq{W*Hv>nc5Z87Fp8X6A3``9C3=Cj33=E760t^fcJP=h3
wf($|o3=EtM!VDr%6SNqZ!6rjY5XE8w8`uOUu({%3Qi4I6fq{XAfssKH0I%4sD*ylh

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/Main.class b/bin/src/main/java/fi/utu/tech/gui/javafx/Main.class
new file mode 100644
index 0000000000000000000000000000000000000000..831b20e24b1ade98fa60338102f17021707ebb4d
GIT binary patch
literal 1516
zcmX^0Z`VEs1_o0G8FmIHMh4B|qGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zzHee?9y<dIBZB}~RZe1Fy1su>R%&tyBLkaFW?p8A9U}v?hGrNe1B-KhN-8@8CnEzt
zLal32QGO8z12-enztFs*)Z+Y{veXoX<ow)%%$&rM%=|osf};GSoYdT6D+Mmjkc?D?
zlFEWq1&{%HAj|ZEONuh{(iM^u^YZdb6p~UEV20=^c$O$+7As`trDPVRCYR(?Dio!r
zr52^;C8wq+q!s1oDioy_mSz^ErYPto=Oh*vE2L%Sq!wef#ThJ5ZA(&8lXDV5_7@~3
zXD6noDk!C8>Xnw1>VZO8FTFHV59H6Z3MGY<{M2FvkOy-UOOi7bN-|OvQY#8llS@)l
z6yTbRi<0#~5eC+!hr=j{_cC(}@{39o(lW6G95E_9a|?1ZlQT;cic1SpixiUc^NLG~
zN|Q_SixeQSub~MF`_jCW)U?bzP<ZDTDWs&PC6?xtAgk6>@GUJa0m)?Mr79%mfqVrq
z7|BR3PMndfP?E2Z2u>1QoWYgFC8@bsJ>;2Jl9~>3Cq^pa;sm8&$ASVwtQzr1B3lhr
zW`xfSY?4T3a4~Q&@bWOQGVn1nh-&zNB3>Vq!1W=1w+7`PexJ;|RKL>Pq|~C2#H5^5
zMg}3D{N%)(u*9NF5FaYYQj(Eb%*deaLv#+dW@KOir5r{E9*t-pxQ!ePVvLMzMC40|
z4lKS$^577UA4UeQ;QZ2}<W#pzP{4ze4LGB*Ge|Kqut7qAk%7lIv$!}jFFmBPAhno5
zk%5tcnE?ct7#JB?8Q2&Y8Q2*Z7)%(L85kKD7`S#ba6}4mZD-)w&%nUI#K6zM09M1m
zz{nuLz`(!*QN<w0AjH7Hz{w!YAObZ(3&jLcEGF=SO<)3>D-I?l7^E2(7+4q>86*L|
Cq0}}2

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/MainApp.class b/bin/src/main/java/fi/utu/tech/gui/javafx/MainApp.class
new file mode 100644
index 0000000000000000000000000000000000000000..45a02d6c9bfd8442c8fe716d05e5559d56256463
GIT binary patch
literal 1813
zcmX^0Z`VEs1_o0GRdxm@Mh2bYqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zzHee?o?}4)I|B<Ng8*1zPGVlVzJF3yYH|r91Dj1|US^3MBLlOBW*8#_i*tTTDmw!w
zBLhD|t!q(Heh~))HzU)w(7dA5;{2Sl)D(r}{M>@foWzpM{5*w%qWq+s)ZAh#1uo8z
zj8uh`)a0DRqSO?Hg2d$P#Pn1JrL;`F(vng=kn8l)OEdLArl(aXDWv457AxfCmnh^W
zmLz8=lw_nTq*fH9CYK;<E-p&e19=pzOAm)p5Sue|3-XIf6d=YcBq!#9%uY&GfH`~c
zs&XtS$jMBGgeRuE6-x3I5*11+3sSi_{mW8|iZWADv3QSm%7RNk@rd7H!O5w4gj_|8
z8mIiCl+>btM1qC|r6!jo=B4Klu#}5|gMpWaft7)ekwH|$2b4JU!MPx~q$o2l-5Qkg
z`F%3;QvFJElTwR95|eUL85x9p@{<#D!V-%zL42qnOG!p%F(ZSX4=I_?nvsD8l+73!
zq=QQHN-}d(J@d*ki!+mQQXN4F6ddWrj0{{pu&A}>U=U|y@W7wlK)DU30e@OxWMC;S
z$uD4JU@b05EGl7S;L`8`N2s-C7zcw4BO@Dro4^^HIIB3p=Hhn_CozeD7&X*RD2xnT
z!TF^{$*FFcpcKFZEj+>H4kLr8XI^rCUU6n|Norn+M`mhKVo`ENB|C#6BLg>5?qz3C
zW@KOm2LmGmk8fsiab{k6NM%84F@qulBLg!72(U0PGO#kRF)%W)GcYiiFfcPPGB7Z3
z?PlPJ6yn;>z_Xu$fq{vEpMe3ahJk^RL4bjQfd`_BL6AX+0VF2Oz{bGDAOck-%D{ld
zG%+luNnkZif=tt7u$m^xAceziOmLq{V{w}T7Sos+WWnJf#~=?1JO&l8kC_-07?c2B
CBmUh0

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/ResourceLoader.class b/bin/src/main/java/fi/utu/tech/gui/javafx/ResourceLoader.class
new file mode 100644
index 0000000000000000000000000000000000000000..4bc43658c164eb9c8be11b69451575124bd21120
GIT binary patch
literal 1831
zcmX^0Z`VEs1_o0GHFgFjMh4^JqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zeo$(0erZv1s!x7mN@@{10}CUA09buaVqUtwe^ORzatR{?OHqD)2_plCPe5W(YF>#o
zBLin}W_n&?Noi3kBLj1YpEV-`S8{${Nl|`IPHGV&gOCrpA=V&u&en_!Y&MyBnI(3N
z45AuHih@guGV{`{HNzMgSe)}yQrQ^<7#a8xhPW0L<ri@<2r)9-hUOKe7U$=brKTt(
z=jRq=<|LM6=I1FC6y+!7q~;b|DR6OyWTYyjq$cMi7Nw>r6eK2RC#I(=D5YiUm6nw1
zfr3CUy);t~WO`bKl0r&;YOz9Ieu+YEVo7p_LP<udLTW`pYH|s(=HjAcJy2+Zb?M<S
z3Sx6+Zb5!gi2}rUh2+FMkl9J83NU9As|pg>SPW1o$yZ2JD5)$+<>K_rEy&4C&MZ+V
zE-gqcQb^9vD=sN2O)kkVQh>yshNePhu|jEHN@`kWUTTV-f^TVY3CM$BZ8?<+nR#XT
z*{KSNdHE$7s3vf6LZXF$6P$Ari;D@U0mVpeYDq?Zib8s730Mc3!xYl;i@;$I@|Qvo
zO1iZ1({Z-r;&hAf^?@W*0=5yYFu1a~BsCX{X<VGH70Iau;FN_KgUAtp#|WZAkG_hy
z82A}Pco=vXco`Y^eKPY>{YrC_Qj0<olX6l)*)~5pF()jsC=<ko3bK@BWEL|rnEH@W
zpjb09i20zHSy_+@HP@CL18qY5tV5iw?W`FYSTl1I(^DB4)UcH!m_-W*gB&A64iSY1
z)gpwEfvdQrGAFe-BQ>>zk%221T++H_f<jstHGzXm6-EXl8$T;p8S89?<OfJrwzk6*
zVrNi6DY7B1XJp{<%`7g?%u5fcEJ!V8P-I|aU}j)oU}6wtU}a!qU}Rti^Eem;88{iZ
z;CyZdW(G!3>R@1G;A3E5aARO*U}9ik;M&c=A1Nfbok4g%0|NsygD3+7*c1i^Mg}nk
z1_mAmMvy87aRvzn1_ntK5h(@+22KWP1{tWCT3|b1X39d%WI{4i32Y|FUQPyi67;FV
Z^)WLjfc>Wk^`{bpDgy%p3j-sAG5}W@9Etz{

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.class
new file mode 100644
index 0000000000000000000000000000000000000000..1b6faaa7b30110a945cff64d6871593b9d1bb153
GIT binary patch
literal 1593
zcmX^0Z`VEs1_o0Gd3FXSMh3g$qGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zetKqZZf0_}zB`0=&d)0;%FoG3En;V2VPp^hYt2c_OV{^L%1TWxVPxPa$;?R&NX$!R
zWZ?1%fwHX`8Ki?s^GY&vQ$6#_GK({la#9`h^72a(OEUBGiWwQ$eB2^@eXJQ7*laTM
zGE3|j8JIOR!x$M@obyvs*%^2l8Tb)axfT`W7jZD~Gcrqu<`tzD=jW8ArYI!m=N4q<
zfDKeAD9TUDNzE;`QsCkY$w*a5Nlng4EJ{sLC`e4sPE1c#P)f_xD=jJ219?|3y);t~
zWO`bK9@M)^3Mu)i#R_@(B?`HTCCM2IB^jv-sTBpO$tB2!6c;7yfkF_hTaSQ|5SL`;
z7UUO|D1fZfD=o>)QAkb%g@Zy;sshX>C<@au38?@Xl~yqfRe9zX<YXpimM9dL7Niy_
zB<JT9mlTyIm*f{IKoXmVrb1@1LTO$~YFcJqYKlTyevv{-YFc7xP6@JVJq6#=;u4Td
zW?rg7Vjd_WAqFEE$;AmufLKCNp(I}+QK6)=AeD;~mYk`iETbqjF$IfRT%4{I$*BdP
ztbs)q*+Bt0i6v?IMY&j%ad9#5FbMK6a54xnGKgyUfRc$mIHv}e6lLb6TZ6I}zfWdf
zs$XetQfg61Vp2{jBZH7nesW??SYlBohz}KHDaptzW@K>ip{&TTW@O+3<?hVHoXo0J
z4hBg^hLyx*U}zzN#goWk5klMGWMtq9&Mz%WPIb!!g_9UYfe0=H*coIQ88~3+gpq;A
zH?z1nGcP@)vLLmXL6L!xfti7UfsuiUft7)cfsuiofdNc&FfcGMF)%W4GH@|4GH^36
zFqkkfGcYnRFmUZ=;E5FC+s+`cAFM_gssm(-2m=EH4@4D%D1#W-WN{oONMJERhyl|C
UCI%_6J<<$v3=9k`42%pi0D5le!~g&Q

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.class
new file mode 100644
index 0000000000000000000000000000000000000000..1eb992795b9b9ea385074f67dec92f997a2352d1
GIT binary patch
literal 1598
zcmX^0Z`VEs1_o0GMRo=zMh4U3qGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zetKqZZf0_}zHee?o?}6Q5jz75BZB}~M^0j1y1su>R%&tyBLkaFW?p8A9U}v?hGrNe
z1B-KhN-8@8CnEztLal32QGO8z12-entkAro)Z+Y{veXoX<ow)%%$&rM%=|osf};GS
zoYdT6D+Mmjkc?D?l+@&$#G=#`g@VN7?8Nj`1*No1z0#6WJ&-f?(n~Y-K&Gcv=s}&S
zq>z%ITC9+lU!stkSdyHfP?C|VkXliYnp}cxNO4iJ9?0il-FgI!gt#O#w;;c$L?JCx
zAvrM*WPVbr0?Z2}s(?6|kU12qg2osYdlX9Y6%rLnDhpD%IQ`2~i;6N+QVA#vE&+u;
zrq_{;3Q8@`FD*(=^~q06Ni8B^U_fF~YF-HeMI@ORoSd3R&>Mu+a4~Q&@bWOQGVn1n
zh-&zNqCp>=(t}HiGV{`{L8+VHCo?bAuQWF)wJ0PpDJPYYLC7aRIWZ?Ju_zP7hYGTk
zWMmdIGMM|2mD8*l8CZ);5{pV08Mrijz!3npTso*UuOu@!)ibXwvp6#;C)E*@9>Mvi
zn2~|Y2Nt8&91IeSj3z|nG?)$ou>p1h0W~DW*q}`Vj0{}C;H2!935r}^XjU=;mluo-
zqMmul`FX{e#U-hEB_5fnMTtep8I|k|vWyJuP^Ih)@{A0u;1FYE;PK5YF3!wL52-9j
zEoM+;U}Rus00AZjMg~>}HU>rpb_NCp69#4mMg|53uH6hAkwRSC8F=<HFfcGN@G~%g
z)i5wHG6*m*Fz`TBF$gjUF@VH`8AKSE7(}6}#26UhrZK@y6USm27Z%f)86?4WN-;=-
P9LS&mHkFA%hCvPhtp((#

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.class
new file mode 100644
index 0000000000000000000000000000000000000000..0fad06d169934e1a46b9adcd09346509f3a646c8
GIT binary patch
literal 857
zcmX^0Z`VEs1_o0GS#|~{Mh3&;qGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zetKqZZf0_}epqH|IXeRjBZB}~bxvYly1su>R%&tyBLiDva!F=cDkB496e9zhO=ezZ
zi5(*YtA>k<W*8#_i*tTTDmw!=BLhD|t7}nFeh~))FC$|?XkJljaehu&YKlT~er`c#
zPGU)Bex5=>QGQZRYHqQW0vBgUMyf(eYI06uQEG}pL1J=tVtT5AQd*{7X-TOb$i;f;
zrI~sl)6**Spe|NYNXbtvR>;dQQOHd!NzPCx$w*a5ttd!ME<rY=xF}f<6bNA5dIXGw
zxFj>TAit<Y0b-p(a$+9Hj-*rtm^ZjMofGrQ5{t1&DU{?ZBr23t7Nl}<29@UJB_`#h
z5>N*6dv0n;Mt+JyacYTwo^O6>ajJ7pW^#6FiiU<wUOw13JB3tD1zkIZ>RL^O%wmPo
zyp+_m%)HbTg|z%4u+KquDu5!9i;IDafuDzgok4(+K~%#B<PCjrbOx6cW#*+@gW`<e
zCo?bAuQWF)wI~GSMn(o9pZw&+oUp{AOb{O`$WoG#S<J{_>_c)=vSwu93eGPrN=|jl
z%t>Wr-~>4h90!aHqMmul`FX{e#U-hEB_5fnMTtep8I|k|l8g*&kdS3(kY;4yfCV5U
z1CMWJadBo|dPrqKYB7rf10w@70|Nsi0}BHy0~?sd$iU9P!NADC$-uy1!obYH%D}+D
zwVQz}Qix|e1K)lI1_mYuK?Vi}HU>tpdLae|1|Be*i$Rz{gn@y9nL!k+N{m6A0R&{g
Ks+kxh7^DEMrS&-g

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.class
new file mode 100644
index 0000000000000000000000000000000000000000..ebf979a26c208689c29533625d6c7fa0e31fe23a
GIT binary patch
literal 2865
zcmX^0Z`VEs1_o0GZFUAGMh2teqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zetKqZZf0_}epqH|xgk3P3nPOe$@&->Sj#h0N-`K37(E#o*fLTx(=$pK8Q79a)6!Cl
z7#a9|!izFX5|eULJ#!P&Q>_^pSW*&85*ZnoqCFWISjrPKL8@&s^D;~97#Y|!JUu-%
z!x$M@obyvs*%<^G8Ti3I$Vtpg*LN){$}i$z5N2d~6q;9*TAZI#mYSlFoS$2enUh$O
znV+XnP?VpPlbTy>rNG4*l98&AlA4^8Sd^NgP>`6MotU1gpp=%WS6Wi42MP+k^wLZ{
zkm+d^deERyQb@^9Emp|OFHy)%EJ@B#D9K1wNUbPHO)fz;q_`+q4-~p!-FgI!gt#O#
zw;;c$L;+%*LULjr$d05`1(-Kzs!Ff4Br}H?OR1zVBQv!qu_!sCQXxML9E2s61*r<)
zWTuc=tdN<PoS#>mSzMBuSHi`Kl0L9FQlTVYAyENj0`1fW<Rq4)<rn2*v7U<)ob0g3
zAUiB5F)t+_n|6{FkrEsMnH8xyZuv#Ii6vOv2T4-7sU;ctDGKSSCGJIu1sR#i#m@P8
zC8-r9MlKqfpx7wQOG!=3%u7vCNXsumi!G`cL5hz;GKx|YQ?PgjIUFfd#Kq~ESCU#(
zR9aAyn&MiKoLT@bIxw>&ij|qUsYQgG1yU1|Se#8joqt(sQBh_}Dt={L3<3<IJPf=H
zVvG!;8a|+cLmylU2A33N=A~PMN=bg7%)C^;(%hufq7YCK%g7+)lb@WJ6P8$%3F1Qq
zSxPc8iy0YAd`K?c4Xqg&n2SpD7#Wx~G{ZO;<QN$g@fW>T3S5i~Y(=SgDXB#q42q15
ztMRJ`7uBQLZ*XKkMh5Pj#L~Rvj1W*#=3r1^WYi@h`Y6kfDA^2G_8%gdmXU!gIKQ+g
zIn^yQCzX+b3tZ)aTM3K|qMk_Ao(HUkWM|N1WZ*?9A{iNYd^3xSGxO3zDhpDJ859^8
z8JHOu7+4uZ7+4wD7#J8t7}&wI5CaDTCj$e65CazjHv<UpfW=uD7#MgN_!t-&_!$@&
zOc<CMKq6eb83ZDQgtjw?>}OzLU}6wwU|?WlU}RumU}TVBU|`?@v$+@~8Kl5s(hM?4
zCV<pIOpwK5f;1Kr7#QSnn4o~g1Qo0%DB&<c8H)*KSWIAMPzC!{jX@n0JPcY43=Av`
Hj0_q82-|Vm

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.class
new file mode 100644
index 0000000000000000000000000000000000000000..8a1363ccc12de13b0b77d8a27103650eec902288
GIT binary patch
literal 3153
zcmX^0Z`VEs1_o0GC3XfTMh2teqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zetKqZZf0_}epqH|xe+@93nPOe$@&->Sj#h0N-`K37(E#o*fLTx(=$pK8Cc2_GfNm5
z*mDw#vrCII85!7YGV?M^>=+r?G(0^$HNzMgSe)}yQrQ{!7#aA%j?78SOV@WTD#|b7
zU=UzrjR?&vN-fUMDN9XJNY2kK$jnJB$;{7FC@9KL%1O;Fwo>5Y49Q4UNJ&l3Ni0fD
zQ7A}E&Q45ERZvRH)GIA1)dTrfFTFHV4`g~;g&x$mN(w3Ysl^I;`6UXui6zMy3MCn-
z3aJ$ZsmUeCh7=bi>wy9gtXq$Okr0<;<`(1^l_)^0Q%FwC1KE+3ssQr_nX2?kOEPnC
z8kdooT9jCnoKdNep9c0yNo7H*0yst$GK&>5^OE!PiZhE#Qu9hc_7|llreHP8Gp{7I
zsHn7{BsImgB004H9M+hAP$<b)NK^pX!NnPnlUS0LUzCg0ypRl>Rs|*IrQ~DNg={!g
z905*ESe%D!5hxAirj}&nrzoVSmbe!s7Gz{57dz+Ym84db7`bR@f`YL$FC{fCGcPqo
zAuYcMEto;UnyNsd5zhHJ`9-5Hg(Y1s&d~tLNCoFJNM7dRBr4Ysqlk-vmqCb!fr~+y
zkwH|$2UJ|?gUjCFlA_GKbZb!A%<q$#m+DuVo0M7<l9-f}%E%z(lb@WJ6P8$%3F1Qq
zSxPc8iy0YAd`PY~jI0?Mn2SpD7#Wx~G{ZO;q!}5$5>?>iELDbR0mjI{R+O5Tl3K*U
zAjilYN<<joEp|ssJhW^>h2ot~MG>8>89D(%OkqY;vB=246`WsMl$`382`b9Cz^x;2
z!;X<b)Dx+N<N<3;F(@!FGB7hRFt9L)Ft9SPF)%QQFtCGZ1_ll&%?YMKs<;@q85kLO
z7#J8#7?>GY7#JA1b~Ers3h{4e5Zuqez`(>H!oa}5#=ywHz`)2L%D}+D17>qEh%tzR
u#UvOckxT%ogP0(N#RM@dCNMC_;4ncJiwWvjOkiS=2fI{(L6L!hfdK%Dh4Ekj

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.class b/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.class
new file mode 100644
index 0000000000000000000000000000000000000000..7558d140e19f2b3d3a43b4ae01774ddcec654b22
GIT binary patch
literal 1594
zcmX^0Z`VEs1_o0GMRo=zMh27OqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zepO~cL28k{Z(?SiV?lu-I|B<Ng8*1VPGVlVzJF3yYH|r91Dj1|US^3MBLlOBW*8#_
zi*tTTDmw!wBLhD|t!q(Heh~))HzU)G(7dA5;{2Sl)D(r}{M>@foWzpM{5*w%qWq+s
z)ZAh#1uo8zj8uh`)a0DRqSO?Hg2d$P#Pn1JrL;`F(vng=kSq1lOEdLArl(ctL0qY%
zkdmKTtdN&qqL7<dlANJXl98&AT2YXiT!L&yaZ$1!$lqYidiYI*xFa*SAit<YAuUrO
zIWZ4pd{U|c%mXB<fH;_tITWjc#upZQ6iV_H5*11+3sSi_{mW8|iZWAD2`CFL0fjxL
z*O841N-fSWElN)H$xlp4Eh1oGKw?p9UI_t3B$*hToSH|_8-&$xF>o;O@-VP6@G&xo
zYWRSnK_8sXgG-7s^U|$BX`A0CGcVPzG&d==C?qi{CzX*w$R|HJF()jsC=<ko3bK@B
zWEL|rnE8;C&8!(2Sc^*%i%J+7xHNpg;SaW3I;b?SBr`YFGp{VOI5R0H)e)2&!I`I+
zk%7wx7NOQ03=)itCPZX2m<|Gw0d@ibH6%sYpiKgd3|ztBl<bxXid$Z2PBH|S7K{v{
zo_WdndBvH<C8>EO9+{~{iABj7mFx_%j125hrR)syj0~*c5MyNE@y#qQ&df^>sVqn>
zW>92cWMF0h0VW1U237_(21W*U1_lNb24)6E1_lPM-3%O&LR{M!c=j_eFfcLjGcbVF
zFfcGO2rw`(@IX{C2r>vUfW(9uL>QPDM4_t07#QHDF~Lm}$6^{67Sos+B*At{F-U_P
O$e;i=m5D)yK@I><{^NuI

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/Zipper.class b/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/Zipper.class
new file mode 100644
index 0000000000000000000000000000000000000000..2189885295bb2fca045e3f9d11486833561dc7e2
GIT binary patch
literal 4076
zcmX^0Z`VEs1_o0GQ+5U>Mh2teqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+
zepO~cL28kH6qsUXU}0ns04vW)%uCnzPs&P7E@5QgF3vA4N=|jlOwCDQWZ?D*Nv$XW
zbF3K|I8#!KAsj{qHk-`6%o00B21yMhHAqa&Fh&Lz=lqmZb_O0s27ZK1u0=)pMH~!#
zjO^8+c}1zk`8j2&DGJH?xdoXyi6xo&c?tzZ`AIpcxy4orT$~{psR|{P1*r-k1N1;n
z)eFfe$}dk$%1Kp7PRz^8FHuNJRe+hJr{GzlkXfvdnU|7Tl$u<UQ>jptnwDCWnwOlK
zqL5aUpQ})mT3DJ{l$xTTmz<MWT&$3mnUh)!u_z@qIVTY$RgjpRotU1gpp=%WS6Wi4
z2MS8P^wLZ{kSo$E^dLd0q>z%ITC4zaLT+M7a)v@lMyf(;ML}wENotA$+>GL)WIa&i
zfHmvkHxc5F%-n+fq7sOgGxM={bC4)2Ey>Iw%5}slOsgQqI0{u2r6#6eu|}aJUm+2k
z*0?y~seXj03oa?j%u6TWS)vqq`ny&nrxt+oF=qBe4r8~>oK*kPl7iBb;F6-$#9RWl
zlc+o@vw#G{NmC7S3K6cQTnSMjPMX_^kDsW_0@u8fqDlhZAW|9i!pt*|lq5sEY9c*C
zq%!}q)S{xy6l`@Aawed5K|^%(axri-2=Fj)FbFa-h-&zN>NR~(?Wzw+bJn2ho8Koh
zFV(L!Hz~C!1XSNLG6?zPCnx5FB^G6Z_)tNXl8nq^Mg|if(pw?cj10_GnFWjt>R6nB
z-BDcd@}-!aL5h)q8_CNY3^I(2(}-wQKs-qxWfP?c$#w$9fpP!|MG}e1Nh<|NQw?$o
z5uU@Zgpq;0DzgA&6eEL<h7X8gjTyr}XfCtX4C7!>U}Rz-B2qy{;&%flQBjKK1Oi49
zp8$v~Ifzt7gl~ydLVOVkGLU%HM0$icWsD5WMWuO+49ps!l1VzKG_NExH`Oz*EVDQ>
zDJRtt)DZyp9*P+mxO`xxuQdmQ8Y9DDA`%Zw2Z7igu=1Lbfh!o=Gs{V3WZ;JM;=o-B
zMg~#OyyX16;>_Zb)Vvap%+#X9qU4N9b_Q)m1{P49u`}p0G9VhY><s#h3~V78poTCz
zgCQdWKU$J!XD~+T973`UBLk0bW^r+5UV2DnL25CBA_F4>GXnzy69W?iD+3#t#SW%f
z7#JBi7&sXi8Mqi27)%(L!RoknGjK-=@os0}-w#$R#K6G7#=ywHz`)2L%)r3F17>qE
zh%ktP#l#rI8JHL(7#J8p=1F2POB#z=vRKSwV31{y!)g`_0|NuZUGiAWQpaKzBZDG?
z5(5*1GSu}dAQPaz1o;JGnkp94oUxe3%%Bbq3k?QM1`se|U|`^5U}Ml?kYvzd&|@%Q
GFaiMMz!i`H

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/ZipperController.class b/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/ZipperController.class
new file mode 100644
index 0000000000000000000000000000000000000000..63ad565cecd936258732f24b0a3e45a802190fb8
GIT binary patch
literal 8420
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

literal 0
HcmV?d00001

diff --git a/src/main/resources/fi/utu/tech/gui/javafx/alien.png b/bin/src/main/resources/fi/utu/tech/gui/javafx/alien.png
similarity index 100%
rename from src/main/resources/fi/utu/tech/gui/javafx/alien.png
rename to bin/src/main/resources/fi/utu/tech/gui/javafx/alien.png
diff --git a/src/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml b/bin/src/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml
similarity index 100%
rename from src/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml
rename to bin/src/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml
diff --git a/src/main/resources/fi/utu/tech/gui/javafx/hmm.png b/bin/src/main/resources/fi/utu/tech/gui/javafx/hmm.png
similarity index 100%
rename from src/main/resources/fi/utu/tech/gui/javafx/hmm.png
rename to bin/src/main/resources/fi/utu/tech/gui/javafx/hmm.png
diff --git a/bin/src/main/resources/fi/utu/tech/gui/javafx/package.png b/bin/src/main/resources/fi/utu/tech/gui/javafx/package.png
new file mode 100644
index 0000000000000000000000000000000000000000..643eff6d60113e5e16ab4426c1f3a47ac4878c01
GIT binary patch
literal 8960
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
WQ&z6tsL8;<z~JfX=d#Wzp$PyhVUijE

literal 0
HcmV?d00001

diff --git a/bin/src/main/resources/fi/utu/tech/gui/javafx/styles.css b/bin/src/main/resources/fi/utu/tech/gui/javafx/styles.css
new file mode 100644
index 0000000..d1e250b
--- /dev/null
+++ b/bin/src/main/resources/fi/utu/tech/gui/javafx/styles.css
@@ -0,0 +1,7 @@
+.scroll-pane {
+   -fx-background-color:transparent;
+}
+
+.scroll-pane > .viewport {
+   -fx-background-color: transparent;
+}
diff --git a/bin/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml b/bin/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml
new file mode 100644
index 0000000..9a011d1
--- /dev/null
+++ b/bin/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.control.TextField?>
+<?import javafx.scene.image.Image?>
+<?import javafx.scene.image.ImageView?>
+<?import javafx.scene.layout.BorderPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.VBox?>
+<?import javafx.scene.text.Font?>
+
+<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fi.utu.tech.gui.javafx.zipper.ZipperController">
+   <left>
+      <ImageView fitHeight="368.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER">
+         <image>
+            <Image url="@package.png" />
+         </image>
+         <BorderPane.margin>
+            <Insets bottom="16.0" left="16.0" right="16.0" top="16.0" />
+         </BorderPane.margin>
+      </ImageView>
+   </left>
+   <center>
+      <BorderPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
+         <padding>
+            <Insets bottom="16.0" left="16.0" right="16.0" top="16.0" />
+         </padding>
+         <center>
+            <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" spacing="16.0" BorderPane.alignment="CENTER">
+               <padding>
+                  <Insets bottom="16.0" left="16.0" right="16.0" top="16.0" />
+               </padding>
+               <children>
+                  <HBox alignment="CENTER_LEFT" prefHeight="30.0" prefWidth="200.0">
+                     <children>
+                        <Label prefHeight="30.0" text="Source: " />
+                        <TextField fx:id="sourceField" prefHeight="30.0" HBox.hgrow="ALWAYS">
+                           <HBox.margin>
+                              <Insets left="8.0" right="8.0" />
+                           </HBox.margin>
+                        </TextField>
+                        <Button maxHeight="30.0" maxWidth="30.0" mnemonicParsing="false" onAction="#chooseSource" prefHeight="30.0" prefWidth="30.0" text="..." />
+                     </children>
+                  </HBox>
+                  <HBox alignment="CENTER_LEFT" prefHeight="30.0" prefWidth="200.0">
+                     <children>
+                        <Label prefHeight="30.0" text="Destination:" />
+                        <TextField fx:id="destField" prefHeight="30.0" HBox.hgrow="ALWAYS">
+                           <HBox.margin>
+                              <Insets left="8.0" right="8.0" />
+                           </HBox.margin>
+                        </TextField>
+                        <Button maxHeight="30.0" maxWidth="30.0" mnemonicParsing="false" onAction="#chooseDest" prefHeight="30.0" prefWidth="30.0" text="..." />
+                     </children>
+                  </HBox>
+                  <Button fx:id="zipItButton" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#zipIt" text="Zip it!" />
+                  <Label fx:id="statusLabel" text="Loading..." />
+               </children></VBox>
+         </center>
+         <top>
+            <Label text="Zip Master 2020" BorderPane.alignment="CENTER">
+               <font>
+                  <Font size="26.0" />
+               </font></Label>
+         </top>
+      </BorderPane>
+   </center>
+</BorderPane>
diff --git a/src/main/java/fi/utu/tech/gui/javafx/Main.java b/src/main/java/fi/utu/tech/gui/javafx/Main.java
index aebe6ec..a1398bb 100644
--- a/src/main/java/fi/utu/tech/gui/javafx/Main.java
+++ b/src/main/java/fi/utu/tech/gui/javafx/Main.java
@@ -1,6 +1,5 @@
 package fi.utu.tech.gui.javafx;
 
-import fi.utu.tech.gui.javafx.gimmick.MainApp2;
 import fi.utu.tech.gui.javafx.zipper.MainApp1;
 
 public class Main {
@@ -15,17 +14,6 @@ public class Main {
     public static void main(String[] args) {
         System.out.println("Launching..");
         if (args.length == 1 && args[0].equals("--test")) return;
-
-        int exercise = 1;
-        if (args.length == 1) exercise = Integer.parseInt(args[0]);
-        switch (exercise) {
-            case 1:
-                MainApp1.launch(MainApp1.class, args);
-                break;
-            default:
-                MainApp2.launch(MainApp2.class, args);
-                break;
-        }
+        MainApp1.launch(MainApp1.class, args);
     }
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.java
deleted file mode 100644
index a84cc8c..0000000
--- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package fi.utu.tech.gui.javafx.gimmick;
-
-import java.util.ArrayList;
-
-import fi.utu.tech.gui.javafx.zipper.Zipper;
-import javafx.animation.FadeTransition;
-import javafx.application.Platform;
-import javafx.concurrent.Task;
-import javafx.fxml.FXML;
-import javafx.scene.layout.TilePane;
-import javafx.util.Duration;
-
-public class GimmickController {
-    @FXML
-    private TilePane tilePane;
-
-    public void initialize() {
-        tilePane.getChildren().clear();
-        for (int i = 0; i < 20; i++) {
-            final int j = i;
-            
-            try { Thread.sleep(100); }
-            catch(Exception e) {
-            }
-            /*new Thread(() -> {
-                View c = j % 2 == 0 ? new View1(150, 150) : new View2(150, 150);
-                Platform.runLater(() -> tilePane.getChildren().add(c));
-                new Thread(c).run();
-            }).start();*/
-
-			
-			
-			Platform.runLater(() -> {
-				View c = j % 2 == 0 ? new View1(150, 150, j) : new View2(150, 150, j);
-				tilePane.getChildren().add(c);
-				new Thread(c).start();
-			});
-			
-        }
-    }
-}
diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.java
deleted file mode 100644
index 353ad8d..0000000
--- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package fi.utu.tech.gui.javafx.gimmick;
-
-import fi.utu.tech.gui.javafx.MainApp;
-import fi.utu.tech.gui.javafx.ResourceLoader;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.stage.Stage;
-
-public class MainApp2 extends MainApp {
-    @Override
-    public void start(Stage stage) {
-        ResourceLoader<Parent, GimmickController> loader = new ResourceLoader<>("gimmick.fxml");
-
-        Scene scene = new Scene(loader.root);
-
-        stage.setTitle("The Gimmick Show");
-        stage.setScene(scene);
-        stage.show();
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.java
deleted file mode 100644
index 3dce0c7..0000000
--- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package fi.utu.tech.gui.javafx.gimmick;
-
-import javafx.scene.canvas.Canvas;
-
-abstract class View extends Canvas implements Runnable {
-    protected boolean active = true;
-
-    public View(double width, double height) {
-        super(width, height);
-
-        setOnMouseClicked(e -> {
-            active = false;
-            setVisible(false);
-            setManaged(false);
-            Thread.currentThread().interrupt();
-        });
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.java
deleted file mode 100644
index 0e256bb..0000000
--- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package fi.utu.tech.gui.javafx.gimmick;
-
-import javafx.application.Platform;
-import javafx.scene.image.PixelFormat;
-import javafx.scene.image.WritableImage;
-
-import java.util.Random;
-import java.util.Timer;
-import java.util.TimerTask;
-
-
-class View1 extends View {
-    protected final int width, height;
-    private final WritableImage buffer;
-    private final int[] data;
-    int wait;
-
-    View1(int width, int height, int wait) {
-        super(width, height);
-        this.width = width;
-        this.height = height;
-        this.wait = wait;
-        buffer = new WritableImage(width, height);
-        data = new int[width * height];
-    }
-
-    public void run() {
-        launchTimer();
-        // uncomment to test if it fails (java.lang.InternalError).
-        // it should work if you managed to program this correctly!
-    }
-
-    void render() {
-        // uncomment to test if it fails
-        // it should work if you managed to program this correctly!
-        if (!Platform.isFxApplicationThread()) throw new Error("Wrong thread!");
-
-        for (int pixelIdx = 0; pixelIdx < data.length; pixelIdx++) {
-            final int idx = pixelIdx;
-                data[idx] = new Random().nextInt(200) | ((new Random().nextInt(16) * 16) << 24);
-
-        }
-
-        buffer.getPixelWriter().setPixels(
-                0, 0,
-                width, height,
-                PixelFormat.getIntArgbPreInstance(), data, 0, width);
-
-        getGraphicsContext2D().clearRect(0.0, 0.0, width, height);
-        getGraphicsContext2D().drawImage(buffer, 0.0, 0.0);
-    }
-
-    void launchTimer() {
-        final Thread t = new Thread(() -> {
-        	Platform.runLater(() -> render());
-        });
-        try {
-			Thread.sleep(wait*500);
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-        new Timer().schedule(new TimerTask() {
-            @Override
-            public void run() {
-                t.run();
-            }
-        }, 0l, 1000l);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.java
deleted file mode 100644
index 3c0a9d8..0000000
--- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package fi.utu.tech.gui.javafx.gimmick;
-
-import javafx.application.Platform;
-import javafx.scene.paint.Color;
-
-import java.util.Random;
-
-class View2 extends View {
-    protected final int width, height;
-    int wait;
-    int laskuri;
-
-    View2(int width, int height, int wait) {
-        super(width, height);
-        this.width = width;
-        this.height = height;
-        this.wait = wait;
-    }
-
-    public void run() {
-    	try {
-			Thread.sleep(wait*500);
-		} catch (InterruptedException e1) {
-			e1.printStackTrace();
-		}
-
-        while (true) {
-            Platform.runLater(() -> render());
-            try {
-                Thread.sleep(200 + new Random().nextInt(10) * 100);
-            } catch (Exception e) {
-            }
-        }
-    }
-
-    void render() {
-        // uncomment to test if it fails
-        // it should work if you managed to program this correctly!
-        if (!Platform.isFxApplicationThread()) throw new Error("Wrong thread!");
-
-    	
-		if(laskuri == 7) {
-    		laskuri = 0;
-    		getGraphicsContext2D().clearRect(0.0, 0.0, width, height);
-    		getGraphicsContext2D().setFill(new Color(0.5,0,0,0.5));
-            getGraphicsContext2D().fillRect(0.0, 0.0, width, height);
-            getGraphicsContext2D().setFill(new Color(0,0,1,0.9));
-    	} else {
-    		laskuri++;
-    		getGraphicsContext2D().setFill(new Color(0.5,0,0,0.5));
-            getGraphicsContext2D().fillRect(0.0, 0.0, width, height);
-            getGraphicsContext2D().setFill(new Color(0,0,1,0.9));
-    		getGraphicsContext2D().fillOval(new Random().nextDouble() * width, new Random().nextDouble() * height, 20, 20);
-    	}
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.java b/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.java
index 798b180..359de41 100644
--- a/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.java
+++ b/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.java
@@ -16,7 +16,7 @@ public class MainApp1 extends MainApp {
 
         Scene scene = new Scene(loader.root);
 
-        stage.setTitle("Zip Master 2020");
+        stage.setTitle("ZIP-pakkaaja");
         stage.setScene(scene);
         stage.show();
     }
diff --git a/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml b/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml
index 9a011d1..0b6a2b4 100644
--- a/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml
+++ b/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml
@@ -60,7 +60,7 @@
                </children></VBox>
          </center>
          <top>
-            <Label text="Zip Master 2020" BorderPane.alignment="CENTER">
+            <Label text="Näyte INIDIUM:lle" BorderPane.alignment="CENTER">
                <font>
                   <Font size="26.0" />
                </font></Label>
-- 
GitLab