diff --git a/bagel-starter-pack/.idea/.gitignore b/bagel-starter-pack/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b341795898f7f485cd4a0cec96b05dc90d3adbe5
--- /dev/null
+++ b/bagel-starter-pack/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/../../../../../../../:\Users\A\Desktop\oosd\bagel-starter-pack\.idea/dataSources/
+/dataSources.local.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
diff --git a/bagel-starter-pack/.idea/.name b/bagel-starter-pack/.idea/.name
new file mode 100644
index 0000000000000000000000000000000000000000..e5199ee79ccef033b3d3412968c960ebf7ffe811
--- /dev/null
+++ b/bagel-starter-pack/.idea/.name
@@ -0,0 +1 @@
+bagel
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/compiler.xml b/bagel-starter-pack/.idea/compiler.xml
new file mode 100644
index 0000000000000000000000000000000000000000..75b0a78be1aedef70704331654ab57699026ec36
--- /dev/null
+++ b/bagel-starter-pack/.idea/compiler.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="bagel" />
+      </profile>
+    </annotationProcessing>
+    <bytecodeTargetLevel>
+      <module name="bagel" target="11" />
+    </bytecodeTargetLevel>
+  </component>
+</project>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/jarRepositories.xml b/bagel-starter-pack/.idea/jarRepositories.xml
new file mode 100644
index 0000000000000000000000000000000000000000..712ab9d985c20018a0c97b93d2148ac1ffe588a5
--- /dev/null
+++ b/bagel-starter-pack/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+  </component>
+</project>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__io_github_eleanor_em_bagel_1_9_3.xml b/bagel-starter-pack/.idea/libraries/Maven__io_github_eleanor_em_bagel_1_9_3.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8a3817e8e03ccad221cb388d67521c24d3f93203
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__io_github_eleanor_em_bagel_1_9_3.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.github.eleanor-em:bagel:1.9.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/io/github/eleanor-em/bagel/1.9.3/bagel-1.9.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/io/github/eleanor-em/bagel/1.9.3/bagel-1.9.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/io/github/eleanor-em/bagel/1.9.3/bagel-1.9.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b41e0a0e6d45226876b26c951f89f0a888668616
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_assimp_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_assimp_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..04a33d893ffa7c2f813e11d6127a98947eb61143
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_assimp_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-assimp:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-assimp/3.2.2/lwjgl-assimp-3.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-assimp/3.2.2/lwjgl-assimp-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-assimp/3.2.2/lwjgl-assimp-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_assimp_natives_windows_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_assimp_natives_windows_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a79e8a179bb0c4eec5aae8c94191b326f9a84871
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_assimp_natives_windows_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-assimp:natives-windows:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-assimp/3.2.2/lwjgl-assimp-3.2.2-natives-windows.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-assimp/3.2.2/lwjgl-assimp-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-assimp/3.2.2/lwjgl-assimp-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_glfw_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_glfw_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..48aa8aa34959abd0874a96c96d6e6f9d65c33c91
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_glfw_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-glfw:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_glfw_natives_windows_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_glfw_natives_windows_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d29558274d1751e28b199599bf85d1ddfa18b9ba
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_glfw_natives_windows_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-glfw:natives-windows:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-windows.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_natives_windows_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_natives_windows_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6ecec7b09589049b3d76151dfe194a55f9fff9e6
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_natives_windows_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl:natives-windows:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-windows.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_openal_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_openal_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..094321fdec8e071749a25633e9045b2367b2860f
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_openal_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-openal:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_openal_natives_windows_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_openal_natives_windows_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8c35c6518f95447da22bb6bc1e5eb77353ac786a
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_openal_natives_windows_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-openal:natives-windows:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-windows.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_opengl_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_opengl_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..24121c2ac5c3e85eac2364a7a2245a6fa9ca70cd
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_opengl_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-opengl:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_opengl_natives_windows_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_opengl_natives_windows_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4a6eab960de86d2070d56d3712b1f563a0b5fe72
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_opengl_natives_windows_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-opengl:natives-windows:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-windows.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_stb_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_stb_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8155b1d9f1cafbdb9f1f61bfe47964a335361c48
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_stb_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-stb:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_stb_natives_windows_3_2_2.xml b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_stb_natives_windows_3_2_2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ac60d0661595293883e623a379de58668e318875
--- /dev/null
+++ b/bagel-starter-pack/.idea/libraries/Maven__org_lwjgl_lwjgl_stb_natives_windows_3_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.lwjgl:lwjgl-stb:natives-windows:3.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-windows.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/misc.xml b/bagel-starter-pack/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c0572aa051d2673266994b9b207ed32cfbc44f9d
--- /dev/null
+++ b/bagel-starter-pack/.idea/misc.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_14" project-jdk-name="14" project-jdk-type="JavaSDK" />
+</project>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/modules.xml b/bagel-starter-pack/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d4754eaf30e6aef9fd18e15d5f94dcd7b30f5d25
--- /dev/null
+++ b/bagel-starter-pack/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/bagel.iml" filepath="$PROJECT_DIR$/bagel.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/bagel-starter-pack/.idea/vcs.xml b/bagel-starter-pack/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a8bca5f4dd48648fdffd2d1504b9c16cc01e4ca9
--- /dev/null
+++ b/bagel-starter-pack/.idea/vcs.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/res" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/yuchen11" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/bagel-starter-pack/bagel.iml b/bagel-starter-pack/bagel.iml
new file mode 100644
index 0000000000000000000000000000000000000000..8485d48eafbacf7844677b7f0495782a0978f8a1
--- /dev/null
+++ b/bagel-starter-pack/bagel.iml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: io.github.eleanor-em:bagel:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-assimp:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-glfw:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-openal:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-opengl:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-stb:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl:natives-windows:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-assimp:natives-windows:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-glfw:natives-windows:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-openal:natives-windows:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-opengl:natives-windows:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.lwjgl:lwjgl-stb:natives-windows:3.2.2" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/bagel-starter-pack/pom.xml b/bagel-starter-pack/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..19edbafc627e4d560897199b353fac6ad0463909
--- /dev/null
+++ b/bagel-starter-pack/pom.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>au.edu.unimelb.cis</groupId>
+    <artifactId>bagel</artifactId>
+    <version>0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <build>
+        <sourceDirectory>src/</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>11</source>
+                    <target>11</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.github.eleanor-em</groupId>
+            <artifactId>bagel</artifactId>
+            <version>1.9.3</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/bagel-starter-pack/src/BagelTest.java b/bagel-starter-pack/src/BagelTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d321cf04dde7ff1f806fd2a9f3ef2daa583336a
--- /dev/null
+++ b/bagel-starter-pack/src/BagelTest.java
@@ -0,0 +1,116 @@
+import bagel.*;
+import bagel.util.Point;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+/**
+ * An example Bagel game.
+ *
+ * @author Eleanor McMurtry
+ */
+public class BagelTest extends AbstractGame {
+    private Image tree[] = new Image[4];
+    private Image gatherer[] = new Image[4];
+    private Image background;
+    int counterTree = 0;
+    int counterGatherer = 0;
+    int towards[] = {1, 2, 3, 4};
+    int counter = 0;
+    int direction[] = {0, 0};
+    Point pTree[] = new Point[5];
+    Point pGatherer[] = new Point[5];
+    BufferedReader reader;
+
+    public BagelTest() throws IOException {
+        super(1024, 768, "fuck");
+//        tree[0] = new Image("res/images/tree.png");
+//        gatherer[0] = new Image("res/images/gatherer.png");
+        background = new Image("res/images/background.png");
+        reader = new BufferedReader(new FileReader("res/worlds/test.csv"));
+        String line;
+
+        while ((line = reader.readLine()) != null) {
+            String item[] = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分
+            int itemX = Integer.parseInt(item[1]);
+            int itemY = Integer.parseInt(item[2]);
+            if (item[0].equals("Tree")) {
+                tree[counterTree] = new Image("res/images/tree.png");
+                pTree[counterTree] = new Point(itemX / 16, itemY / 12);
+                //有问题,如果初始位置不在64的倍数会强制转成64倍数
+                counterTree++;
+            } else {
+                gatherer[counterGatherer] = new Image("res/images/gatherer.png");
+                pGatherer[counterGatherer] = new Point(itemX / 16, itemY / 12);
+                counterGatherer++;
+            }
+        }
+
+        //p[0] = new Point(512 / 64, 384 / 64);
+    }
+
+    /**
+     * The entry point for the program.
+     */
+//    public static void main(String[] args) throws IOException {
+//        BagelTest game = new BagelTest();
+//        game.run();
+//    }
+
+    @Override
+    public void update(Input input) {
+        double speed = 1;
+        Tool tool = new Tool();
+        if (input.wasPressed(Keys.ESCAPE)) {
+            Window.close();
+        }
+        if (counter % 5 == 0) {
+
+            direction[0] = tool.chooseDirection();
+            direction[1] = tool.chooseDirection();
+        }
+
+
+        try {
+            Thread.sleep(500);
+            counter++;
+
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+        for (int i = 0; i < counterGatherer; i++) {
+            tool.move(pGatherer, i, direction[i], speed);
+            System.out.println(pGatherer[i].x);
+        }
+
+        background.drawFromTopLeft(0, 0);
+        for (int i = 0; i < counterGatherer; i++) {
+            gatherer[i].drawFromTopLeft(pGatherer[i].x * 16, pGatherer[i].y * 12);
+            //System.out.println(pGatherer[i].y);
+            //System.out.println(direction);
+        }
+        for (int i = 0; i < counterTree; i++) {
+            tree[i].drawFromTopLeft(pTree[i].x * 16, pTree[i].y * 12);
+            //System.out.println("t"+ i +"...."+pTree[i].y*64);
+        }
+    }
+
+
+
+//    public void isOut(Point point){
+//        if (point.x < 0 && point.x  > 11) {
+//
+//        }
+//    }
+//    public void isHome(){
+//        if ((55> Math.abs(854-x)) && (55>  Math.abs(268-y))) {
+//            if (t == 0) {
+//                System.out.println("you are home!");
+//            }
+//            t++;
+//
+//            font.drawString("you are home!", 32, 32);
+//            //Window.close();
+//        }
+//    }
+}
diff --git a/bagel-starter-pack/src/Game.java b/bagel-starter-pack/src/Game.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c120d648d3ce928316b3be4002c9e5debe94eb4
--- /dev/null
+++ b/bagel-starter-pack/src/Game.java
@@ -0,0 +1,8 @@
+import java.io.IOException;
+
+public class Game {
+    public static void main(String[] args) throws IOException {
+        BagelTest game = new BagelTest();
+        game.run();
+    }
+}
diff --git a/bagel-starter-pack/src/Linear_optimization.java b/bagel-starter-pack/src/Linear_optimization.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c4aa7c76d91a065ffedee1aad04a3b1c1ab0c39
--- /dev/null
+++ b/bagel-starter-pack/src/Linear_optimization.java
@@ -0,0 +1,191 @@
+public class Linear_optimization {
+
+    private static double A[][] = { { 2, 1, 1, 0, 0 , 0},
+            { 3, -2, 0, 1, 0 , 0},
+            { 1, 2, 0, 0, 1, 0 },
+            { -1, 3, 0, 0, 0, 1}};// 系数矩阵
+
+    private static int m = A.length; //m个方程
+    private static int n = A[0].length; //n个决策变量
+
+    private static double C[] = { 3, 2, 0, 0, 0 }; // 价值系数
+
+    private static double b[] = { 5, 4 ,9}; // 资源常数
+
+    private static double theta[] = new double[m]; //b的检验数
+
+    private static int basedVar[] = new int[m]; // 基变量,存基变量的下标,从1开始标号(区别于数组存储习惯)
+
+    private static double yita[] = new double[n]; //检验数,有n个决策变量的检验数
+
+    private static double result = -1; //结果
+
+    private static int idxOfIn = -1; //换入变量的下标
+
+    private static int idxOfOut = -1; //换出变量的下标
+
+    public static void main(String[] args) {
+        //输入数据,为了简单起见,我们的数据直接在代码中敲入,这个函数等测试完后加
+        inputNums();
+        //找初始基变量
+        findBasedVariables();
+        //判断是否最优解
+        while (!isOptimum()) {
+            //找换入变量
+            idxOfIn = getVariableIn();
+            printVector();
+            //找换出变量
+            idxOfOut = getVariableOut();
+            //如果idxOfOut返回-1,则该线性规划问题有无界解
+            if(idxOfOut == -1)
+                return;
+            //旋转运算,更新矩阵
+            updateVectors();
+            printVector();
+            System.out.println("\n");
+        }
+        //输出最优解
+        printOptimum();
+    }
+
+    // 输入数据,先在代码中写入数据,后期再加,先把初始检验数赋值为价值系数
+    private static void inputNums() {
+        for (int i = 0; i < yita.length; i++) {
+            yita[i] = C[i]; //yita为检验数
+        }
+    }
+
+    // 找基变量,简单的拿最后m个决策变量,后期可优化,存储在basedVar数组中
+    private static void findBasedVariables() {
+
+        //取n个决策变量的最后m个作基变量
+        for (int i = 0; i < m; i++) {
+            //basedVar[i] = n-i;
+            //改变存放顺序为正叙
+            basedVar[m-i-1] = n-i ;
+        }
+        System.out.println("基变量为:");
+        for (int i = 0; i < basedVar.length; i++) {
+            System.out.print("x" + (basedVar[i]) + "\t");
+        }
+        System.out.println();
+    }
+
+    // 判断是否最优解,并计算检验数yita向量
+    private static boolean isOptimum() {
+        //换入变量代替换出变量
+        if(idxOfIn != -1 && idxOfOut != -1){
+            //第idxOfOut个基变量换为x idxOfIn
+            basedVar[idxOfOut] = idxOfIn+1;
+        }
+        //更新检验数
+        for (int i = 0; i < n; i++) {
+            double temp = yita[i];
+            for (int j = 0; j < m; j++) {
+                temp -= A[j][i] * C[basedVar[j] -1];
+            }
+            yita[i] = temp;
+        }
+
+        boolean hasPossitiveYita = false;
+        for (int i = 0; i < yita.length; i++) {
+            if(yita[i] > 0)
+                hasPossitiveYita = true;
+        }
+        System.out.println("是否最优解:" + !hasPossitiveYita);
+        return !hasPossitiveYita;
+    }
+
+    // 确定换入变量,返回换入变量的下标-1
+    private static int getVariableIn() {
+        //遍历检验数
+        int index = 0;
+        System.out.println("检验数如下:");
+        for (int i = 0; i < yita.length; i++) {
+            System.out.print(yita[i] + "\t");
+            if(yita[i] > yita[index]){
+                index = i;
+            }
+        }
+        System.out.println();
+        System.out.println("换入变量是x" + (index+1));
+        return index;
+    }
+
+    // 确定换出变量,返回换出变量在基变量向量中的下标
+    private static int getVariableOut() {
+
+        System.out.println("theta:");
+        for (int i = 0; i < m; i++) {
+            if( Double.compare(A[i][idxOfIn], 0) != 0)
+                theta[i] = b[i] / A[i][idxOfIn];
+            else {
+                theta[i] = 0;
+            }
+            System.out.print(theta[i] + "\t");
+        }
+        System.out.println();
+
+        int index = 0;
+        for (int i = 0; i < theta.length; i++) {
+            if(theta[i] <= 0){
+                System.out.println("该方程有无界解...");
+                return -1;
+            }else {
+                if(theta[i] < theta[index])
+                    index = i;
+            }
+        }
+        System.out.println("换出变量是:x" + (basedVar[index]));
+        return index;
+    }
+
+    // 更新旋转运算后的矩阵
+    private static void updateVectors() {
+        //m个方程,n个变量
+        //将主元系数化为1
+        //防止迭代中主元的值被改变后引起 其它系数除主元的新值,将主元的原值存于temp
+        double temp = A[idxOfOut][idxOfIn];
+        for (int i = 0; i < n; i++) {
+            A[idxOfOut][i] /= temp;
+        }
+        b[idxOfOut] /= temp;
+
+        System.out.println("\n将主元系数化为1");
+        printVector();
+        //主元所在列其余元素系数要化为0,即:主元列中,非主元所在行均减去 主元系数分之一*A[m][n]
+        for (int i = 0; i < m; i++) {
+            //若是换出变量所对应行,则该行不用换算
+            double temp1 = A[i][idxOfIn]/A[idxOfOut][idxOfIn];
+            if(i != idxOfOut){
+                for (int j = 0; j < n; j++) {
+                    A[i][j] -= A[idxOfOut][j]*temp1;
+                }
+                b[i] -= b[idxOfOut] * temp1;
+            }
+        }
+        System.out.println("完成一次矩阵旋转运算...");
+    }
+
+    //输出系数矩阵
+    private static void printVector() {
+        for (int i = 0; i < m; i++) {
+            for (int j = 0; j < n; j++) {
+                System.out.print(A[i][j] + "\t");
+            }
+            System.out.println(b[i]);
+        }
+        System.out.println("-----------------------------------------------");
+    }
+
+    //输出最优解
+    private static void printOptimum() {
+        result = 0;
+        for (int i = 0; i < basedVar.length; i++) {
+            result += C[basedVar[i]-1] * b[i];
+        }
+        System.out.println("最优解:z = " + result);
+    }
+
+
+}
diff --git a/bagel-starter-pack/src/Tool.java b/bagel-starter-pack/src/Tool.java
new file mode 100644
index 0000000000000000000000000000000000000000..19a7e299f93e4754dfd7ca195145344ca73760c1
--- /dev/null
+++ b/bagel-starter-pack/src/Tool.java
@@ -0,0 +1,26 @@
+import bagel.util.Point;
+
+public class Tool {
+    public int chooseDirection() {
+        int direction = 1 + (int) (Math.random() * (4));
+        return direction;
+    }
+
+    public void move(Point point[], int order, int direction, double speed) {
+        if (direction == 1) {
+            point[order] = new Point(point[order].x - speed, point[order].y);
+        }
+        if (direction == 2) {
+            point[order] = new Point(point[order].x + speed, point[order].y);
+            //point = new Point(point.x + speed, point.y);
+        }
+        if (direction == 3) {
+            point[order] = new Point(point[order].x, point[order].y - speed);
+            // point = new Point(point.x, point.y - speed);
+        }
+        if (direction == 4) {
+            point[order] = new Point(point[order].x, point[order].y + speed);
+            //point = new Point(point.x, point.y + speed);
+        }
+    }
+}
diff --git a/bagel-starter-pack/src/VideoGame.java b/bagel-starter-pack/src/VideoGame.java
new file mode 100644
index 0000000000000000000000000000000000000000..aed9f30793c76e33dfaf8a14375396e634cf3da7
--- /dev/null
+++ b/bagel-starter-pack/src/VideoGame.java
@@ -0,0 +1,74 @@
+import java.util.Arrays;
+
+public class VideoGame {
+    public final String name;
+    public final String platform;
+
+    private static final VideoGame[] games = new VideoGame[100];
+    private static int numGames = 0;
+
+    public VideoGame(String name, String platform) {
+        this.name = name;
+        this.platform = platform;
+
+        games[numGames++] = this;
+    }
+
+    public int compareTo(VideoGame other) {
+        int platformCompare = platform.compareTo(other.platform);
+        if (platformCompare != 0) {
+            return platformCompare;
+        } else {
+            return name.compareTo(other.name);
+        }
+    }
+
+    public static VideoGame[] getSortedVideoGames() {
+        // Create a copy of the array to sort
+        VideoGame[] sorted = Arrays.copyOf(games, games.length);
+
+        // Recursively sort the array
+        quickSort(sorted, 0, numGames - 1);
+        return sorted;
+    }
+
+    private static void quickSort(VideoGame[] array, int low, int high) {
+        if (low < high) {
+            // Choose a pivot
+            VideoGame pivot = array[high];
+
+            // Partition the array
+            int i = low;
+            for (int j = low; j < high; ++j) {
+                if (array[j].compareTo(pivot) < 0) {
+                    // Swap the elements
+                    VideoGame temp = array[i];
+                    array[j] = array[i];
+                    array[j] = temp;
+                    ++i;
+                }
+            }
+
+            // Swap the elements
+            VideoGame temp = array[i];
+            array[high] = array[i];
+            array[i] = temp;
+
+            quickSort(array, low, i - 1);
+            quickSort(array, i + 1, high - 1);
+        }
+    }
+
+    public String toString() {
+        return String.format("%s (%s)", name, platform);
+    }
+
+    public static void main(String[] args) {
+        new VideoGame("Halo", "Xbox");
+        new VideoGame("Ocarina of Time", "Nintendo 64");
+        new VideoGame("Red Dead Redemption 2", "Xbox One");
+        new VideoGame("Majora's Mask", "Nintendo 64");
+
+        System.out.println(Arrays.toString(VideoGame.getSortedVideoGames()));
+    }
+}
diff --git a/bagel-starter-pack/target/classes/BagelTest.class b/bagel-starter-pack/target/classes/BagelTest.class
new file mode 100644
index 0000000000000000000000000000000000000000..8ee793345f8d4964433889064552b2c7a80cc4a1
Binary files /dev/null and b/bagel-starter-pack/target/classes/BagelTest.class differ
diff --git a/bagel-starter-pack/target/classes/Game.class b/bagel-starter-pack/target/classes/Game.class
new file mode 100644
index 0000000000000000000000000000000000000000..a0e649b24d3969dec369ed61080c6ebe8532cd7e
Binary files /dev/null and b/bagel-starter-pack/target/classes/Game.class differ
diff --git a/bagel-starter-pack/target/classes/Linear_optimization.class b/bagel-starter-pack/target/classes/Linear_optimization.class
new file mode 100644
index 0000000000000000000000000000000000000000..bae20d3e79da53a1388015c449ad5ddea31f7d98
Binary files /dev/null and b/bagel-starter-pack/target/classes/Linear_optimization.class differ
diff --git a/bagel-starter-pack/target/classes/Tool.class b/bagel-starter-pack/target/classes/Tool.class
new file mode 100644
index 0000000000000000000000000000000000000000..1c1738eff445837e680a9ad52564d146b6376c21
Binary files /dev/null and b/bagel-starter-pack/target/classes/Tool.class differ
diff --git a/bagel-starter-pack/target/classes/VideoGame.class b/bagel-starter-pack/target/classes/VideoGame.class
new file mode 100644
index 0000000000000000000000000000000000000000..3824ee33aa6fa856fb1fb99b6e74475dbc0b8f32
Binary files /dev/null and b/bagel-starter-pack/target/classes/VideoGame.class differ