From 0a7d043b8ca91ad67d5e77653401fe0ed385da08 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 25 Mar 2018 17:56:41 +0200
Subject: [PATCH] Implement about and crash screens

---
 app/build.gradle.kts                          |   4 +-
 app/sampledata/contributors.json              |  29 +++
 app/sampledata/libraries.json                 | 155 +++++++++++++
 app/src/main/AndroidManifest.xml              |  21 +-
 .../quasseldroid/dagger/ActivityModule.kt     |  15 ++
 .../quasseldroid/ui/chat/ChatActivity.kt      |  10 +-
 .../quasseldroid/ui/chat/input/Editor.kt      |   6 +-
 .../ui/chat/input/FormatHandler.kt            |   2 +-
 .../ui/settings/SettingsActivity.kt           |  14 +-
 .../settings/about/AboutSettingsActivity.kt   |   5 +
 .../settings/about/AboutSettingsFragment.kt   | 210 ++++++++++++++++++
 .../about/AboutSettingsFragmentProvider.kt    |  10 +
 .../ui/settings/about/Contributor.kt          |   7 +
 .../ui/settings/about/ContributorAdapter.kt   |  44 ++++
 .../quasseldroid/ui/settings/about/Library.kt |   8 +
 .../ui/settings/about/LibraryAdapter.kt       |  58 +++++
 .../quasseldroid/ui/settings/about/License.kt |   9 +
 .../ui/settings/app/AppSettingsActivity.kt    |  25 ++-
 .../settings/crash/CrashSettingsActivity.kt   |   5 +
 .../settings/crash/CrashSettingsFragment.kt   | 169 ++++++++++++++
 .../crash/CrashSettingsFragmentProvider.kt    |  10 +
 .../license/LicenseSettingsActivity.kt        |  19 ++
 .../license/LicenseSettingsFragment.kt        |  35 +++
 .../LicenseSettingsFragmentProvider.kt        |  10 +
 .../accounts/edit/AccountEditActivity.kt      |   6 +-
 .../quasseldroid/util/helper/GsonHelper.kt    |   7 +
 .../res/layout-sw720dp/activity_settings.xml  |   9 +-
 app/src/main/res/layout/activity_settings.xml |  16 +-
 app/src/main/res/layout/fragment_about.xml    |  71 ++++++
 app/src/main/res/layout/fragment_crash.xml    |   5 +
 app/src/main/res/layout/fragment_license.xml  |  28 +++
 .../main/res/layout/layout_about_header.xml   |  78 +++++++
 .../main/res/layout/preference_vertical.xml   |   4 +-
 .../main/res/layout/widget_contributor.xml    |  49 ++++
 app/src/main/res/layout/widget_crash.xml      |  44 ++++
 app/src/main/res/layout/widget_library.xml    |  49 ++++
 app/src/main/res/menu/activity_crashes.xml    |   6 +
 app/src/main/res/menu/activity_main.xml       |   6 +-
 app/src/main/res/menu/activity_settings.xml   |   9 +
 app/src/main/res/menu/editor.xml              |  41 +---
 app/src/main/res/menu/formatting.xml          |  44 ++++
 app/src/main/res/menu/input_panel.xml         |   9 -
 app/src/main/res/menu/setup_edit_account.xml  |   4 +-
 .../res/mipmap-hdpi/ic_launcher_legacy.png    | Bin 0 -> 3983 bytes
 .../res/mipmap-mdpi/ic_launcher_legacy.png    | Bin 0 -> 2366 bytes
 .../res/mipmap-xhdpi/ic_launcher_legacy.png   | Bin 0 -> 5819 bytes
 .../res/mipmap-xxhdpi/ic_launcher_legacy.png  | Bin 0 -> 10074 bytes
 .../res/mipmap-xxxhdpi/ic_launcher_legacy.png | Bin 0 -> 14545 bytes
 app/src/main/res/values-de/strings.xml        |   6 +
 app/src/main/res/values/attrs.xml             |   1 +
 app/src/main/res/values/strings.xml           |  10 +
 app/src/main/res/values/strings_licenses.xml  |  48 ++++
 app/src/main/res/values/styles_widgets.xml    |   5 +-
 app/src/main/res/values/themes_base.xml       |   2 +
 app/src/main/res/values/themes_gruvbox.xml    |   2 +
 app/src/main/res/values/themes_solarized.xml  |   2 +
 lib/build.gradle.kts                          |   2 +-
 persistence/build.gradle.kts                  |   2 +-
 viewmodel/build.gradle.kts                    |   2 +-
 59 files changed, 1359 insertions(+), 88 deletions(-)
 create mode 100644 app/sampledata/contributors.json
 create mode 100644 app/sampledata/libraries.json
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/helper/GsonHelper.kt
 create mode 100644 app/src/main/res/layout/fragment_about.xml
 create mode 100644 app/src/main/res/layout/fragment_crash.xml
 create mode 100644 app/src/main/res/layout/fragment_license.xml
 create mode 100644 app/src/main/res/layout/layout_about_header.xml
 create mode 100644 app/src/main/res/layout/widget_contributor.xml
 create mode 100644 app/src/main/res/layout/widget_crash.xml
 create mode 100644 app/src/main/res/layout/widget_library.xml
 create mode 100644 app/src/main/res/menu/activity_crashes.xml
 create mode 100644 app/src/main/res/menu/activity_settings.xml
 create mode 100644 app/src/main/res/menu/formatting.xml
 delete mode 100644 app/src/main/res/menu/input_panel.xml
 create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_legacy.png
 create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_legacy.png
 create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_legacy.png
 create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_legacy.png
 create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_legacy.png
 create mode 100644 app/src/main/res/values/strings_licenses.xml

diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 7b426b435..fbcb8b236 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -120,7 +120,8 @@ dependencies {
   // Utility
   implementation("io.reactivex.rxjava2", "rxjava", "2.1.9")
   implementation("org.threeten", "threetenbp", "1.3.6", classifier = "no-tzdb")
-  implementation("org.jetbrains", "annotations", "15.0")
+  implementation("org.jetbrains", "annotations", "16.0.1")
+  implementation("com.google.code.gson", "gson", "2.8.2")
   withVersion("8.8.1") {
     implementation("com.jakewharton", "butterknife", version)
     kapt("com.jakewharton", "butterknife-compiler", version)
@@ -136,7 +137,6 @@ dependencies {
   // UI
   implementation("me.zhanghai.android.materialprogressbar", "library", "1.4.2")
   implementation("com.afollestad.material-dialogs", "core", "0.9.6.0")
-  implementation("com.stepstone.stepper", "material-stepper", "4.3.1")
   implementation(project(":slidingpanel"))
 
   // Quality Assurance
diff --git a/app/sampledata/contributors.json b/app/sampledata/contributors.json
new file mode 100644
index 000000000..8683df065
--- /dev/null
+++ b/app/sampledata/contributors.json
@@ -0,0 +1,29 @@
+{
+  "data": [
+    {
+      "name": "Frederik M. J. Vestre",
+      "nickname": "freqmod",
+      "description": "Initial qdatastream deserialization attempts"
+    },
+    {
+      "name": "Martin “Java Sucks” Sandsmark",
+      "nickname": "sandsmark",
+      "description": "Legacy protocol implementation, (de)serializers, project (de)moralizer"
+    },
+    {
+      "name": "Magnus Fjell",
+      "nickname": "magnuf",
+      "description": "Legacy UI"
+    },
+    {
+      "name": "Ken Børge Viktil",
+      "nickname": "Kenji",
+      "description": "Legacy UI"
+    },
+    {
+      "name": "Janne Koschinski",
+      "nickname": "justJanne",
+      "description": "Rewrite, UI, Annotation Processors, Backend"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/app/sampledata/libraries.json b/app/sampledata/libraries.json
new file mode 100644
index 000000000..f460cb3b5
--- /dev/null
+++ b/app/sampledata/libraries.json
@@ -0,0 +1,155 @@
+{
+  "data": [
+    {
+      "name": "Android Architecture Components: Lifecycle",
+      "version": "1.1.1",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://android.googlesource.com/platform/frameworks/support/+/master/lifecycle"
+    },
+    {
+      "name": "Android Architecture Components: Paging",
+      "version": "1.0.0-alpha7",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://android.googlesource.com/platform/frameworks/support/+/master/paging"
+    },
+    {
+      "name": "Android Architecture Components: Room",
+      "version": "1.1.0-beta1",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://android.googlesource.com/platform/frameworks/support/+/master/room"
+    },
+    {
+      "name": "Android Sliding Up Panel",
+      "version": "3.5.0",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      }
+    },
+    {
+      "name": "Android Support Library",
+      "version": "27.1.0",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://android.googlesource.com/platform/frameworks/support/+/master"
+    },
+    {
+      "name": "AutoService",
+      "version": "1.0-rc4",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://github.com/google/auto/tree/master/service"
+    },
+    {
+      "name": "Butter Knife",
+      "version": "8.8.1",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "http://jakewharton.github.io/butterknife/"
+    },
+    {
+      "name": "Dagger 2",
+      "version": "2.15",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://google.github.io/dagger/"
+    },
+    {
+      "name": "Gson",
+      "version": "2.8.2",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://github.com/google/gson"
+    },
+    {
+      "name": "JavaPoet",
+      "version": "1.10.0",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://github.com/square/javapoet"
+    },
+    {
+      "name": "JetBrains Java Annotations",
+      "version": "16.0.1",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://github.com/JetBrains/java-annotations"
+    },
+    {
+      "name": "Kotlin Standard Library",
+      "version": "1.2.31",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://kotlinlang.org/"
+    },
+    {
+      "name": "LeakCanary",
+      "version": "1.5.4",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://github.com/square/leakcanary"
+    },
+    {
+      "name": "Material Dialogs",
+      "version": "0.9.6.0",
+      "license": {
+        "shortName": "MIT",
+        "fullName": "The MIT License (MIT}"
+      },
+      "url": "https://github.com/afollestad/material-dialogs"
+    },
+    {
+      "name": "MaterialProgressBar",
+      "version": "1.4.2",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://github.com/DreaminginCodeZH/MaterialProgressBar"
+    },
+    {
+      "name": "RxJava",
+      "version": "2.1.9",
+      "license": {
+        "shortName": "Apache-2.0",
+        "fullName": "Apache License"
+      },
+      "url": "https://github.com/ReactiveX/RxJava"
+    },
+    {
+      "name": "ThreeTen backport project",
+      "version": "1.3.6",
+      "license": {
+        "shortName": "BSD 3-clause"
+      },
+      "url": "http://www.threeten.org/threetenbp/"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 22ee8f941..e32180e8c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,7 +10,7 @@
   <application
     android:name=".QuasselDroid"
     android:allowBackup="true"
-    android:icon="@mipmap/ic_launcher"
+    android:icon="@mipmap/ic_launcher_legacy"
     android:label="@string/app_name"
     android:supportsRtl="true"
     android:theme="@style/Theme.SplashTheme">
@@ -51,6 +51,25 @@
       android:label="@string/label_settings"
       android:parentActivityName=".ui.chat.ChatActivity"
       android:windowSoftInputMode="adjustResize" />
+    <activity
+      android:name=".ui.settings.crash.CrashSettingsActivity"
+      android:exported="false"
+      android:label="@string/label_crashes"
+      android:parentActivityName=".ui.settings.app.AppSettingsActivity"
+      android:windowSoftInputMode="adjustResize" />
+    <activity
+      android:name=".ui.settings.about.AboutSettingsActivity"
+      android:exported="false"
+      android:label="@string/label_about"
+      android:parentActivityName=".ui.settings.app.AppSettingsActivity"
+      android:windowSoftInputMode="adjustResize" />
+    <activity
+      android:name=".ui.settings.license.LicenseSettingsActivity"
+      android:exported="false"
+      android:label="@string/label_license"
+      android:parentActivityName=".ui.settings.about.AboutSettingsActivity"
+      android:windowSoftInputMode="adjustResize" />
+
     <activity
       android:name=".ui.setup.accounts.selection.AccountSelectionActivity"
       android:exported="false"
diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
index 32b549b60..c3effe131 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
@@ -6,8 +6,14 @@ import de.kuschku.quasseldroid.service.QuasselService
 import de.kuschku.quasseldroid.ui.chat.ChatActivity
 import de.kuschku.quasseldroid.ui.chat.ChatActivityModule
 import de.kuschku.quasseldroid.ui.chat.ChatFragmentProvider
+import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsActivity
+import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsFragmentProvider
 import de.kuschku.quasseldroid.ui.settings.app.AppSettingsActivity
 import de.kuschku.quasseldroid.ui.settings.app.AppSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsActivity
+import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsActivity
+import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsFragmentProvider
 import de.kuschku.quasseldroid.ui.setup.accounts.edit.AccountEditActivity
 import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionActivity
 import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionFragmentProvider
@@ -22,6 +28,15 @@ abstract class ActivityModule {
   @ContributesAndroidInjector(modules = [AppSettingsFragmentProvider::class])
   abstract fun bindAppSettingsActivity(): AppSettingsActivity
 
+  @ContributesAndroidInjector(modules = [CrashSettingsFragmentProvider::class])
+  abstract fun bindCrashSettingsActivity(): CrashSettingsActivity
+
+  @ContributesAndroidInjector(modules = [AboutSettingsFragmentProvider::class])
+  abstract fun bindAboutSettingsActivity(): AboutSettingsActivity
+
+  @ContributesAndroidInjector(modules = [LicenseSettingsFragmentProvider::class])
+  abstract fun bindLicenseSettingsActivity(): LicenseSettingsActivity
+
   @ContributesAndroidInjector(modules = [AccountSetupFragmentProvider::class])
   abstract fun bindAccountSetupActivity(): AccountSetupActivity
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index 5365c3e40..cf6d3b697 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -294,11 +294,11 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
   }
 
   override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
-    android.R.id.home    -> {
+    android.R.id.home           -> {
       drawerToggle.onOptionsItemSelected(item)
     }
 
-    R.id.filter_messages -> {
+    R.id.action_filter_messages -> {
       runInBackground {
         viewModel.buffer { buffer ->
           val filtered = Message_Type.of(database.filtered().get(accountId, buffer) ?: 0)
@@ -345,15 +345,15 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
       }
       true
     }
-    R.id.settings        -> {
+    R.id.action_settings        -> {
       startActivity(Intent(applicationContext, AppSettingsActivity::class.java))
       true
     }
-    R.id.disconnect      -> {
+    R.id.action_disconnect      -> {
       disconnect()
       true
     }
-    else                 -> super.onOptionsItemSelected(item)
+    else                        -> super.onOptionsItemSelected(item)
   }
 
   private fun disconnect() {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt
index ab3ceea63..96884a004 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt
@@ -39,11 +39,11 @@ class Editor(
   private val panelStateCallback: (Boolean) -> Unit
 ) : ActionMenuView.OnMenuItemClickListener, Toolbar.OnMenuItemClickListener {
   override fun onMenuItemClick(item: MenuItem?) = when (item?.itemId) {
-    R.id.input_history -> {
+    R.id.action_input_history -> {
       panelStateCallback(true)
       true
     }
-    else               -> formatHandler.onMenuItemClick(item)
+    else                      -> formatHandler.onMenuItemClick(item)
   }
 
   private val lastWord = BehaviorSubject.createDefault(Pair("", IntRange.EMPTY))
@@ -143,7 +143,7 @@ class Editor(
     formattingMenu.menu.retint(activity)
     formattingMenu.setOnMenuItemClickListener(this)
 
-    activity.menuInflater.inflate(R.menu.input_panel, formattingToolbar.menu)
+    activity.menuInflater.inflate(R.menu.editor, formattingToolbar.menu)
     formattingToolbar.menu.retint(activity)
     formattingToolbar.setOnMenuItemClickListener(this)
   }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt
index 2fcff65f9..e1656a01e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt
@@ -41,7 +41,7 @@ class FormatHandler(private val editText: EditText) {
     }
 
   @MenuRes
-  val menu: Int = R.menu.editor
+  val menu: Int = R.menu.formatting
 
   fun toggleBold(range: IntRange, createNew: Boolean = true) {
     if (range.isEmpty())
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt
index 99f2657f8..6f26b2b27 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt
@@ -8,8 +8,8 @@ import butterknife.ButterKnife
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.util.service.ServiceBoundActivity
 
-abstract class SettingsActivity : ServiceBoundActivity() {
-  protected abstract val fragment: Fragment
+abstract class SettingsActivity(private val fragment: Fragment? = null) : ServiceBoundActivity() {
+  protected open fun fragment(): Fragment? = null
 
   @BindView(R.id.toolbar)
   lateinit var toolbar: Toolbar
@@ -22,8 +22,12 @@ abstract class SettingsActivity : ServiceBoundActivity() {
     setSupportActionBar(toolbar)
     supportActionBar?.setDisplayHomeAsUpEnabled(true)
 
-    val transaction = supportFragmentManager.beginTransaction()
-    transaction.add(R.id.fragment_container, fragment)
-    transaction.commit()
+    val fragment = this.fragment ?: this.fragment()
+
+    if (fragment != null) {
+      val transaction = supportFragmentManager.beginTransaction()
+      transaction.replace(R.id.fragment_container, fragment)
+      transaction.commit()
+    }
   }
 }
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt
new file mode 100644
index 000000000..5f6d1701f
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.settings.about
+
+import de.kuschku.quasseldroid.ui.settings.SettingsActivity
+
+class AboutSettingsActivity : SettingsActivity(AboutSettingsFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt
new file mode 100644
index 000000000..9de5af5a6
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt
@@ -0,0 +1,210 @@
+package de.kuschku.quasseldroid.ui.settings.about
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.support.v4.view.ViewCompat
+import android.support.v7.widget.DividerItemDecoration
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.TextView
+import butterknife.BindView
+import butterknife.ButterKnife
+import dagger.android.support.DaggerFragment
+import de.kuschku.quasseldroid.BuildConfig
+import de.kuschku.quasseldroid.R
+
+class AboutSettingsFragment : DaggerFragment() {
+
+  @BindView(R.id.version)
+  lateinit var version: TextView
+
+  @BindView(R.id.action_website)
+  lateinit var website: Button
+
+  @BindView(R.id.action_github)
+  lateinit var github: Button
+
+  @BindView(R.id.contributors)
+  lateinit var contributors: RecyclerView
+
+  @BindView(R.id.libraries)
+  lateinit var libraries: RecyclerView
+
+  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                            savedInstanceState: Bundle?): View? {
+    val view = inflater.inflate(R.layout.fragment_about, container, false)
+    ButterKnife.bind(this, view)
+
+    version.text = BuildConfig.VERSION_NAME
+
+    website.setOnClickListener {
+      val intent = Intent(Intent.ACTION_VIEW)
+      intent.data = Uri.parse("https://quasseldroid.info/")
+      context?.startActivity(intent)
+    }
+
+    github.setOnClickListener {
+      val intent = Intent(Intent.ACTION_VIEW)
+      intent.data = Uri.parse("https://github.com/justjanne/quasseldroid-ng")
+      context?.startActivity(intent)
+    }
+
+    val apache2 = License(
+      shortName = "Apache-2.0",
+      fullName = "Apache License",
+      text = R.string.license_apache_2
+    )
+
+    libraries.layoutManager = LinearLayoutManager(context)
+    libraries.adapter = LibraryAdapter(listOf(
+      Library(
+        name = "Android Architecture Components: Lifecycle",
+        version = "1.1.1",
+        license = apache2,
+        url = "https://android.googlesource.com/platform/frameworks/support/+/master/lifecycle"
+      ),
+      Library(
+        name = "Android Architecture Components: Paging",
+        version = "1.0.0-alpha7",
+        license = apache2,
+        url = "https://android.googlesource.com/platform/frameworks/support/+/master/paging"
+      ),
+      Library(
+        name = "Android Architecture Components: Room",
+        version = "1.1.0-beta1",
+        license = apache2,
+        url = "https://android.googlesource.com/platform/frameworks/support/+/master/room"
+      ),
+      Library(
+        name = "Android Sliding Up Panel",
+        version = "3.5.0",
+        license = apache2
+      ),
+      Library(
+        name = "Android Support Library",
+        version = "27.1.0",
+        license = apache2,
+        url = "https://android.googlesource.com/platform/frameworks/support/+/master"
+      ),
+      Library(
+        name = "AutoService",
+        version = "1.0-rc4",
+        license = apache2,
+        url = "https://github.com/google/auto/tree/master/service"
+      ),
+      Library(
+        name = "Butter Knife",
+        version = "8.8.1",
+        license = apache2,
+        url = "http://jakewharton.github.io/butterknife/"
+      ),
+      Library(
+        name = "Dagger 2",
+        version = "2.15",
+        license = apache2,
+        url = "https://google.github.io/dagger/"
+      ),
+      Library(
+        name = "Gson",
+        version = "2.8.2",
+        license = apache2,
+        url = "https://github.com/google/gson"
+      ),
+      Library(
+        name = "JavaPoet",
+        version = "1.10.0",
+        license = apache2,
+        url = "https://github.com/square/javapoet"
+      ),
+      Library(
+        name = "JetBrains Java Annotations",
+        version = "16.0.1",
+        license = apache2,
+        url = "https://github.com/JetBrains/java-annotations"
+      ),
+      Library(
+        name = "Kotlin Standard Library",
+        version = "1.2.31",
+        license = apache2,
+        url = "https://kotlinlang.org/"
+      ),
+      Library(
+        name = "LeakCanary",
+        version = "1.5.4",
+        license = apache2,
+        url = "https://github.com/square/leakcanary"
+      ),
+      Library(
+        name = "Material Dialogs",
+        version = "0.9.6.0",
+        license = License(
+          shortName = "MIT",
+          fullName = "The MIT License (MIT)",
+          text = R.string.license_materialdialogs
+        ),
+        url = "https://github.com/afollestad/material-dialogs"
+      ),
+      Library(
+        name = "MaterialProgressBar",
+        version = "1.4.2",
+        license = apache2,
+        url = "https://github.com/DreaminginCodeZH/MaterialProgressBar"
+      ),
+      Library(
+        name = "RxJava",
+        version = "2.1.9",
+        license = apache2,
+        url = "https://github.com/ReactiveX/RxJava"
+      ),
+      Library(
+        name = "ThreeTen backport project",
+        version = "1.3.6",
+        license = License(
+          shortName = "BSD 3-clause",
+          text = R.string.license_threetenbp
+        ),
+        url = "http://www.threeten.org/threetenbp/"
+      )
+    ))
+    libraries.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL))
+    ViewCompat.setNestedScrollingEnabled(libraries, false)
+
+    contributors.layoutManager = LinearLayoutManager(context)
+    contributors.adapter = ContributorAdapter(listOf(
+      Contributor(
+        name = "Frederik M. J. Vestre",
+        nickName = "freqmod",
+        description = "Initial qdatastream deserialization attempts"
+      ),
+      Contributor(
+        name = "Martin “Java Sucks” Sandsmark",
+        nickName = "sandsmark",
+        description = "Legacy protocol implementation, (de)serializers, project (de)moralizer"
+      ),
+      Contributor(
+        name = "Magnus Fjell",
+        nickName = "magnuf",
+        description = "Legacy UI"
+      ),
+      Contributor(
+        name = "Ken Børge Viktil",
+        nickName = "Kenji",
+        description = "Legacy UI"
+      ),
+      Contributor(
+        name = "Janne Koschinski",
+        nickName = "justJanne",
+        description = "Rewrite, UI, Annotation Processors, Backend"
+      )
+    ))
+    contributors.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL))
+    ViewCompat.setNestedScrollingEnabled(contributors, false)
+
+    return view
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt
new file mode 100644
index 000000000..e12cd9aef
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt
@@ -0,0 +1,10 @@
+package de.kuschku.quasseldroid.ui.settings.about
+
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module
+abstract class AboutSettingsFragmentProvider {
+  @ContributesAndroidInjector
+  abstract fun bindAboutSettingsFragment(): AboutSettingsFragment
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt
new file mode 100644
index 000000000..30ba46c4b
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt
@@ -0,0 +1,7 @@
+package de.kuschku.quasseldroid.ui.settings.about
+
+data class Contributor(
+  val name: String,
+  val nickName: String,
+  val description: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt
new file mode 100644
index 000000000..91ed4cdb3
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt
@@ -0,0 +1,44 @@
+package de.kuschku.quasseldroid.ui.settings.about
+
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.quasseldroid.R
+
+class ContributorAdapter(private val contributors: List<Contributor>) :
+  RecyclerView.Adapter<ContributorAdapter.ContributorViewHolder>() {
+  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ContributorViewHolder(
+    LayoutInflater.from(parent.context).inflate(R.layout.widget_contributor, parent, false)
+  )
+
+  override fun getItemCount() = contributors.size
+
+  override fun onBindViewHolder(holder: ContributorViewHolder, position: Int) {
+    holder.bind(contributors[position])
+  }
+
+  class ContributorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+    @BindView(R.id.name)
+    lateinit var name: TextView
+
+    @BindView(R.id.nickname)
+    lateinit var nickName: TextView
+
+    @BindView(R.id.description)
+    lateinit var description: TextView
+
+    init {
+      ButterKnife.bind(this, itemView)
+    }
+
+    fun bind(item: Contributor) {
+      this.name.text = item.name
+      this.nickName.text = item.nickName
+      this.description.text = item.description
+    }
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt
new file mode 100644
index 000000000..2621adf09
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt
@@ -0,0 +1,8 @@
+package de.kuschku.quasseldroid.ui.settings.about
+
+data class Library(
+  val name: String,
+  val version: String,
+  val license: License,
+  val url: String? = null
+)
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt
new file mode 100644
index 000000000..f2cfb94bf
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt
@@ -0,0 +1,58 @@
+package de.kuschku.quasseldroid.ui.settings.about
+
+import android.content.Intent
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsActivity
+
+class LibraryAdapter(private val libraries: List<Library>) :
+  RecyclerView.Adapter<LibraryAdapter.LibraryViewHolder>() {
+  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = LibraryViewHolder(
+    LayoutInflater.from(parent.context).inflate(R.layout.widget_library, parent, false)
+  )
+
+  override fun getItemCount() = libraries.size
+
+  override fun onBindViewHolder(holder: LibraryViewHolder, position: Int) {
+    holder.bind(libraries[position])
+  }
+
+  class LibraryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+    @BindView(R.id.name)
+    lateinit var name: TextView
+
+    @BindView(R.id.version)
+    lateinit var version: TextView
+
+    @BindView(R.id.license)
+    lateinit var license: TextView
+
+    private var item: Library? = null
+
+    init {
+      ButterKnife.bind(this, itemView)
+      itemView.setOnClickListener {
+        this.item?.run {
+          val intent = Intent(itemView.context,
+                              LicenseSettingsActivity::class.java)
+          intent.putExtra("license_name", license.fullName)
+          intent.putExtra("license_text", license.text)
+          itemView.context.startActivity(intent)
+        }
+      }
+    }
+
+    fun bind(item: Library) {
+      this.item = item
+      this.name.text = item.name
+      this.version.text = item.version
+      this.license.text = item.license.shortName
+    }
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt
new file mode 100644
index 000000000..08e21f53b
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt
@@ -0,0 +1,9 @@
+package de.kuschku.quasseldroid.ui.settings.about
+
+import android.support.annotation.StringRes
+
+data class License(
+  val shortName: String,
+  val fullName: String = shortName,
+  @StringRes val text: Int
+)
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt
index d1127016e..7dcbb7f02 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt
@@ -1,7 +1,28 @@
 package de.kuschku.quasseldroid.ui.settings.app
 
+import android.content.Intent
+import android.view.Menu
+import android.view.MenuItem
+import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.ui.settings.SettingsActivity
+import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsActivity
+import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsActivity
 
-class AppSettingsActivity : SettingsActivity() {
-  override val fragment = AppSettingsFragment()
+class AppSettingsActivity : SettingsActivity(AppSettingsFragment()) {
+  override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+    menuInflater.inflate(R.menu.activity_settings, menu)
+    return super.onCreateOptionsMenu(menu)
+  }
+
+  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
+    R.id.action_about   -> {
+      startActivity(Intent(applicationContext, AboutSettingsActivity::class.java))
+      true
+    }
+    R.id.action_crashes -> {
+      startActivity(Intent(applicationContext, CrashSettingsActivity::class.java))
+      true
+    }
+    else                -> super.onOptionsItemSelected(item)
+  }
 }
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt
new file mode 100644
index 000000000..5d21e0bc9
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.settings.crash
+
+import de.kuschku.quasseldroid.ui.settings.SettingsActivity
+
+class CrashSettingsActivity : SettingsActivity(CrashSettingsFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt
new file mode 100644
index 000000000..fb2f41473
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt
@@ -0,0 +1,169 @@
+package de.kuschku.quasseldroid.ui.settings.crash
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.os.Handler
+import android.os.HandlerThread
+import android.support.v4.view.ViewCompat
+import android.support.v7.recyclerview.extensions.ListAdapter
+import android.support.v7.util.DiffUtil
+import android.support.v7.widget.DividerItemDecoration
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.view.*
+import android.widget.TextView
+import butterknife.BindView
+import butterknife.ButterKnife
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import de.kuschku.malheur.data.Report
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.util.helper.fromJson
+import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
+import org.threeten.bp.Instant
+import org.threeten.bp.ZoneId
+import org.threeten.bp.format.DateTimeFormatter
+import java.io.File
+
+class CrashSettingsFragment : ServiceBoundFragment() {
+  @BindView(R.id.list)
+  lateinit var list: RecyclerView
+
+  private lateinit var handlerThread: HandlerThread
+  private lateinit var handler: Handler
+
+  private var gson: Gson? = null
+  private var crashDir: File? = null
+  private var adapter: CrashAdapter? = null
+
+  override fun onAttach(context: Context?) {
+    super.onAttach(context)
+    handlerThread = HandlerThread("CrashSettings")
+    handlerThread.start()
+    handler = Handler(handlerThread.looper)
+  }
+
+  override fun onDetach() {
+    super.onDetach()
+    handlerThread.quit()
+  }
+
+  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                            savedInstanceState: Bundle?): View? {
+    val view = inflater.inflate(R.layout.fragment_crash, container, false)
+    ButterKnife.bind(this, view)
+
+    setHasOptionsMenu(true)
+
+    this.adapter = CrashAdapter()
+    this.crashDir = File(requireContext().cacheDir, "crashes")
+    this.gson = GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create()
+
+    list.layoutManager = LinearLayoutManager(context)
+    list.adapter = adapter
+    list.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL))
+    ViewCompat.setNestedScrollingEnabled(list, false)
+
+    handler.post {
+      val crashDir = this.crashDir
+      val gson = this.gson
+
+      if (crashDir != null && gson != null) {
+        val list: List<Pair<Report, String>> = crashDir.listFiles()
+          .map { it.readText() }
+          .map { Pair<Report, String>(gson.fromJson(it), it) }
+          .sortedByDescending { it.first.environment?.crashTime }
+
+        requireActivity().runOnUiThread {
+          this.adapter?.submitList(list)
+        }
+      }
+    }
+    return view
+  }
+
+  class CrashAdapter : ListAdapter<Pair<Report, String>, CrashAdapter.CrashViewHolder>(
+    object : DiffUtil.ItemCallback<Pair<Report, String>>() {
+      override fun areItemsTheSame(oldItem: Pair<Report, String>?, newItem: Pair<Report, String>?) =
+        oldItem?.second == newItem?.second
+
+      override fun areContentsTheSame(oldItem: Pair<Report, String>?,
+                                      newItem: Pair<Report, String>?) =
+        oldItem == newItem
+    }
+  ) {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CrashViewHolder(
+      LayoutInflater.from(parent.context).inflate(R.layout.widget_crash, parent, false)
+    )
+
+    override fun onBindViewHolder(holder: CrashViewHolder, position: Int) {
+      val (report, data) = getItem(position)
+      holder.bind(report, data)
+    }
+
+    class CrashViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+      @BindView(R.id.crash_time)
+      lateinit var crashTime: TextView
+
+      @BindView(R.id.version_name)
+      lateinit var versionName: TextView
+
+      @BindView(R.id.error)
+      lateinit var error: TextView
+
+      var item: Report? = null
+      var data: String? = null
+
+      private val dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")
+
+      init {
+        ButterKnife.bind(this, itemView)
+        itemView.setOnClickListener {
+          data?.let {
+            val intent = Intent(Intent.ACTION_SEND)
+            intent.type = "application/json"
+            intent.putExtra(Intent.EXTRA_TEXT, it)
+            itemView.context.startActivity(
+              Intent.createChooser(
+                intent,
+                itemView.context.getString(R.string.label_share_crashreport)
+              )
+            )
+          }
+        }
+      }
+
+      fun bind(item: Report, data: String) {
+        this.item = item
+        this.data = data
+
+        this.crashTime.text = item.environment?.crashTime?.let {
+          dateTimeFormatter.format(Instant.ofEpochMilli(it).atZone(ZoneId.systemDefault()))
+        }
+        this.versionName.text = "${item.application?.versionName}"
+        this.error.text = "${item.crash?.exception?.lines()?.firstOrNull()}"
+      }
+    }
+  }
+
+  override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
+    inflater?.inflate(R.menu.activity_crashes, menu)
+    super.onCreateOptionsMenu(menu, inflater)
+  }
+
+  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
+    R.id.action_delete_all -> {
+      runInBackground {
+        File(requireContext().cacheDir, "crashes").listFiles().forEach {
+          it.delete()
+        }
+        requireActivity().runOnUiThread {
+          this.adapter?.submitList(emptyList())
+        }
+      }
+      true
+    }
+    else                   -> super.onOptionsItemSelected(item)
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt
new file mode 100644
index 000000000..3cb243e5f
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt
@@ -0,0 +1,10 @@
+package de.kuschku.quasseldroid.ui.settings.crash
+
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module
+abstract class CrashSettingsFragmentProvider {
+  @ContributesAndroidInjector
+  abstract fun bindAppSettingsFragment(): CrashSettingsFragment
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt
new file mode 100644
index 000000000..aa455d511
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt
@@ -0,0 +1,19 @@
+package de.kuschku.quasseldroid.ui.settings.license
+
+import android.os.Bundle
+import de.kuschku.quasseldroid.ui.settings.SettingsActivity
+
+class LicenseSettingsActivity : SettingsActivity() {
+  private lateinit var arguments: Bundle
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    arguments = intent.extras
+    super.onCreate(savedInstanceState)
+  }
+
+  override fun fragment(): LicenseSettingsFragment {
+    val fragment = LicenseSettingsFragment()
+    fragment.arguments = arguments
+    return fragment
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt
new file mode 100644
index 000000000..5e5fe63c9
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt
@@ -0,0 +1,35 @@
+package de.kuschku.quasseldroid.ui.settings.license
+
+import android.os.Bundle
+import android.text.Html
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import butterknife.BindView
+import butterknife.ButterKnife
+import dagger.android.support.DaggerFragment
+import de.kuschku.quasseldroid.R
+
+class LicenseSettingsFragment : DaggerFragment() {
+  @BindView(R.id.name)
+  lateinit var name: TextView
+
+  @BindView(R.id.text)
+  lateinit var text: TextView
+
+  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                            savedInstanceState: Bundle?): View? {
+    val view = inflater.inflate(R.layout.fragment_license, container, false)
+    ButterKnife.bind(this, view)
+
+    name.text = arguments?.getString("license_name")
+
+    val textResource = arguments?.getInt("license_text", 0) ?: 0
+    if (textResource != 0) {
+      text.text = Html.fromHtml(getString(textResource))
+    }
+
+    return view
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt
new file mode 100644
index 000000000..03c5df1fe
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt
@@ -0,0 +1,10 @@
+package de.kuschku.quasseldroid.ui.settings.license
+
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module
+abstract class LicenseSettingsFragmentProvider {
+  @ContributesAndroidInjector
+  abstract fun bindLicenseSettingsFragment(): LicenseSettingsFragment
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt
index b5677d016..224609628 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt
@@ -136,7 +136,7 @@ class AccountEditActivity : AppCompatActivity() {
   }
 
   override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
-    R.id.delete -> {
+    R.id.action_delete -> {
       AlertDialog.Builder(this)
         .setTitle("Delete?")
         .setMessage("Are you sure?")
@@ -161,7 +161,7 @@ class AccountEditActivity : AppCompatActivity() {
         .show()
       true
     }
-    R.id.save   -> {
+    R.id.action_save   -> {
       if (isValid) {
         val it = account
         if (it != null) {
@@ -179,6 +179,6 @@ class AccountEditActivity : AppCompatActivity() {
       }
       true
     }
-    else        -> super.onOptionsItemSelected(item)
+    else               -> super.onOptionsItemSelected(item)
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/helper/GsonHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/helper/GsonHelper.kt
new file mode 100644
index 000000000..c760c8a60
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/helper/GsonHelper.kt
@@ -0,0 +1,7 @@
+package de.kuschku.quasseldroid.util.helper
+
+import com.google.gson.Gson
+import java.io.File
+
+inline fun <reified T> Gson.fromJson(file: File) = this.fromJson(file.reader(), T::class.java)
+inline fun <reified T> Gson.fromJson(text: String) = this.fromJson(text, T::class.java)
\ No newline at end of file
diff --git a/app/src/main/res/layout-sw720dp/activity_settings.xml b/app/src/main/res/layout-sw720dp/activity_settings.xml
index 42e160571..9ddcca650 100644
--- a/app/src/main/res/layout-sw720dp/activity_settings.xml
+++ b/app/src/main/res/layout-sw720dp/activity_settings.xml
@@ -1,8 +1,9 @@
 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
+  xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
-  android:background="#eeeeee"
+  android:background="?attr/colorBackgroundSecondary"
   android:fitsSystemWindows="true"
   android:orientation="vertical">
 
@@ -22,7 +23,7 @@
         android:layout_width="match_parent"
         android:layout_height="?attr/actionBarSize"
         app:contentInsetStartWithNavigation="0dp"
-        app:popupTheme="@style/Widget.PopupOverlay" />
+        app:popupTheme="?attr/actionBarPopupTheme" />
 
     </android.support.design.widget.AppBarLayout>
 
@@ -32,6 +33,7 @@
       android:layout_gravity="center_horizontal"
       android:layout_marginBottom="32dp"
       android:layout_marginTop="-64dp"
+      android:background="?attr/colorBackgroundCard"
       android:clipToPadding="false"
       app:cardElevation="4dp">
 
@@ -43,7 +45,8 @@
         <FrameLayout
           android:id="@+id/fragment_container"
           android:layout_width="match_parent"
-          android:layout_height="wrap_content" />
+          android:layout_height="wrap_content"
+          tools:layout="@layout/fragment_about" />
       </android.support.v4.widget.NestedScrollView>
     </android.support.v7.widget.CardView>
 
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index a42c0cb50..8ed200484 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -21,14 +21,20 @@
         android:layout_width="match_parent"
         android:layout_height="?attr/actionBarSize"
         app:contentInsetStartWithNavigation="0dp"
-        app:popupTheme="@style/Widget.PopupOverlay" />
+        app:popupTheme="?attr/actionBarPopupTheme" />
 
     </android.support.design.widget.AppBarLayout>
 
-    <FrameLayout
-      android:id="@+id/fragment_container"
-      android:layout_width="fill_parent"
-      android:layout_height="fill_parent" />
+    <android.support.v4.widget.NestedScrollView
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:scrollbars="vertical">
+
+      <FrameLayout
+        android:id="@+id/fragment_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+    </android.support.v4.widget.NestedScrollView>
   </LinearLayout>
 
 </android.support.v4.widget.DrawerLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
new file mode 100644
index 000000000..f7a76b384
--- /dev/null
+++ b/app/src/main/res/layout/fragment_about.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:orientation="vertical">
+
+  <include layout="@layout/layout_about_header" />
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="?listPreferredItemHeight"
+    android:orientation="vertical">
+
+    <TextView
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:gravity="center_vertical"
+      android:minHeight="?android:attr/listPreferredItemHeightSmall"
+      android:paddingBottom="8dp"
+      android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
+      android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+      android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+      android:paddingStart="?android:attr/listPreferredItemPaddingLeft"
+      android:paddingTop="8dp"
+      android:text="@string/label_contributors"
+      android:textColor="?colorAccent"
+      android:textSize="16sp"
+      android:textStyle="bold" />
+
+    <android.support.v7.widget.RecyclerView
+      android:id="@+id/contributors"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      tools:itemCount="5"
+      tools:listitem="@layout/widget_contributor" />
+
+  </LinearLayout>
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="?listPreferredItemHeight"
+    android:orientation="vertical">
+
+    <TextView
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:gravity="center_vertical"
+      android:minHeight="?android:attr/listPreferredItemHeightSmall"
+      android:paddingBottom="8dp"
+      android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
+      android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+      android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+      android:paddingStart="?android:attr/listPreferredItemPaddingLeft"
+      android:paddingTop="8dp"
+      android:text="@string/label_libraries"
+      android:textColor="?colorAccent"
+      android:textSize="16sp"
+      android:textStyle="bold" />
+
+    <android.support.v7.widget.RecyclerView
+      android:id="@+id/libraries"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      tools:listitem="@layout/widget_library" />
+
+  </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_crash.xml b/app/src/main/res/layout/fragment_crash.xml
new file mode 100644
index 000000000..d84e8ff1d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_crash.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
+  android:id="@+id/list"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_license.xml b/app/src/main/res/layout/fragment_license.xml
new file mode 100644
index 000000000..26a12b053
--- /dev/null
+++ b/app/src/main/res/layout/fragment_license.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:scrollbars="vertical">
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:padding="16dp">
+
+    <TextView
+      android:id="@+id/name"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:layout_marginBottom="8dp"
+      android:textAppearance="@style/TextAppearance.AppCompat.Title"
+      tools:text="Apache-2.0" />
+
+    <TextView
+      android:id="@+id/text"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      tools:text="@string/license_apache_2" />
+  </LinearLayout>
+</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_about_header.xml b/app/src/main/res/layout/layout_about_header.xml
new file mode 100644
index 000000000..eb6fcbdec
--- /dev/null
+++ b/app/src/main/res/layout/layout_about_header.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:app="http://schemas.android.com/apk/res-auto"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:orientation="vertical"
+  android:paddingEnd="?listPreferredItemPaddingRight"
+  android:paddingLeft="?listPreferredItemPaddingLeft"
+  android:paddingRight="?listPreferredItemPaddingRight"
+  android:paddingStart="?listPreferredItemPaddingLeft"
+  android:paddingTop="?listPreferredItemHeight">
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal">
+
+    <android.support.v7.widget.AppCompatImageView
+      android:layout_width="?actionBarSize"
+      android:layout_height="?actionBarSize"
+      android:layout_gravity="center"
+      android:layout_marginEnd="?listPreferredItemPaddingRight"
+      android:layout_marginRight="?listPreferredItemPaddingRight"
+      app:srcCompat="@mipmap/ic_launcher_legacy" />
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:layout_gravity="center"
+      android:orientation="vertical">
+
+      <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/app_name"
+        android:textAppearance="@style/TextAppearance.AppCompat.Title" />
+
+      <TextView
+        android:id="@+id/version"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="@style/TextAppearance.AppCompat.Small"
+        tools:text="v0.3.0-310-ge2d1d05" />
+    </LinearLayout>
+  </LinearLayout>
+
+  <android.support.v7.widget.ButtonBarLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginBottom="8dp"
+    android:layout_marginTop="8dp"
+    android:orientation="horizontal">
+
+    <Button
+      android:id="@+id/action_website"
+      style="@style/Widget.Button.Colored"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:text="@string/label_website" />
+
+    <Button
+      android:id="@+id/action_github"
+      style="@style/Widget.Button"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:text="@string/label_github" />
+
+  </android.support.v7.widget.ButtonBarLayout>
+
+  <TextView
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginLeft="4dp"
+    android:layout_marginRight="4dp"
+    android:text="@string/app_description_long" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/preference_vertical.xml b/app/src/main/res/layout/preference_vertical.xml
index 0d382f7c3..f2bd7b80d 100644
--- a/app/src/main/res/layout/preference_vertical.xml
+++ b/app/src/main/res/layout/preference_vertical.xml
@@ -64,7 +64,7 @@
       android:layout_height="wrap_content"
       android:ellipsize="marquee"
       android:singleLine="true"
-      android:textColor="?android:attr/textColorPrimary"
+      android:textColor="?colorTextPrimary"
       android:textSize="16sp"
       tools:text="Font Size" />
 
@@ -74,7 +74,7 @@
       android:layout_height="wrap_content"
       android:maxLines="10"
       android:textAppearance="?android:attr/textAppearanceSmall"
-      android:textColor="?android:attr/textColorSecondary" />
+      android:textColor="?colorTextSecondary" />
 
     <LinearLayout
       android:id="@android:id/widget_frame"
diff --git a/app/src/main/res/layout/widget_contributor.xml b/app/src/main/res/layout/widget_contributor.xml
new file mode 100644
index 000000000..dd0b1b87a
--- /dev/null
+++ b/app/src/main/res/layout/widget_contributor.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:background="?android:attr/selectableItemBackground"
+  android:focusable="true"
+  android:gravity="center_vertical"
+  android:minHeight="?android:attr/listPreferredItemHeightSmall"
+  android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
+  android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+  android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+  android:paddingStart="?android:attr/listPreferredItemPaddingLeft"
+  tools:showIn="@layout/fragment_about">
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingBottom="16dp"
+    android:paddingTop="16dp">
+
+    <TextView
+      android:id="@+id/name"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:ellipsize="marquee"
+      android:singleLine="true"
+      android:textColor="?colorTextPrimary"
+      android:textSize="16sp"
+      tools:text="@sample/contributors.json/data/name" />
+
+    <TextView
+      android:id="@+id/nickname"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:textAppearance="?android:attr/textAppearanceSmall"
+      android:textColor="?colorTextSecondary"
+      tools:text="@sample/contributors.json/data/nickname" />
+
+    <TextView
+      android:id="@+id/description"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:textAppearance="?android:attr/textAppearanceSmall"
+      android:textColor="?colorTextSecondary"
+      tools:text="@sample/contributors.json/data/description" />
+  </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_crash.xml b/app/src/main/res/layout/widget_crash.xml
new file mode 100644
index 000000000..3bc5b9d83
--- /dev/null
+++ b/app/src/main/res/layout/widget_crash.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:background="?android:attr/selectableItemBackground"
+  android:focusable="true"
+  android:gravity="center_vertical"
+  android:minHeight="?android:attr/listPreferredItemHeightSmall"
+  android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
+  android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+  android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+  android:paddingStart="?android:attr/listPreferredItemPaddingLeft">
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingBottom="16dp"
+    android:paddingTop="16dp">
+
+    <TextView
+      android:id="@+id/crash_time"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:ellipsize="marquee"
+      android:singleLine="true"
+      android:textColor="?colorTextPrimary"
+      android:textSize="16sp" />
+
+    <TextView
+      android:id="@+id/version_name"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:textAppearance="?android:attr/textAppearanceSmall"
+      android:textColor="?colorTextPrimary" />
+
+    <TextView
+      android:id="@+id/error"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:textAppearance="?android:attr/textAppearanceSmall"
+      android:textColor="?colorTextSecondary" />
+  </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_library.xml b/app/src/main/res/layout/widget_library.xml
new file mode 100644
index 000000000..3aef66275
--- /dev/null
+++ b/app/src/main/res/layout/widget_library.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:background="?android:attr/selectableItemBackground"
+  android:focusable="true"
+  android:gravity="center_vertical"
+  android:minHeight="?android:attr/listPreferredItemHeightSmall"
+  android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
+  android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+  android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+  android:paddingStart="?android:attr/listPreferredItemPaddingLeft"
+  tools:showIn="@layout/fragment_about">
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingBottom="16dp"
+    android:paddingTop="16dp">
+
+    <TextView
+      android:id="@+id/name"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:ellipsize="marquee"
+      android:singleLine="true"
+      android:textColor="?colorTextPrimary"
+      android:textSize="16sp"
+      tools:text="@sample/libraries.json/data/name" />
+
+    <TextView
+      android:id="@+id/version"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:textAppearance="?android:attr/textAppearanceSmall"
+      android:textColor="?colorTextSecondary"
+      tools:text="@sample/libraries.json/data/version" />
+
+    <TextView
+      android:id="@+id/license"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:textAppearance="?android:attr/textAppearanceSmall"
+      android:textColor="?colorTextSecondary"
+      tools:text="@sample/libraries.json/data/license/shortName" />
+  </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_crashes.xml b/app/src/main/res/menu/activity_crashes.xml
new file mode 100644
index 000000000..6191d5b80
--- /dev/null
+++ b/app/src/main/res/menu/activity_crashes.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+  <item
+    android:id="@+id/action_delete_all"
+    android:title="@string/label_delete_all" />
+</menu>
diff --git a/app/src/main/res/menu/activity_main.xml b/app/src/main/res/menu/activity_main.xml
index 5d9cfcb50..214b44fcd 100644
--- a/app/src/main/res/menu/activity_main.xml
+++ b/app/src/main/res/menu/activity_main.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
   <item
-    android:id="@+id/filter_messages"
+    android:id="@+id/action_filter_messages"
     android:title="@string/label_filter_messages" />
   <item
-    android:id="@+id/settings"
+    android:id="@+id/action_settings"
     android:title="@string/label_settings" />
   <item
-    android:id="@+id/disconnect"
+    android:id="@+id/action_disconnect"
     android:title="@string/label_disconnect" />
 </menu>
diff --git a/app/src/main/res/menu/activity_settings.xml b/app/src/main/res/menu/activity_settings.xml
new file mode 100644
index 000000000..391c758fa
--- /dev/null
+++ b/app/src/main/res/menu/activity_settings.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+  <item
+    android:id="@+id/action_crashes"
+    android:title="@string/label_crashes" />
+  <item
+    android:id="@+id/action_about"
+    android:title="@string/label_about" />
+</menu>
diff --git a/app/src/main/res/menu/editor.xml b/app/src/main/res/menu/editor.xml
index 3add5e54e..a5e677112 100644
--- a/app/src/main/res/menu/editor.xml
+++ b/app/src/main/res/menu/editor.xml
@@ -2,43 +2,8 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
-    android:id="@+id/format_bold"
-    android:icon="@drawable/ic_format_bold"
-    android:title="@string/label_bold"
-    app:showAsAction="always" />
-  <item
-    android:id="@+id/format_italic"
-    android:icon="@drawable/ic_format_italic"
-    android:title="@string/label_italic"
-    app:showAsAction="always" />
-  <item
-    android:id="@+id/format_underline"
-    android:icon="@drawable/ic_format_underline"
-    android:title="@string/label_underline"
-    app:showAsAction="always" />
-  <item
-    android:id="@+id/format_strikethrough"
-    android:icon="@drawable/ic_format_strikethrough"
-    android:title="@string/label_strikethrough"
-    app:showAsAction="always" />
-  <item
-    android:id="@+id/format_monospace"
-    android:icon="@drawable/ic_format_monospace"
-    android:title="@string/label_monospace"
-    app:showAsAction="always" />
-  <item
-    android:id="@+id/format_foreground"
-    android:icon="@drawable/ic_format_foreground"
-    android:title="@string/label_foreground"
-    app:showAsAction="always" />
-  <item
-    android:id="@+id/format_background"
-    android:icon="@drawable/ic_format_background"
-    android:title="@string/label_background"
-    app:showAsAction="always" />
-  <item
-    android:id="@+id/format_clear"
-    android:icon="@drawable/ic_format_clear"
-    android:title="@string/label_clear_formatting"
+    android:id="@+id/action_input_history"
+    android:icon="@drawable/ic_history"
+    android:title="@string/label_input_history"
     app:showAsAction="always" />
 </menu>
\ No newline at end of file
diff --git a/app/src/main/res/menu/formatting.xml b/app/src/main/res/menu/formatting.xml
new file mode 100644
index 000000000..3add5e54e
--- /dev/null
+++ b/app/src/main/res/menu/formatting.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:app="http://schemas.android.com/apk/res-auto">
+  <item
+    android:id="@+id/format_bold"
+    android:icon="@drawable/ic_format_bold"
+    android:title="@string/label_bold"
+    app:showAsAction="always" />
+  <item
+    android:id="@+id/format_italic"
+    android:icon="@drawable/ic_format_italic"
+    android:title="@string/label_italic"
+    app:showAsAction="always" />
+  <item
+    android:id="@+id/format_underline"
+    android:icon="@drawable/ic_format_underline"
+    android:title="@string/label_underline"
+    app:showAsAction="always" />
+  <item
+    android:id="@+id/format_strikethrough"
+    android:icon="@drawable/ic_format_strikethrough"
+    android:title="@string/label_strikethrough"
+    app:showAsAction="always" />
+  <item
+    android:id="@+id/format_monospace"
+    android:icon="@drawable/ic_format_monospace"
+    android:title="@string/label_monospace"
+    app:showAsAction="always" />
+  <item
+    android:id="@+id/format_foreground"
+    android:icon="@drawable/ic_format_foreground"
+    android:title="@string/label_foreground"
+    app:showAsAction="always" />
+  <item
+    android:id="@+id/format_background"
+    android:icon="@drawable/ic_format_background"
+    android:title="@string/label_background"
+    app:showAsAction="always" />
+  <item
+    android:id="@+id/format_clear"
+    android:icon="@drawable/ic_format_clear"
+    android:title="@string/label_clear_formatting"
+    app:showAsAction="always" />
+</menu>
\ No newline at end of file
diff --git a/app/src/main/res/menu/input_panel.xml b/app/src/main/res/menu/input_panel.xml
deleted file mode 100644
index af252a356..000000000
--- a/app/src/main/res/menu/input_panel.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-  xmlns:app="http://schemas.android.com/apk/res-auto">
-  <item
-    android:id="@+id/input_history"
-    android:icon="@drawable/ic_history"
-    android:title="@string/label_input_history"
-    app:showAsAction="always" />
-</menu>
\ No newline at end of file
diff --git a/app/src/main/res/menu/setup_edit_account.xml b/app/src/main/res/menu/setup_edit_account.xml
index 06155b5aa..93611a841 100644
--- a/app/src/main/res/menu/setup_edit_account.xml
+++ b/app/src/main/res/menu/setup_edit_account.xml
@@ -2,11 +2,11 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
-    android:id="@+id/save"
+    android:id="@+id/action_save"
     android:title="@string/label_save"
     app:showAsAction="ifRoom" />
   <item
-    android:id="@+id/delete"
+    android:id="@+id/action_delete"
     android:icon="@drawable/ic_delete"
     android:title="@string/label_delete"
     app:iconTint="#fff"
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-hdpi/ic_launcher_legacy.png
new file mode 100644
index 0000000000000000000000000000000000000000..f38fcf4b41832598338e5c4a1dda5d484be62199
GIT binary patch
literal 3983
zcmV;A4{-2_P)<h;3K|Lk000e1NJLTq002k;002k`1^@s6RqeA!00004b3#c}2nYxW
zd<bNS00009a7bBm000Tt000Tt0mq=ZtpET38FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H14-82}K~#90?VEXwUDbWZKj+@J&Tfyl@fI6n5}U;V%;tb0r6ekC
zVgrp4rD+tkQWS)frb0y`lmyy;+L90=3{_D}2~iq{kU$V_%o@N5j9ml83)sdU@AhNH
zp7qVV<(^;vxcl~IhD2(K=l66q_nmw0`TfrK{I>HuZ(x!pX_6*sk|t@ACTWr;X_6-C
zcTTF&vsM4_=3HY+*Gj`uZEmB59{1o{kTC@iV~jo)+R|8Kj3Y*4URHDf4Mv86!GR;M
zy!PG8k3sVLX#lAk?%TVnmT7-%xGpUs_UjTEA~vGaK_bs2@M7ql2IIM}NT4CeKW&`x
z@O7J&g62E}nOg77FWhnNGjWL^6K!zYPg%u(>L0GRq|Bw^<Qh$8ETLm;LgPqEyZ=`L
ztCPkzNT-Hrn_BGnM_?mRi#|^S$Sl{4Gh7z2vB%IPzrUn{V9!HiBFt_#>1tCn<qZIa
zMm5I<grog+v>3RG9)xy0+T`<12FC?+prSqrm`ng5qh@I{Y228ZjrBdc>Y|y|ZgB0=
z9G_X-#Ch|J<g-Si5S5zdo$fN5_KfiK_EAm@2q?qh;hS?3@2EzHWePXfEHQyZA<_Us
zbR3;@O&R;Uh{e)bCSP0G&Xr5sFdBsihw@p2ix;<W@!}T#`j6m+cl&wh<pFjc*PskX
zrm;;nO@qb`Aq@Z`#aAQ=;Py!tP-x8yxBX!otCx46#sN$c849jBubr#UZRh82^zzTo
z4l-C(*yfkubW$l{;Tyb{u0cdSNZ^@{_f2LfoZV&cy)`qKJvE;$#RSMuu;#K(R-Dz$
zHy=CB_L3l|RI>|5xW-OCiP8b`Mo1nsZSWvCm!Fa0dpC7a%q9DndcDrk4~N)ubddgX
zoxUO4M|QMiX>ZD~cup&`r?rsD#KoN3S>Um+&tvV64)f}Mji0f^B0;jW<I=Wqn3xwj
zlT<VL6+pObfyw<hcahD+!6}c7^2+~|c;dAayuN3My2>J!Mmc^`YYiEN=sH)O)x`Cm
znZ?TUX42eL2#wQ}H+kr*^Z2WW5AgbdAV_KQrueI*`8$;65t^2Lr+YZAG3nYA1ZUw?
z_~|Y4Y08_CKEmc5$GPvxZr(XqK^b{43_QoA98(c-7RExfMyv|wEGTgM>V;f-_AFGy
zkqwU2x$eGwboZM`a7rPwYiwQz?p@prl%q3F)_t5PCeh2ib#>SAR3f;ajA3!_jk99l
z)arHC|7Jg5xo<b`9M-5zGniRW83e<=JT{K=RT-3-#mF|Z{eZ>I_rAyam-bPs*F$5s
z7Bl?t&u3#=m5^Mvz$DBg;Yy)&fJ8!<b}n(UWUpP@e-Qy~@s&%OIBRw>G?ry)9(-yK
z-~Gt}R4$J)bDq`+Ish~Y69P~uGl!AO^X<pFdEl43Z8Hqe()lfX_0l3zt=O{Z;KKPq
zC+#y~fTF`iS4PB%W`W7H=PbT<^~~5vPi;ELL;rOg%%Yd**`Vv#Lb%*?fSY!;$}myc
zCVsf#7*B3G5aYA<Pv+6VAk?ZMxkR*Y0Xo?JTWFAu3LelHov=Du>fC%;E5(RuZQp;A
zJJ%mXG6hg3h;mF-LYPYck+20vOdJDc7P$S9z3kZE8{*Ym$nY0ePKWXk)NB4?5}bqY
zCW6<50gBqFXi4--E(4`4uD@t%WC-EkpF4<U87O501P<zlD`2t_*xKXXJ4<31)Qvpr
zHgv}(x8{m2s8`V=!$_@)cC{zQhY0@(0u)C$Vq&3{(VRaw%d9EkFuZklFHgVO3(5>Y
z6E;|P(n;p*^Yx_izZ(Y6Y&pr+-8~_mvpb8Nzp#kX7BVsd^?C#6><;-m04Uj6I~=sd
zC5xJ3V{F`33OMA5&5Iyfhrc(7GPd^O`xF$)$nooKr5N88pK3?6g%%4LEhAPvBy-$-
zq~g=qNhg_7qVSf*x$`5DOKV<wyT>-I1T7Sam|0XqbrhWFs)JGn&u=YZMIzd=Gusfc
z?EYGVt4WE$CaR_51Spu>Bt<cIaJ!$y!s%gvN`0do>aByjPYOBYh=YzjPnFm69snrl
z?x|BcH5%%(Xl4^)S>D2E%R)v+ka{iEGSX;VyZJGj1*WxTLrtYqRVSo}(|<2|`LBlV
zqvK1cuSA|Hz@XGON>`_E;+<`I1dR$Y(on4+S-><KO)*620J(#^f1-j1?zOfkM8f;Y
z!3tV~Qhv{<I!EP;@rY?sa4f&6cd#1j)l|sXrsZmfQXmS^7E~*c%XuIr$q}SffPAw~
ze?2(WYF$&z`AnM%nUG3E)i|yVH2xk4%ux+&DTJp{sac-C^t)=OzlLfR$!5U_FKQBv
z)5M~ai}r=Va+PAv_d_!}3g86wI5^?EbZ~5QEanw83u=}SDv)7M*yiQaz_6`RqBU;m
z(tgu<S8R~T=IqUK18Pt(OHk(&ZPFqf`f!999X>!^QwwBFsC{J35mtP%l{;@blO^-o
zu(a^njvns%@m{)16>vOE-c)pTh6BW*(lA;CLwwEkEK&qf1}L$&B-u<uO&V7o<cAmn
z_krgM_8lJ%y<f<gtXR?>3e9QT3pav$TNu%tJHN=Iw|$zW^V?7gGN$6n^QQB&J1(H5
z;3fu|%g^p0pAAoN@6kbjY98Ns`hW=3YM|4PCC9zh@be+tKlzifm3Pbj!PpR=yKn{~
z7TWoQw-DjnDpbJ~i!Wb2o2(fZZ)QiHFJ9DXn~%2m{PG#GKAU%+bZSO1eRV2eK2H%r
zBIT2D0Ti8#w@LL@fPfQLytK2-$Y}UjY1O5(nck{wRf%QA0Zk0$S9V2l{<QQO_Pm)z
zMAw<oW^&z%IiY96qg7tq_95U`4P5YpiMt0Fp@s<n<bV;KOvuCnQ|lS3@#?$bw7-})
z`R1xch_<6js1lHp_Pftd4OF8ddDJ&pLB!&=FD;^w3!B%=Zylp&&~^T9wvNA;g1=zy
zgO3DI%E#S{g(qfL|Nis!6X?i!+KpGu<?<!%v8{!tISHDj1U76vf@Q^1>i(foHoS41
ztInCunk(joo@p&S^87)RGSNy9<@3;@of<+=U$wvX69p*hh#T$2a6o!-SD8)QkA+4t
z4aK@!Kh47FId266KGWwG6jGV|^3@XeJ^n7G-a%@$8ns%D4-WNk+r!&HnLPN7WtfrE
z$KPx_%%*qy?7CB6JL4UKI!s+R<nvG8+oTrl7p&bn9BqsO9n(x*XGxdv__r>gwK*4h
zbfl-uUw;2Bb{-jtv5k!*c8HUDm0UryVo?i&qp)RPKWESD<dMH!&fIC?>Oud|D68+@
z#QTS9h>-!5Q=3zE{-f;gcCFj4P1)fdlv0!)xnhDv`=kw>NZdCCFJ-XfaE*1(?2aXe
zbEY-%#9f#0g^N19_@1bht|xWs(3NVI7k7@ZWnY==R?O$Azh4mpM{CXfPwZgVfihaD
zh=&Xqw76@d?I+4ru{0Duiiwc`jQ1Qcay;-{iC?|e9RsPkkYU}e=kxPBE@0V$Ci_T7
z0^wgGselqtisffb;mPk@%DS}|(v%P9wj#nWUjBdwpFRMN=6EXUMcDvU-UiS2ca2P}
z!CtHZtN{pPq!cPs;MSjXQ_P!OvwU9c9P8pwb@KGxE7*N_fM@@^#4Fo-D4nWs^kfBq
z*;Dh(n38AZIn((3g)>+@w=IbiBErVa`&s+&4#doPKWM<!7F!@(fRwwx7ePFkg7*p2
zNojAI_w_eoKFA(!Y!VUBb#!%@?|=CWZdkdHY{K#JZ$q_uou9q1hj0DMc2u?)IDoV-
z2_8l|_ewdw2<7-500U8qp8vQq(FZk@I<$k1KMa43c2XuP+sxlQwx4(Q_VJDD7SlDo
zW2||Pi;k4~_`%~l_|fx6QJI3HIZjE#6;1)7Y(FFJM%D2M%0A|{eNr^r4pX{`g=U;Q
zM1%awCPSgJMIL=)fM?!*ox5*b#AnZ+Lq}Wl7%wJM-@q_0Y&*=iAKk^t0S#FP9A#?+
z+Q!5NN4%qK8!Oir`DSQucs<XZNE56mN-8Ll_Dva($?;(|!z~ZJ$0w$~&n;g#gNv6;
zXThv?^7&lMNBJTMl}d&E#|C)wy%Ou5`he~e70BelI}C727&=ft6ug51JH$I6I2xl|
zN3H_pj}#iG2Bl11Qrcq^b#jlE4h{?qbNj!&hZs9Kb4HF;E9NkFdNWho@=n1`7^zzH
z_E$LcVVPgOeuUk}D=4kN%%ZYIyeh7%B^p0$i{oEhiQIX3Ig#(O?ejVJyl#R3p{+nv
zNSt=VfrGMn-BC!P1u&sH!k!bFdw+4jUcrosRGs}-HV1W^zbF$$-Y$_UWoIz%;-l>J
zBB&)QU^?Q|eN<Fqg1<_WhQAh11<25q9&Hq+g&~Qhyki5C^ekVn-A2tm9(K?8RW|E&
z5+mzqf(pE=Jz&sI^5>do)Rj2q<mN>hg$=KpMY~~4JEy)WIHa^&M)}x!tg@55X`;u)
z{tDpjcTzL#XrhTAxjbaD0rL-pXac_(a^sTHUJfXLR`%tmm3CjR#DSYVyWsd>d67;F
zN|dvaPNp;ssvr94`oEid!?lMc+x!P8RZQv>OjsxS+e~rNY^Cctv^Ij{#m4efS2=UE
zaD0cjq1-bX!w|Hfb5oXSv!y8R=2R(PPzjhHfTT;G`mYGsKdjE%*Hw)x+yC!q#BBTH
zFMc*#T>P&()7t9gM22!*Az+`(isRV(etb=0qBz#V+b44qSCIc}Qb1wuwRe4Pw7B#U
zE8E@*1pJPlN4hC>8bD)dh5!~&|Cn7hpnQ14Jsa~wJ8v@TeJ8cDlSQ{SWbb2@=cm%>
zV`e%NA`2)V*?7;(O+&l>%&hkIqQyDsb=<ml>U(+u1a=*xeCXHrY-;O&`%kmglP5fI
z+)_xmiXWrjcYweKX{7u4d$)`ZZCPVjeMd!$XIdZqCwRYKq=Av4XYb!yJGuGBOuhFA
zu|tGpI$Zz)8>G>}=kMP(+P`_VS?%ezE1HuU6eJCdl%IQGXJz=U8#1+?edtLa6eR&h
z${T;MYj||)>P)TlzBH&wpN;^54bo_J!vlLe2R2`y87=K#eAVRBjucQh?@M<s1hQjw
pK3&P(cYfTqQ<F4FlXM!;{{mYxTumPJz25);002ovPDHLkV1g*y#7F=D

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-mdpi/ic_launcher_legacy.png
new file mode 100644
index 0000000000000000000000000000000000000000..bfbb5bec79527a8a12b22b711e3b77a098987359
GIT binary patch
literal 2366
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

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_legacy.png
new file mode 100644
index 0000000000000000000000000000000000000000..c467548ffc085b72f2514bea9989ec554dcc80b0
GIT binary patch
literal 5819
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
FV1kp`R|Eh6

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_legacy.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d6d70aaa5c29bf01c84ba9da62de289341a933e
GIT binary patch
literal 10074
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
Y98zQ!?fM)3!@&V$BoxG}L=A)f2dq3fKL7v#

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_legacy.png
new file mode 100644
index 0000000000000000000000000000000000000000..366142e9b7b379249e49bb3184429fad132a89fb
GIT binary patch
literal 14545
zcmcJ0^;aFg^Y_Kw?c(lsp}0eFr-kBhad-ENLveR^r^ThXJG2xn?(QyM-k*Qq`RUn{
zNp`byayB!`?Bq2`q^hzE8Zr?w002Ofla>7PQTF^ti0~izmsMMYj{??3LQWm=<MKr`
zjre#*a+K9}0RV_Z|0AfB2-~5LN<vpDE!VFO=B^$_&Sn4)4-Ymgdm9%MBS$kf2WN|{
zGa(`XfC3;VDX#9Bed_1cNh{^{-ctF@=8)m_$pPOyR6Cv&*A&Y&nc}--5IlD#9~BVS
z#2>!FDltzX+LFt16+2A~_7BiR4^vW7JUj;~%q`5wJe_x<tJAOTob8`JeSkXqykE!p
zX;;g6R-j72{#TdtV_kiH4Zo=h7iEncXin3Sc*@UVsD%H&ZV2JC3OEHXvr*aoR3~g$
zsag9>$LLYoQYk-I<;PENG^G}_=mLZaE$F+q$vc#V-e1WltlC7u0-{9u63Dy5@Ph~F
z#?>Ne&Y@elb6<o<?rV0-BFsg3+1j+PGyhhJ!?!q4Uo|c_1xeyb3WjKR*iF}U`S<_s
zelvz+<Ph(eTcY%TOFhmN?zT7!%HkeM13)NxY&%-!tC>=ycjUI6)bo<4x>|0cd5#yc
zpzYV1IL7V!d|B5jZ2%37DItr(!aS~z`gwe}{<2OpsX|uaP$XLmY_Dni2BK8~Z_`Q=
z{-*NapG;sK_gV&HrK{qwjN?#c^*b(L@e<-J8x*f!*TL$w;H2-Uj3#^c5TQ8%;okII
z{O|HFM1(KF9U@N4!T^@WURWJwUh#yNvS0h{Z@cu_J`1LJ4eoJT3=4>bn;@k~8tZKH
zLF!dtMrP`49}4PPVkJ^q^#RvY{(M<Wp-!cT7BmBK$Sh-E_R#IxS}w0d-fhli&2eQU
z%D0}C)-<RY1NW(pH|xUhk3PeSh*Vt9WwF{;m;pKz@x}2x*z@`*LPh$Ac{%~AM~n{!
zNOm3;2Su<@KGI5x-|8)QA2na#iZLCuldMvp(*5d&Jm0opw!byJ0Or(vW*`R=h+hW|
zFU{k!#O<pCyvG>%e;_AhYyGxn4iy5gw?YlwC{PeWilpc)L!pH3_XY`$O*C|tBw15_
ziXt5kQ)&$yZ)@ci0Cxx2Kl`cmDM|L-dnDq@8zObE$oBL?>mCO;5`OY$Wr2!T{4KBN
z`y-Y|@2sX>d>2ub?b<oUn^>b0t%E+swjvp~4$c4Yi1{yJ1yL$(09es4eBw0*(_NTx
z?zl-(Mak!;F^XAZHrzR*pBM^Tv^>WP5GD~wOc&Y}le)Zmllzb;YELS0dfVeS8IkHs
z^@sW{^cM;9-mw;k%JBC`eiClo{%R^2j_H{klLN*vs8)5X^jc(f#Xi%F`hdQ^DI*wm
z)KOPUd5EkT`rad4PB#X%aaZ%-Pm(XTS_7&Kjn!{}(-;71>1egAvD^q05{)Pvd&sVW
z+$|D&crrO{uZuLFQ9^8kru*heid43fE7mXl8iA#kbSB-!`iAIR7`*CrwZT*v_z*{6
zP%n=7rt3^Kd*-dh>nkbI-~KaO$0}MtdZ{4Riu~j0B&;sJO9`08THcjk$bqTIinu@N
z^9_Y%^k(P0m!7i@hJl|R@6#8m2MX^FuFkU%gZ~K7qcuA4s;kg?dT1r|;EPwf%K@XM
zN@}m&d(L1Sw>8PB^-Z_ma7BT#eDsfRzYosdcZHWj`FHO=QU8Ki1;g2>b<rAxYm1T}
znKXoZHwUddHzIn@-sE9)N-tZHNG~U&*v({Iy_kcDHAQNM+{eR~ucC0ZiUkqqoxh4r
zNgMuT(D^Sk?N;!Yu}^PSa{Fny_{JH+iAJZ3Dh%V*o&Jxu1?5{e*PLG5ZRX8j>uRu$
z)RL}rzgY#VSYF?Shz?34qsCVgu`-f#%vTL9G2Ga=8pK^JRI_bVUhi*2o3tCN?_6v~
zrwBg`jgbj8`ysElTcF-M)IoJ&Q9><z*=W#cbb41*{55g#kfWHcT8J(?{Ap+L6SQPV
z(Z2P=^ZNO)P3(E3VFES4qV{YMt;*-};xFUNZ}zYselv+Y&@QEZ=H?I9XKz9;Lvqik
zs{1#wBZ-ZRxDleBzZfrZ0%h~_q0V(b5eKxJvmv)pOD<SJ)d|!Rv>5yjCKuuhVt+R$
z`5gu~)T;E(684nz<|8~eqlU+j;34yxo4FHbA|@zMnfz47I=P8*t`%YS`uLE-7gS(_
znpT$)eywuSyZ&-Pk-Ka|JoZV5sMRu%q0hb`d9f~M&=H_+x1=yd<G<*jHp<9q`%gx_
zaHFaIRu~Oulp9t8AOSvI5^g<IN$WC=FdUq{j(X?~j~xo1&V!SdXg?oWe|D3-f)1|h
zl>v+iI<4o3^-Cq~_&G>&oKiJm<(Dv3xLfr>V<RQbOyrJzDvR1&7S)Sb$XU#)#%AX{
z$liR{Z^Wc$W!yOT7mE17q*)rD>;=OWK+X<#iy&)4MiH7ToA;1aAwqUZE}XW#qREnh
zRiPqT&w?TeOBqsS@@c4tAHf7QvlQ+xOi3Jy@@an@0fFN#n$Hg#MMxn1JvJ$R@wEFV
z(Ws&x-dWuH+=1QjWH8RVT$G#d^%d>Gxl%WA1Y(m8+D8gA>iNl%j$dGmZ4F;wj#U|!
zEyc3KcSZDBWLWhNp{o+71Y6o?kvtiZJe3^A*j&SbI1yK_HIIHaA)gT=XaM*WrHSr*
zzT2H?=bn(n&)k=+=T}weit)NcOoXBQn#;GH%ciENS$#!^#~@7T6nVH^XF~4&fnFpW
zl~V?zSC=GD+ZAAG6@2l1s4BZ15-O@>NUa3A1?fV#OKe`uZ_QidO<S~3U-Us^tdEr4
zV%H7@*qfZ%?0&O_6LI~mEY$e>OZ2wbzw*tzTTiS*nNK3nf3VCarmX#SNt$FJAw6wX
z$Pf4TY*Gd)GL?U=xfNAZOxpGOONGsR&sz{K9_~1_sp;lX;L$DNARIvZ*B5V(saoG9
zn$-p?)O%YJI9W)b<Is^v=Y1b7pOqIudz6=}hX-|@gQ4B=>6~N#v*t$Sv0=|=LB$pR
zKYyXelV`Q<<*mr_z3@fVh8)!A_IRn^zNYS6q%<931~lmms#k=3Hqr3CZ$WTep$-R3
zm9Xr4r8i5OMF*z0nC4JQuG0mH_x&9t<&FXTj7Ko)@4@AH8O9ew?A+Cm*}Pg{@9X1-
zyScl`SG8n+QZ(3q7)luipLSz_x1o$Mpf?p~^qzR9uv`uQA~h58bgl3P5g&Tn{pAtf
zN*ib_%-bf`WRX%S5XS4{Qc_e@G@f=OG<<xtuU_YbcSIj@0p%|xDP_{QP*N-~3x<_K
z^ZpIbzBN~lhNc2QM+4?iK(^h56ewWm79q|MT{4k~Yvq$+!!9%a)CuOoItL!E8aKDv
zmhw$e(R%2Bn<l6e5`t!a)#>tzbc7h>ETh{BYNnY9EPtG)aG~IqZsLcydsdkMm18A3
zs$_ZE=;)M-65acaGx{(wz2J)7-gI~nX*36DoX&d)z;<uz1B(~5VL<0GPA>-!4U+&U
z63RzPHw^*~2kQ=9ZtRCU&1RrnYNoLbuP*5yoSxb(fpdA8!?Q#jQQ4l40Mgd&)1YQ%
z+@d5MZ&!Nc$WYg6M%X=pLKi9eD;l@{$r?%=eO&%yx@#xS%SR8EzQneg<B3!=BS%lz
zmKsrrg2*+^nZGq|SZeqn3b+#>O`-?_Z2_hOtptEA)B;X|6}r61lJPHFbW>t_MijMy
zp6D|`3LphC<Qt@5SMB%J!~8aN>%-T$?X)<uo|y|o7G{I^AP|e8>Ok6B6JqtZW_qL)
z|JY6iuW+<AC&?4U^LsiRmmF}^okft;YB|cE@>AByb8d6Ktb&lp`#e#CebR*|8qJa~
zy<IT<4+k+T7fbI;fke~&8~l)c{Yu*0qycN<U&VA>aw12XiFVQQRe{0cFeU;$gy|cc
zmqLoUpEGtZM&F5gxECCHb7A_+)tOjZ?wiVPwvV_QD5Jl#>Ss<KcY7u*BhE1C9QT<k
z(7}q~N3dkK6+%Qi9F4|rvvPBXN=ZL^u84|;4mYQPE%_n4y&>>)d_B(K2{i(e{se_m
zM=2jy4HE|j<2%H@4E2Uqct`zMzEo4#;QfzD$Jlw=5VyTV+Ru<8&)V|L{_Y4jrNcrI
zO(a%WP=k;!EP@!l82KeD9SYu(i$>bep;Nh7u7YME@n#2B<h{0J#>+<F@{c+ahOJP@
zz5k<jbe4c(YLX;-I*mx}3cQ13lK1sy7e9_*jaotVsRe4Zla-I9Kso^E1Qd$H`aGQH
zdudhevxiAXN2g=mF-6$*@`f{Gqa*<gD_d)nt(K&E@@Qc%6d$w5G*Lm0+RS{dN}8OF
z+U<OcNKT!7>UzS2W<eqM?uTYM8gKej8#&7O^0MjoFmkI424yY6!Dvmn+f^Q0niG*x
z$M?hPA#8hTvR3{ec{^H}-Xu82Fg7;+SyIMw$iC5^Muw&s6KFl(Gj0{TcakGi5_2a5
zN#}NuUY*n-a7ZaHdm`~kj`he}S^ttGUt+b|<u597UqnzGE&~EVVWx%EFyB)1QA~aL
z=UA7LL{hP&__Obn7oMLAVgtqx)J6?U?H7Fm3;JL6h$t#Gm7?oEKGE_SSz&PrLvdOc
zNU)A|MlFzsr_l-&Lwn)bb{02zQCW)!wNJZ74h;;i{{*(D>ItQdn^pT9QPjT9qJY|J
zbS(KX$CqlAb>W=cd_>iFNRD!Z)RbX%OL%NJ#NB2*;d#@yImV!ZiiTVs_Q_9seyNa4
zwCO3Yk_%Wo+$@{)%0f!%0Y%?;qW%%%IDT6CdvVW`01Xp@$vRhI=u9kwy&+XL(WhON
z=wQO7grg!N8XdRRibwammqoS?<u{2+*IfM*zO-C>qil&&x3_fy36d*6J0;LsDBPwt
z0R4j>^*0yJ{kZn<-KJ96G+YQEMFC>vi6<9DfR6Kp5Nggos_d9Iwb&q$SSJJ%+}Ec;
zz#{vmNOd9t`i>Fs%zwCr3uq*XIHqtM%voCNi0S|1^aN@r5yb(qBG3U*Q~RI0o3RA%
z;|567ULP(>h9L=XTF~m5&=We<&wZgmR4iFjq^_wh%e+B;w~-3<o1-~jWoP(g5Rout
zwfNqPwfU^%t`5+sO_Cno*Z+k@62WZqgV<<AjcZdJw9o695tR5V+o;8+SV4q6y6sj?
zLZymm0Rg{xP~&2G>tq4+Y{!F-Ws@)?i8u?p*x)~zns>6;_mr~QaNqO3Dg`19@BFI(
zMr#^^M4eDj`+HQ**Q3hZQ|%(<?y$pv11j}-|BQFPmSL1&n#)9QlT2WPb<pEZ7&a|1
zPQs0VkqU1YwBt}e#rhKc402PCR85tLc%|_WYer|NjbLTtkIqU!6~J!EFFT?meHp{<
z+l{;bB3J7D&KbI#kIB+!dK3XOP(P>jEqM~~Jc^Mg@&D%1*~M<kU+3<Yf4&o-T`7Is
znszsS&YfL+-QKv-XmI*_>9TP`Pe&DT#Weyl#<5jLcERB}j>A3Z{v_>~od$fR$|5*D
zW)|ncK-6=WHr!fHlQ+}5-zEj6qigNxPGL4%4Za6$X+xZriT3q}z7!l?@vTv!ZxP92
zGR-*sQ-KF*WX4{qi>~>vN$^8!^{wft<jW(~qjH^RQDYpoiD%6O5=T%(E>LV?y)gq4
z#9C@MW6EeOATrIUn_V?Y;7s@-ZaJ2Om@ffVGFQB9^iI}1ct}2=`0>Vq!-vU+ZO@ao
zf&sUVhZK~V5}U*x(jhu7jqs!8#bU$40Ohobxh%w}r;IIZ@oP<zNo{<C03CL3Y<q`n
zwzSI{!!vjjqI5ZmT1Mgl;`!v{^I68_S|pa!a_U8zqKGeP(yu2IhK}gw*udYH^ST~|
z>he6ipelvoP>U%TTlkAx^%7Jqb1^;|3yVjCBJ9<LT<F)bI_UXB_aDUnT5m4M?Sd!+
z6?9bt$W{cRhdoln6@xdf@)Nv0EVg$^V`e*RoYstp+SyKAV1ax+yR!909)!frX!LA{
zKV1l*`x1*Fc9{K<&T4E>rP?y};u-T){Kc{AtN9|tbhMZ!{Hd}=U}ABJe62r@Q<d70
zW4x#^yszeU>L@G)vadr9RQ5RAo(#+9wXM{W^}?tV$q5wpFO#(cNhWn7PHb0F|7ab#
zM+zwbDONqU!uI~2-LN6m%-@$kdlMUH|FOJ5rZo=0c6SzrK{G7nVlrqeL}?50@%_MN
zdVcBB?-=Ok9pUIJ`wZlna;Y1*_y59=U{x~<ST>+sB(_Trd(O=n=;<=OhW5(Yt~Rmg
z7Y2`6)xF9|ij}}>(FK`UW*50;#k5<YV=_hqX6>tKw)M8c7^j6SG@KXqsi$LP|E(8d
z_F+&C@SRdZOXbq*q&0at*^!9MVNN+)M}a|M;k<D)Y+I|_&tfzbCpaKd-65~20RU5)
zIFd)1+C^Nwh+G1WK_jv84nknWX0}OEh3I@{;CbE3ekh9*`jT@vh=TD)`xhSnQ(Z|2
zhl%>sd1A;7BGes^659InsmLE}<>+5e#clCBpWPFzyBS^RcfYHL8^@~qZz<DB>h>Ce
zA$w$T42MSw5|EHk<3Pu&IaBJMo;NvE)cKx?2un13rEL!<y(W75ER#vnfpWdZ+zG%I
zm~J=~#tijDrP*TRkBNCvyai`{J?V_X-<6E?#)_PfMkJOhudJ_hXM6_}l3EeS8;6gZ
zEi}fiS6$V5T98!7;e}EHI@>%x#)0z?b6M%~H3bK@oUKn^M`C)}>}~K$|CtW~q`}c9
z+hUx8Vhg};Y)pN+=tRcCZ3H8^^s-&p8d90c_y{>mm^fEonN(342yJ#>b`r>PS4Gaw
ze%u-mh5AORmDIP)aT-Zux<^?a&>AV)+W-JVmk)P4C_CTSkAf`j8K!9^4p_Wvtciz=
z+%&qm3CgY7NWaFR;OdwBW!7cK%28T&hLwe;ge6<#K_7j-ot;j+u}U1&vO=!AQzvgC
zp}&H?m}z#xR4YuEsERvEJP$&$lHnjk6_dVkP7jh(!8ZYDi<Lm*B17<%yp6ceLv9cR
z>goA%(Qz71Ky)54>d?U9F}P76xKn*Fw--6R!ka!_*Y%~nMCIiNVh5`PVi(492NLQD
zyNPXOW_hDVR68Y~hlXyG3K2uJSQ9dKst>E#urie^51)NhO{D**HSeezcr@FTY38i=
zCu!F}>f4Dd?Hhch#%~KA@^F1!R8%lNB5DUh8HdL=4rMnefWkh(Zh3)T6^b)~HHsXa
zSQnsmlZ5zBTd>~jlF}s--p1ZI{So=vSJ~z_i+k`Ot@n_YvBuBK-f90|-1f;G7o)XL
z3Ql*5o?}L?80|``{cWIF{qRJ%-$$%R?z*JYai`82>%Rmuuz+r|fF|UTTo#+}tuzUk
z;itZU`!gQm*(}h^spKe6U;3-9xh6&G)2!Z4=~q&HbMMDK+JGYB)AjTh5w-6vle6Lu
zYIOvU^0Shr@AfXWCT@aGaEN!Zs<4e0_lt6e7$l`Q#)-URqUG&d@sR@vdWxE?08|Ok
zdHw(&cRELosH9oM>%ksje;G54l(J@`lJGsQo6jXiTgd6Rf=E^+Nec6I&8o$tnF$pI
zHwcu3H(x>KY^S7ylH3<O%W7M(2-C}IqAKCZTFI0p>8=?z`;>=Y(?8^YE^Vx_O)^79
zkvJCLQNHj|StmPE+r>}9z9r=Uo+Fptg+yCY9Z15Ayc=%y*p_x2l37aE%H3xV;U0`W
zl~7m4Wey)lWu{dBI(sR?<U~bDi2k-;E}~>D1<B)&W`cCu0EbVf-Q)Y92=6S829&V^
z9&7TQ=OvZn&XJC$jxC!<No6A+`mbm`tE?WMO;QGd-YBCZ1?n6{)@=L0BYlbTg_PuV
zMCYF@X$Y4$Q}#9?$+2>$t6KB*rqJ@-C=ECRJx7Pm%0`iFog9}fwRbe)UjpZ<^D<u*
z0p1;n3H|DWOApY)MF6UOSHknmV@uWC1;^PoE7`GZD7tihcGVz)Wv;60As|Q}zi0Kq
zZ2D-9Lf>WcyHy!YH;dq!-;dK^&)TXmTE0kG&pt}J(s86z0UUsIJ}}n<8x|NQ#0^SB
zn!^(O<Sc9OQkZyD)6<w>8#w>dYiev3qAtI&72W<9@dsVI#C7O8P7bS=kb2pAoI$*;
zMvc%N-k2$sRCTq+JekY`sD6g`Y>8%qOH5z~f2!QpZtG$irqMZRZnP+A)OUfI;C5s%
zzLHCs<#u~tg=ZB1Rr0*w%Nx{yL!8{%Z6dVF8U<BFKr1L^;n}AxARZ_adVKGHhh~He
zzfMO%1zkm$ug8{+^rdGr10muew;UB7(_~RNnWeH<&E@+6qh&gq?j7fzsl^r<{uVs|
z^MKW{b2A#wv;Ppq@g&iHA}d9v&Dv<)5)Q+bXpo&;Fr?;rOm-)}<@y%il_fjLR(~EP
zJUjlF<w;7~J2;ybcg%Yg6i0|?3KUa5N5m=KgZrMtUdl96PvcPm=|Q0$l?Dt!a8lh(
z`kP11XH_I}g^~u&+lzWAF3#3<gW@{f@b;!_?>$*{XF?m|vZDU0u=jfa)V^-=kPv;M
z;C+_N%C3Ev0MN6lkSX~r6nuXc_*1f*n@FU-wDWE+64b#>$<k8yw-oBY`zXxGqOa(y
z-xdBp*smxmG!~d<i=VP>;iv)GF217KP0T+|WND(rFg@BZ5wVDMg{I}z5W3zh=(m^0
zRS;?Y@uHy|_&u=f-*1-qOm0~qETLns7gY8mw}Sh*@h_kR{a{)?O4FltD-xf<&tC(@
zVbi~f$;hiNAr_P2mwavTxZV9E2C`k&mG@;is8Y^GX>%NB72Yan_QM=%!K&C)u8HT7
z`W!~~ax_oBnb;5~|EDX|1^MA@JvY`Q4PV@}UGhxY+%ZNi>xbM1H$A-x;CExa(>@JY
z0OiOSwan-htI9BER#o;q9w&+c4xKMLYinCg{S{fwtM0@e<pY5~AyagJna&uVk`k%w
zN4g@Cn?Mp=^i#R5DSsv)C6k0uP=th5tu^8j<SZ>Cr8Ts>>IF<P=O6R@SfLK=mP&kx
z8YG$G;~|7O5dsAYf93|H{`raMXb07V;YS@HdCsK=MdFDd>Aq3pDq&8Ny3raFp`21Y
zt815$$j5Uk-(1j<zTmidh;pJv(dwH{aT1_LvmBkD75TQeMi%%+hDP4y>Q?9u_rqEZ
zqqY^Cfn7<f#qCu;B4xoQMwu3ko4dpT?=cj`zgAX^ozYawkxr+Dd^8kInz#TV>nub>
zn`a2%a7X+MZ@ZlJ0%#qd(uED$je%x+q(A@T+9_-Rj}7f$*Z|wmvEniJdYJVM&=(>k
z1Y!u;Ik>pfWS7%B!x0=hspk}HO!$}oqf6Fz(}PzbnF8p5D^LkNr~$WX>8SKJpE6QR
z={x+}ByxMX^DY@KU9{yORUv{8wS8WVX@JjK;17;CQ7t~35cMO6ijkH;Hwu0A!PlT~
zkLyE0Z*0~4{7VhiVS$1?sH2E36H#cmEP|es#G3%BAWZjjgd95iT=<Hd+0WuK(@5wx
zzLoHwOdzxueX3}JI73ad++j_1y4DD8cz5nq@wl{pi3c?WntjfT!o&Q^TA8+ADzRb>
z*NPmO^hPm^Hh<L_=00#up85>^I96S9DIAp}4CO0ATClQ8x-39SoOYKnl8)Yx4RR0}
z<IZP?4iQ3$>ZyNw{4sFbzJ)fNUj}&Cej2b*!KN8i4gz&#nJ7D4IkKy1{WSz2p<_$r
z_M0oLuTc%BIPlRqd0{w^B`2;U$5CNPEpyh<BOYVnQcy~ShVI&sR;&Py#DSdLz+s(Y
z|Hp0<Unhu@?|YYcGV|zN<K68}{T<ryLy1XIDGzB=-_deDYhZyPB6NaSg>iv7jms%d
zkQuTVPVG+0bn``5lxATaeOh_7bIJGfe@!y8@0*_>envo2<6A6N327Ay<@bec#1EHm
zAF4Qf20KFt?XvANx9xI@Q0s35c7u=cRoi;pm*Oqs%%e<})Qa%VEpNS&t%e4%LPCwB
z742d`#``MVB?}qp>oh<kZ}l|W`k6}x9BO!0;H;*(W~Zi1ThvX*K~!=Mxo2&nSR{>B
zA33f^7`6+`U&W9|gCA*4%HHgqG{L0G2=G*PAS3r%K;l$JLvpb0p)@^YR4g5$sT5x<
zmso7KpfY0IEdOTn@b7D|eVZxo(YB3BUv|ixA!6Wj9wBVLxbh$V;;Edi<52I2FxBbD
zw}B&j_cg00tPp__fZTkh<GE_O>#Y}bkGLXC#P<5RNQ7VTDAIn8P3mUK@KkM<V^rPo
zu)0^@GO1@NY=2lyP0kV7z_pJwhhsiV8WtjSNN9uM-*AskbM394cVr~}3l8g6c_rXH
zuI=W2lz^>sm{!R()z6ORNqB<2ei&GcXs$CT$<c5CQK#Wx>>UluaxK(j9&}nVI3Ud1
z?a^;g6#zo=nd8yQKT;a0EXPesE^bWIVI}e(LL#|YW#N~KjqZihuy)0oj-JcGD#Kh)
z%6v>{58*EI6e2(r^O4GH<r{+p+L+flAJa79zk@gBjrvNlN&Ui0#Q3Gz$sYdNUv}*9
zGNsrHW`k<N4<{+~pAm7^<^nx6<gI^)3+7}iQK8neXn`O0*x^AuYne=@nRGm-z=8Yo
zX0&eria>S)Kca8!a%aZEAg;jam-B09Zo2zU(My^J8rNNwti>ET*$|x1pJA9t?_@Ke
zGP_?*5e^0+r2nFOpuU3J;Xgoa&?N%^@L}|k-X7c(V9GkVYQM~B&N#Z7)c<0>N`4~$
z=L2XFX+_xH9*ut1sR{e{9On4wrjkFz1$v%oA7>XLa`4i)(l#9bS${VAnqC_pT~Rr)
zh0Q35+R>e?0)KT+zj3}W0CtS?l80ifgF}A79%^*@E=Qw8C<{Q%RN^BN@fasNAy*V(
z2LKifypa9R8~t|&!!+Ad?g><yOlsr)fr&&e|FO1SYO-%^6o{)=#iaS8P=Z86R^-Rc
z0RW)He|rI9Sp_jRYx4XNi_GG**oFKkMO+3ekZf3foX-H?4iR+C4sdEm8}NGUVkWx@
z=@tjv|5mrv+IuuWUB70+f5}29zkjDD<Os(jGNFMQ(Ir6mKrW>#L(bPb>KJ=ND9fCD
zui2-14y(MWGxAev<LKVR=s~*L8zd9ZinZJ0Ew;lc3&OEVFyW3D8<f#;aYgD(1z##Y
zJP;FWYvlg^{>6rK%r38$>((6{45NBf$T1k~x%<QAq9!go!*hrLP&v<J-{}G{!Gr!J
z{4Y;S;nzmf?^)6mo3{q}>|=2WY`6QSVBEgK;{M3X+!EjW*DXnkZ3_FK^w@ysQ*phQ
zD=)rVvncGrP6WtVP*~Rcoub|wd)($I>DT53>XWw7Ba(A?02mw{%onJQugDs1aj(3M
zA^M99#r#<7IV^?GUmN4eVpp|Ni;qudaGHEEIGhIqMlZbA4Ppfb^ZCt_tiH@P%%p&V
za;pV5mjcCCFRJtb(=eFenGM2U36$%}34ub>=+`SyswM~=K`q)VOVinFiQx<rBe@&y
zS~NUR9Bo`g1HB=pK`L+O=&KL=!s&t*?pym)hm+gg@0+%Iuk*uB=R;}_)7Vk>#)&xH
zpOD3xgI9JaU{MngxNtsyg*JRUyoOZzthmSbUf*4okwimK47vd8U3-eIEn+VK5GPMy
zcefRe^#|&d7_P&xMh<X~N7$RIu?>$#AEqh}Q`pCCWnCo2y1jZ)KK&$%Y(EpStkjS=
zlIzy=^{WbGT8oykrnk4}hmi_gi*P%6N{9jt$qlZX?|$9%fS^GGqGalQHn2v%-L!Cu
z+w^?bY*l1f3nqO7<VglU-8*yjHgF9VLNK=im-ci_i4v_p9yjRFy;(PX*F9Sgr8i_)
zy2C?&Y53gOFmr#>4Cxf9$NT#fP%JP`{WKtV_61o6o`dFYTbcrnm;xz5nts9E(xTOI
z>)%RYQvT-G_YRclGoW0j-JJMGbZ2g!eOR+r1WunHdc$@&N{bU~ydMvuz+vrdP;Y8J
z#AOwtlZcg0drErWF$h3m*du(~g{kXFTYGoj(TQ%h)yB^y1rC&T-IGLEeF1W??VAv8
zgc_(t{C>Mxs$`1^BW(E2OYexrljOCKvi}IHDmXypG%x{E471mcjYO1Q(z_v0+hz3W
zj+Dr5+`wz)!z4GW<V7W=dcaIsZp5mV6Kpvpc7R7TqZ6~0M8~3e7fzF5oJa?_Gl2aS
z%of|4c|NRbe!U#5ElCme`#qpFpMUT`MT7<}-5TV}0o7McWLnkpB&ymD-sdn(ZvGq+
zSvzBC!u+l?x$+XP#P=N(<7kDZ9GgW^sfU}mW)oMIM`M1xVb-kB713*=m+g)?8Hd0?
z3cW~n-W#sEoHFQ#7CjzfjtH#ILEh$@#*(8GHqyL~Ez{MvrG+iC@kCN0vVoZk1`)4o
zI+AS8Q#FL#n{U}rMwwA9L_tK=u#(Zg2m*tsX@pDi;oWRi94#%Afic!!Z1s`PMSZ@d
zSV7<*`%d?za=x#31lTG}a0O0b_rI)Y&)V$K)?9kA4>IddVTSLIi{b5*7~0CuFy!pK
zNL#OBWVXB5bK;oUbTS?~cPNI2hAv}tTQ*x%&{vL9sUz*UC25UQR0)e`kB^QfcvU@z
zL5%Hc#ZUdVrz-lyux3}x!ms4A%mS{@)Ct`a16~qmjsgib5VOJ|?p4=waguq>o{s7L
zbnYr)xi+veR$j-Iy59BQw9S<kjE(2+mEgn5`pD2;ax85PV&lfxPWGJ+X@K^@+1y3$
zx^5uGTkp}p>}ny1pFfiP%^sn)+oX)EoE6$rS<SCCuN*G|oMcOe800I;^CY>EB>wbH
z`W`nSqlPCBN$xA6@2YCDpdCBy<nuZGPOJJ6<LayF00pGRMon)W9LkZQu|^c_;a`q6
z(QlfZ3qf@+Ibw>o1z`9;{{gWq7`s~MsvbQv7<L_f`uKad{BkE`^SS-vC8Q>wo|)NK
zN4^qn6Ht!_KP|VlK(eK&mkT&zSmDt*F6sW9Z_pw4$i72xUv*D#?H84cU`-k>%x7<*
zU~v~w5y%D6=2lPWU-xwYv=2G<juRN)o$R>48Zqqfv3boK>s?h20*UIjdM&~)dxj{5
z8ogj)o=?m1en89eA5qm?J7G)-T9Fy}Ig1+jUHMLA<-|5>a&T}2cJQ3^bFX_MbEm>I
z0Jgk^FF#3PGut`d_-hg+B`!SD=o+>dmhND<VNY~1WfPirkL|RJXna_CP%RxFORrN_
z;87RX1YRB27R3QLTQ#_co7b*?n7wM#Zl85%mEQ$>8lSiCr3;!(*aL}8Sd&eNSwj)^
zB(LwzkM@Kldq{n0z;slyf@<OU0}q)vn&qfs4lg2bH@e*-tJYb~s!Yb{KR5vTJHNB}
z9_>xeZTFM(rQv*M^WDm1Tu_&YneoBy^@{NJ4>k$l`jVz2(=NOU-|KEoLV0BX+$NIM
z0#hLb!{oglvXKC5Hi8`l;IE(dgFF~uJyg_&E135;{-n4FeDVK+NC^@W`tI=V3|Mcs
z6T|Kv>HP#s@f59OUx)L0tvoua<kH+jmR;KEQ-^nUD?{{QgtnTKmq8zma?@SGu>aC^
z4wXwuzdynP>Q&w5f7w4rH$GRz%ky3Mk-okj?kn=k5><xEx`_xreE6c`+-|6jj2}X@
z(97bfwv~acwmg5V0op}=ED5NFqL^6J_(S7HLupPh4b6meEuF{XG*Aa;{VnrJ^Q(bt
z2~L`KEl6$KYxQ!1k8GuxjMv~Axms&=p*j3OR;oh1Z|c>=^PJ$X$$NQVrpZP78ky2z
z5vV_Hsg(7)I}~KJJ=awE%uAu;rV_}mtNN-&zAS=MEVB3fYyC|wH}(B-4@Y(XIj;L<
znWMP%kB1jJrZd(Om^+*|U{CEMK8FDx9tNg~=JKHF2ce>(qiv=l81xXopBbExH>sL<
zwfP3^7XJx%@uc|rG@dj?v3K`_K)ipdC>HnZ9t^$uh$SOzY(N;abR3o5;1k`3T5O+(
zTix}?edZ34B53}g(SBQ~ba&tLvtTeUHc$sW`Fu#mVJ*nzY$a-1--{D}>U8L2so^Vk
zyal#o$mpmXYOM0+_WHkQpFBRq;A5~}3vKtA*H^vssKUPtA*6aaCt0Cr#OStLW>e&<
zLQ)@VGKU95Zhul(nTo%Tk{>J46UqvE;d(<(6B2McS8QZI!wvXV42i)1giOz6$?0MH
zI<3gz8%BG3y8&0Um?T5mI5020j}_x|*rMwh6}a#b`JS7UtB+j&_M*>AEmZi$R?lIm
zdG;8+oq_ZaJv1TNf^jYndfN0X=0X~X?B$LOI}1fjVHVR(jk<?>)XBki$~4szg4D2x
z0zIth{}XNf{T3h+FwcB(HSc$DdMNGTagQ~QC>e5iXr-u}axrji^00WTV&pjo%heW=
znQ<lQG1N-azVQ|Y?y%j`oYZ(n>`gA{El`E8AmH=htjH5Et7`8uCjUb?_!Ah)Kd**7
z*09o##gB!*T&qro^Fw_8%(Mb~7hn{42nUQd@w6t=d_68oUr+0&U&sw|QBFVR3@V+R
zu-cmhYvY%em2qe=ZAYGNKRkHk_65#<>`97E3rC!>-Kx7@<QphIxP%5rw<S5_rY|NI
zSZ?fkbn!g{v#<Jcak42;D!~PaoXP^O3;zLjPoXWetV4zI4&tz34#v$Pe^j@LEZal;
zaPUQ598~h_Wcr8Kyg2`6FUPIblC*bpsIlM+@`Pi;QNl8%d{2J(4S(k24$OP6ivcog
zgY_DCM=YCb9UM$8R&nM;#!TPpb}+j;CB+Y!*#!uX$Kv^6s6&&&ACVD#JtS7+3k8;t
z6I7o1&1<R0;3HJ(oibX4@nyYvgDX2YEg|L((4%<0EHLmaipg+qn}RA(G>&(XE>5?!
z!`nM1-f9#3@zeWi47dV3X{uH8sx{x#KJr?k#YPwG^>#PnzoNXTAoO4xi2OrPU|Sg5
zJx;>1{jCk@B@FmzqB=?K;c2|>1Un#SoD-n=)K7aO>x^Ehl;6`8{5K&J8Mm@&B3?$;
z%Xq?OvVrf-X2?~wfLOf-qHT7_`tx>LrbTfpVV?|2b|V|-*=e+G-0|tCO$#I#E<uT)
zzu?DMJ7)Uf4gbC=v7YQ%Opdg0SKf#Xzu#IQMi*;$;YY0jw26wruuy8?@cKrY+DgPn
zY`(A9e{EeZTEi~&2ZcUl<bnT*W?b>5MC4$Pe4Sjal)o*v_f!3@5dW2*o=;!G;ft2c
zJngPo1-T;3_kYe-ZcV7taAFN$G4D7)AGI#s#f8f>fF|Fm&x@Y@BY=9pZ8mOh^7uma
z<l{2K4RL|DcQAJ<s$$Ht4xs?zg9NO=_l|_R_aA+l?Du?Ff~kiM-frM+6avtd2m`@Z
z037gCajFfUw@GGr{COXp|K={e44&FA-rBY4)pcLxy!^_-_M}dOunw|h#-Dj`*A)Q>
zwjl!CwcM^eEb=lkkc<nS3TrH=(4bEBn${``!d<b<P$IqvE(i+<aPL6W=SPgN>*sEs
zqUzm&a&|PedC5dqb{g~i{b{q6k<bLd+%p59VqBt~br}Jc@?ddJlC=p1)dYx6R7HIj
zYZf`JK2CG3`M!@y%`X<83%*BOVV-nw?ZDAD8aVy^T2vh1?U^tEL*u9QbQj@+|E&NK
z8lg&qBHRfIF{?ZRCKJ8i9LP&U;Sv!N-_ot3h@z;N_Uo#xk=UB;HxxRIKqV?xl8nF-
zcCHhhMI)Zo`RaaLYd%*$t*vP9<2>0d{IlpS&u$baCWWt`a=s8j@k=oxk(9h@ym<CM
zOLx?QyWIe59<dG$E6LD97cD(r8^p(vIA4Rxig{#kIBKB6&CWkr5(v7bGZFws)y4le
z6-~oa%ODh|aO9|Z5s&Q6+P_}Q$+J49OD5RU`#abu6l(uEA*qu4_5DP+M^3LwjE3DH
zVI9mR>NMl3KZC@`%?GleAgP$1Yb#JuOnOXVSU}i%Vr%!2gX8$f?rukg#s+rLb+?OY
zyn;5#4k$bdUVrZ-U>A^ZX77K0{C9IV1gkslBFCIRq^?q!Lgl+)!m?h|@Ow_L0rn*L
zJQ5YNCeB%73!_}*3^t>z*^64M{wHdeR~T-2tsVS^xtZe5wF|MiwIy9K<7WT3{AW8<
z)_yZ+LHG(4-n+Hf?Vl!*rO4^LqeL{GX+3{bn%GHi2MX+^7Sco)%_C{V>R>}3{1Oc*
zb@mL`w{>ZDoHHdB-PGmTVCK({63wuZg<&h}3}a-HzwgbiS*r$>V)4==tbPh9O!NtU
zQh`tfDKzCKTO_0{OZ9U)d#M`yt1PdipBfu7O^Ls~bIVRVT48GNT<rr&9Xz?`oN$&?
zURFu!tGt-*yA=)aSMgJxz?H<}QLQ&Q9$BIwvB#0>gfY?+b_CIY5|?kmvGOT>9d>T8
z@!ZV#q0&j+_0ccPjG`Emt}_{8E3kF43yV^_&YUc=lTp(8EtK?U+c<wkWgpz8T_Zx5
z66eif-B#nf1+#oegFI-Ow$HBq0OdxCcQnSFOWHp@dA|AW5&wd&#HeV*Q7uarQe+fF
z6R>fBE&nDpUHkrs-caiC;|L^%RaWDH91F2zOtqABrqz_#*_E9+D#tk&dAHpEn~Vg3
zn+o!{Q(5d=O=|4L_x5huo^-DLq=C?YG@BEMSNT+Ua1i?s9N^9Imcj#TN7U5fr|=^u
z57D5ScC#XraS>3%38@~{_t4JLYFg#)e1(~)jJ_U&ax}rl#LALep0$UT6K>{0dyuPY
zdX{3tNMP@IzsoFpDBJav{H!SasIR8IdV;<wKjn;$d;fmsN>`=pb$EE7{3Cann)atl
zw|qT%0rZ+OmRHQuf>5EG-oV(Vx5zv~uH*$_*O+WVUzLLt9M$gcpi)A=;1&@j+ex#g
zw@+P6(UD)dsB@@A{4h>udbaL)8nvV^zWwa64#Xk*{5?(-0gL5(5W$JBc<`4s7F-?k
zuJvqYreLVvPzU>Bo;-T##NrtrO6Q{tlgeR)+@tNPyne|w#BCo8x2S#fz(Uwzc_YJ*
z4cmN$vIz10QUrJ)ZVg|liez%bUw1KKf8XgG{rG{$4rR`>uyZ23s>q*Z^d-6Q!b&*C
z<r!~GXPUpq`v=Y^7~Q&@!VZ;SKr{VV>2~TFW)jg5t>=q491r<h61B==$S?AX9O7_W
zdVJ+N2AKp+K?@G{xRrD-h<vdPn-yMQ>uGoU4X}<61mXNzaMy|ucTa(*2<PqQk1Hs6
z;TNmbsX1!Xi&arkA-_a$vXG6{V;hc$z``Oncso<Detdja?4+l^5oxtO!tO4k;@=Jn
z`IOnitJ5mV*c=%kL*zBY0UTO3g}CoQsfS{;zPdxRHUBlFK~+?-DOcyhjY1tXMlO{P
zqed?sHOhRc{w(^o6j-!oP-%ICC#_!Z>~|(Wy#VjX*h8m>FY(fqP#$<x6ecMb_;YR%
zb6cCEwZAV16zJior(*^}&EV{81ZSeU?17Tymy42;+J4`^UBqsN+SD9UJ!it>N_9<-
zS7HB*d(hCVZa147#ZmW@RU7O}b#Do4j7Z{^B{cAMTw_I;n%?Zxc}tnMzTD{Jt*gNQ
z=BsNNN|ulXvz`sHuICI$-naZEs&ng98+ZD6V$=Xdl!A9F+^>M(FEf(K9ooQ@vbE;r
z;2Wc+cS~OEcB|9IFaK@d2KTaxtdwD^PSbDM48j$oK5xYez20y$r;wV13gBM#Fua{L
z{_)fGVc~wiv_*fg`l{GGIxN1Z@L144z`-RnQN}Z`wi!p-;ItsgAhUico8{L{A^<F5
z7Bt&I&Z2DRhf#f0ZXVr(#yFfzi0V;5mS4$rXIL9Uae^jswoK*rinT1WS2{6+-j|+#
zWvQa#HM-M|_83X9rl3x`xmTVuitZw79ifnwo-@e?$&qQJV_bhrcwDMeGDVFq(1*?F
z`4}VfxBB`iekFo=2ZT#kZ1(f$m&*}Kmwne)m?!6b=eHqxv`iZ0Sz{U35gUL%WSsCL
z@$g47L2k#D2S=4GwW|$nHm<Ka$|=F#c8G5pWmn(aV&Xa_zRwc#sKoz|8(*ES9{j2I
zskU}(Yb+_tCye|VM|%F%+ik$W3>m^r?ce(NGLRPoAdFR%<m|=Xu3-HajPZ&kX_xkm
z7(Td!&o88mthZ~W4c;hCUS2}yCXYib><`u$EQXthW~xq>$4#uz#jxHVgN=D3kY-t$
zzp^uJx8I}#&=r;t#`FO8C}ZQSqw0Um!0FQycHswf<)Q1&J=;R$c0ui&2Ku9mWcP%R
zHkAw31WiBnrdCWo6C{&+(ie^4*YKeBKpg5mT_^bqki9$pC$uC)GiX;2O&%2?569UV
zm;gz2Kk2Gy2$I6(?N{MfnG&A=HPuh~TYzqnp&5gfu-%2V{I2*LF_cT%m86&N+&&~4
zigN<CFC)LD<)<16P{;e?Zk*6M?s}OL#L0nE85jKDd)y#J)&3lhzcVYkUSSw$>}vtz
zI?6+zJ9$37aDu`Fg8B(51*zEMU`nv+;I!t(%4GZ6<NZRO&idXaMZBl7FUk@tXIW|p
zKxj@RP6u+_&zVQ?_F>kwG~OyFu=gb|TGscrgT-u$WfuPs5+4cT6b`WUdWvapy3YRZ
zL`A5e!xLukrOiJee36a}bK-||`XjyRv>MBQYJV!jKks_`oE<HAvkU@iBzOgKcB*e$
z1g$vK8P67uNrSyddtw5n%Adae5`Z?>Xz+rdvTK(sf&~;WTm#1x5bWQGrBldlh8WVz
zi{Car`bxrBZV?oUQl&yr-s!uK7Etx|v4af9lu0!#jqXEvv!V0!E^T9TIq#2*F{RzK
z8Tr|#NK+Syq3d)#ry4@bU%fcfs#sRMwh6e@-b%j_BeaZhmVNVB)S>!N*QRVpKP)r^
zs=8`(R)$$+&pE~9Ztca3t+cC_&}8Eq(#&l${D1N$sX&Z|E&q>)7&&yz>9gol5L>Be
zSq6^jC$aIFxpJ#8RMIeu+cOa|pV;Zh!?~f`!7aJpcsAp~o^M__1|t!YBYpVho*X?$
z7zImm2yA;|v4EeD6;w|nEF2E;4>cIDs6t=0BVGKVkuj6kvkXIJ#}APrbFi`J`_Lsj
y4=i<DN3RC@XMIjnzUmQJ&;Qp+J;aT7K*{$;F#@e(u8-q~068gT$yy0;(EkBB63K1=

literal 0
HcmV?d00001

diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 2dce73ad1..88e9d923e 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -5,17 +5,21 @@
   <string name="connection_service_title">Verbindungsdienst</string>
   <string name="connection_service_description">Hält eine Verbindung zum Core, um Benachrichtigungen und die Übertragung von Nachrichten zu ermöglichen</string>
 
+  <string name="label_about">Über</string>
   <string name="label_buffer_name">Chatname</string>
   <string name="label_cancel">Abbrechen</string>
   <string name="label_close">Schließen</string>
   <string name="label_connect">Verbinden</string>
+  <string name="label_crashes">Absturzberichte</string>
   <string name="label_delete">Löschen</string>
+  <string name="label_delete_all">Alle Löschen</string>
   <string name="label_disconnect">Verbindung trennen</string>
   <string name="label_filter_messages">Nachrichten filtern</string>
   <string name="label_hide_perm">Permanent ausblenden</string>
   <string name="label_hide_temp">Temporär ausblenden</string>
   <string name="label_input_history">Eingabeverlauf</string>
   <string name="label_join">Verbinden</string>
+  <string name="label_license">Lizenz</string>
   <string name="label_no">Nein</string>
   <string name="label_open">Öffnen</string>
   <string name="label_part">Verlassen</string>
@@ -24,8 +28,10 @@
   <string name="label_save">Speichern</string>
   <string name="label_select_multiple">Auswählen</string>
   <string name="label_settings">Einstellungen</string>
+  <string name="label_share_crashreport">Absturzbericht Teilen</string>
   <string name="label_show_hidden">Alle anzeigen</string>
   <string name="label_unhide">Nicht mehr ausblenden</string>
+  <string name="label_website">Webseite</string>
   <string name="label_yes">Ja</string>
 
   <string name="notification_channel_connection_title">Verbindung</string>
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 0af8785e4..b31f5bb0b 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -129,6 +129,7 @@
   <attr name="colorForegroundMirc" format="integer" />
 
   <attr name="colorTextPrimary" format="color" />
+  <attr name="colorTextPrimaryInverse" format="color" />
   <attr name="colorTextSecondary" format="color" />
   <attr name="colorDivider" format="color" />
 
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b6e4470b9..139ae476d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -4,17 +4,21 @@
   <string name="connection_service_title">Connection Service</string>
   <string name="connection_service_description">Keeps a connection to your core to allow for notifications, and to transmit messages.</string>
 
+  <string name="label_about">About</string>
   <string name="label_buffer_name">Buffer Name</string>
   <string name="label_cancel">Cancel</string>
   <string name="label_close">Close</string>
   <string name="label_connect">Connect</string>
+  <string name="label_crashes">Crashes</string>
   <string name="label_delete">Delete</string>
+  <string name="label_delete_all">Delete All</string>
   <string name="label_disconnect">Disconnect</string>
   <string name="label_filter_messages">Filter Messages</string>
   <string name="label_hide_perm">Hide Permanently</string>
   <string name="label_hide_temp">Hide Temporarily</string>
   <string name="label_input_history">Input History</string>
   <string name="label_join">Join</string>
+  <string name="label_license">License</string>
   <string name="label_no">No</string>
   <string name="label_open">Open</string>
   <string name="label_part">Part</string>
@@ -23,8 +27,10 @@
   <string name="label_save">Save</string>
   <string name="label_select_multiple">Select</string>
   <string name="label_settings">Settings</string>
+  <string name="label_share_crashreport">Share Crashreport</string>
   <string name="label_show_hidden">Show Hidden</string>
   <string name="label_unhide">Make Visible</string>
+  <string name="label_website">Website</string>
   <string name="label_yes">Yes</string>
 
   <string name="notification_channel_background" translatable="false">background</string>
@@ -33,4 +39,8 @@
   <string name="notification_channel_highlight_title">Highlight</string>
 
   <string name="buffer_delete_confirmation">Do you want to delete this buffer permanently?</string>
+  <string name="app_description_long">Quassel is a distributed, decentralized IRC client, written using C++ and Qt. QuasselDroid is a pure-java client for the Quassel core, allowing you to connect to your Quassel core using your Android (TM) phone.</string>
+  <string name="label_github">GitHub</string>
+  <string name="label_libraries">Libraries</string>
+  <string name="label_contributors">Contributors</string>
 </resources>
diff --git a/app/src/main/res/values/strings_licenses.xml b/app/src/main/res/values/strings_licenses.xml
new file mode 100644
index 000000000..d688ab36f
--- /dev/null
+++ b/app/src/main/res/values/strings_licenses.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+  <string name="license_apache_2"><![CDATA[
+    <p>Version 2.0, January 2004<br /><br /><a href="http://www.apache.org/licenses/">http://www.apache.org/licenses/</a></p>
+    <p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p>
+    <p><strong>1. Definitions</strong>.</p>
+    <p>"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.</p>
+    <p>"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.</p>
+    <p>"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.</p>
+    <p>"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.</p>
+    <p>"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.</p>
+    <p>"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.</p>
+    <p>"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).</p>
+    <p>"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.</p>
+    <p>"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."</p>
+    <p>"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.</p>
+    <p><strong>2. Grant of Copyright License</strong>. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.</p>
+    <p><strong>3. Grant of Patent License</strong>. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.</p>
+    <p><strong>4. Redistribution</strong>. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:</p>
+    <p>a. You must give any other recipients of the Work or Derivative Works a copy of this License; and</p>
+    <p>b. You must cause any modified files to carry prominent notices stating that You changed the files; and</p>
+    <p>c. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and</p>
+    <p>d. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.<br /><br /> You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.</p>
+    <p><strong>5. Submission of Contributions</strong>. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.</p>
+    <p><strong>6. Trademarks</strong>. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.</p>
+    <p><strong>7. Disclaimer of Warranty</strong>. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.</p>
+    <p><strong>8. Limitation of Liability</strong>. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.</p>
+    <p><strong>9. Accepting Warranty or Additional Liability</strong>. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.</p>
+  ]]></string>
+  <string name="license_materialdialogs" tools:ignore="TypographyOther"><![CDATA[
+    <p>Copyright (c) 2014-2016 Aidan Michael Follestad</p>
+    <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
+    <p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
+    <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>
+  ]]></string>
+  <string name="license_threetenbp" tools:ignore="TypographyOther"><![CDATA[
+    <p>Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos</p>
+    <p>All rights reserved.</p>
+    <p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+    <ol>
+      <li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+      <li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+      <li>Neither the name of JSR-310 nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission..</li>
+    </ol>
+    <p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+    ]]></string>
+
+</resources>
diff --git a/app/src/main/res/values/styles_widgets.xml b/app/src/main/res/values/styles_widgets.xml
index e9c9428f5..6fbeebcf0 100644
--- a/app/src/main/res/values/styles_widgets.xml
+++ b/app/src/main/res/values/styles_widgets.xml
@@ -4,9 +4,12 @@
 
   <style name="Widget.Button" parent="Widget.AppCompat.Button">
     <item name="backgroundTint">?attr/colorBackgroundCard</item>
+    <item name="android:textColor">?attr/colorTextPrimary</item>
   </style>
 
-  <style name="Widget.Button.Colored" parent="Widget.AppCompat.Button.Colored" />
+  <style name="Widget.Button.Colored" parent="Widget.AppCompat.Button.Colored">
+    <item name="android:textColor">?attr/colorTextPrimaryInverse</item>
+  </style>
 
   <style name="Widget.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
     <item name="drawerArrowStyle">@style/Widget.DrawerArrowToggle</item>
diff --git a/app/src/main/res/values/themes_base.xml b/app/src/main/res/values/themes_base.xml
index 5f41e0ace..a05ed7a54 100644
--- a/app/src/main/res/values/themes_base.xml
+++ b/app/src/main/res/values/themes_base.xml
@@ -51,6 +51,7 @@
     <item name="windowActionModeOverlay">true</item>
 
     <item name="colorTextPrimary">#dedede</item>
+    <item name="colorTextPrimaryInverse">?colorBackground</item>
     <item name="colorTextSecondary">#8a8a8a</item>
     <item name="colorDivider">#1FFFFFFF</item>
     <item name="android:textColorHint">?colorTextSecondary</item>
@@ -183,6 +184,7 @@
     <item name="windowActionModeOverlay">true</item>
 
     <item name="colorTextPrimary">#212121</item>
+    <item name="colorTextPrimaryInverse">?colorBackground</item>
     <item name="colorTextSecondary">#757575</item>
     <item name="colorDivider">#1F000000</item>
     <item name="android:textColorHint">?colorTextSecondary</item>
diff --git a/app/src/main/res/values/themes_gruvbox.xml b/app/src/main/res/values/themes_gruvbox.xml
index f42712844..d9fc8ffb3 100644
--- a/app/src/main/res/values/themes_gruvbox.xml
+++ b/app/src/main/res/values/themes_gruvbox.xml
@@ -33,6 +33,7 @@
     <item name="colorForegroundError">#9d0006</item>
 
     <item name="colorTextPrimary">#3c3836</item>
+    <item name="colorTextPrimaryInverse">#fbf1c7</item>
     <item name="colorTextSecondary">#665c54</item>
     <item name="colorDivider">#2d928374</item>
 
@@ -87,6 +88,7 @@
     <item name="colorForegroundError">#cc241d</item>
 
     <item name="colorTextPrimary">#dbdbb2</item>
+    <item name="colorTextPrimaryInverse">#282828</item>
     <item name="colorTextSecondary">#bdae93</item>
     <item name="colorDivider">#33928374</item>
 
diff --git a/app/src/main/res/values/themes_solarized.xml b/app/src/main/res/values/themes_solarized.xml
index 69aed4a23..2a1000590 100644
--- a/app/src/main/res/values/themes_solarized.xml
+++ b/app/src/main/res/values/themes_solarized.xml
@@ -33,6 +33,7 @@
     <item name="colorForegroundError">#B00000</item>
 
     <item name="colorTextPrimary">#586e75</item>
+    <item name="colorTextPrimaryInverse">#FDF6E3</item>
     <item name="colorTextSecondary">#657b83</item>
     <item name="colorDivider">#19586e75</item>
 
@@ -87,6 +88,7 @@
     <item name="colorForegroundError">#B00000</item>
 
     <item name="colorTextPrimary">#93a1a1</item>
+    <item name="colorTextPrimaryInverse">#002B36</item>
     <item name="colorTextSecondary">#839496</item>
     <item name="colorDivider">#1993a1a1</item>
 
diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts
index 53138ef03..6216e7698 100644
--- a/lib/build.gradle.kts
+++ b/lib/build.gradle.kts
@@ -17,7 +17,7 @@ dependencies {
   }
 
   implementation("org.threeten", "threetenbp", "1.3.6")
-  implementation("io.reactivex.rxjava2:rxjava:2.1.9")
+  implementation("io.reactivex.rxjava2", "rxjava", "2.1.9")
 
   implementation(project(":invokerannotations"))
   kapt(project(":invokergenerator"))
diff --git a/persistence/build.gradle.kts b/persistence/build.gradle.kts
index 8613c62d8..9674a5c20 100644
--- a/persistence/build.gradle.kts
+++ b/persistence/build.gradle.kts
@@ -45,7 +45,7 @@ dependencies {
 
   // Utility
   implementation("org.threeten", "threetenbp", "1.3.6", classifier = "no-tzdb")
-  implementation("org.jetbrains", "annotations", "15.0")
+  implementation("org.jetbrains", "annotations", "16.0.1")
 
   // Quassel
   implementation(project(":lib")) {
diff --git a/viewmodel/build.gradle.kts b/viewmodel/build.gradle.kts
index 1b1afedb6..28548b70a 100644
--- a/viewmodel/build.gradle.kts
+++ b/viewmodel/build.gradle.kts
@@ -34,7 +34,7 @@ dependencies {
   // Utility
   implementation("io.reactivex.rxjava2", "rxjava", "2.1.9")
   implementation("org.threeten", "threetenbp", "1.3.6", classifier = "no-tzdb")
-  implementation("org.jetbrains", "annotations", "15.0")
+  implementation("org.jetbrains", "annotations", "16.0.1")
 
   // Quassel
   implementation(project(":lib")) {
-- 
GitLab