From 360decd37cacb889a29d98a4d558495dcad5f712 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Wed, 16 Sep 2020 14:31:45 +0900 Subject: [PATCH 1/4] FloatingSearchView migration --- app/build.gradle | 6 +- .../xyz/quaver/pupil/types/Suggestions.kt | 24 +-- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 28 ++-- .../pupil/ui/view/FloatingSearchView.kt} | 38 ++--- .../res/drawable/reader_item_boundary.xml | 2 +- .../res/layout-v23/activity_main_content.xml | 152 ------------------ .../main/res/layout/activity_main_content.xml | 31 ++-- app/src/main/res/layout/activity_reader.xml | 4 +- app/src/main/res/layout/item_galleryblock.xml | 2 +- build.gradle | 3 +- 10 files changed, 63 insertions(+), 227 deletions(-) rename app/src/main/java/{com/arlib/floatingsearchview/FloatingSearchViewDayNight.kt => xyz/quaver/pupil/ui/view/FloatingSearchView.kt} (89%) delete mode 100644 app/src/main/res/layout-v23/activity_main_content.xml diff --git a/app/build.gradle b/app/build.gradle index 4d59040d..b6f63468 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { applicationId "xyz.quaver.pupil" minSdkVersion 16 targetSdkVersion 30 - versionCode 59 - versionName "5.0.3-hotfix2" + versionCode 60 + versionName "5.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } @@ -80,7 +80,6 @@ dependencies { implementation 'com.google.firebase:firebase-perf:19.0.8' implementation 'com.google.android.gms:play-services-oss-licenses:17.0.0' implementation 'com.google.android.gms:play-services-mlkit-face-detection:16.1.1' - implementation 'com.github.arimorty:floatingsearchview:2.1.1' implementation 'com.github.clans:fab:1.6.4' //implementation 'com.quiph.ui:recyclerviewfastscroller:0.2.1' //noinspection GradleDependency @@ -106,6 +105,7 @@ dependencies { exclude group: 'org.jetbrains.kotlinx', module: 'kotlinx-serialization-core-jvm' } implementation "xyz.quaver:documentfilex:0.2.15" + implementation "xyz.quaver:floatingsearchview:1.0" testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test:rules:1.3.0' diff --git a/app/src/main/java/xyz/quaver/pupil/types/Suggestions.kt b/app/src/main/java/xyz/quaver/pupil/types/Suggestions.kt index e49391e4..54dccdab 100644 --- a/app/src/main/java/xyz/quaver/pupil/types/Suggestions.kt +++ b/app/src/main/java/xyz/quaver/pupil/types/Suggestions.kt @@ -18,36 +18,28 @@ package xyz.quaver.pupil.types -import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion +import kotlinx.android.parcel.IgnoredOnParcel import kotlinx.android.parcel.Parcelize +import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion import xyz.quaver.hitomi.Suggestion @Parcelize data class TagSuggestion(val s: String, val t: Int, val u: String, val n: String) : SearchSuggestion { constructor(s: Suggestion) : this(s.s, s.t, s.u, s.n) - override fun getBody(): String { - return s - } + @IgnoredOnParcel + override val body = s } @Parcelize -class Suggestion(val str: String) : SearchSuggestion { - override fun getBody() = str -} +class Suggestion(override val body: String) : SearchSuggestion @Parcelize -class NoResultSuggestion(val str: String) : SearchSuggestion { - override fun getBody() = str -} +class NoResultSuggestion(override val body: String) : SearchSuggestion @Parcelize -class LoadingSuggestion(val str: String) : SearchSuggestion { - override fun getBody() = str -} +class LoadingSuggestion(override val body: String) : SearchSuggestion @Parcelize @Suppress("PARCELABLE_PRIMARY_CONSTRUCTOR_IS_EMPTY") -class FavoriteHistorySwitch(private val body: String) : SearchSuggestion { - override fun getBody() = body -} \ No newline at end of file +class FavoriteHistorySwitch(override val body: String) : SearchSuggestion \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 8913ca8f..51242e86 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -29,10 +29,6 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDelegate import androidx.cardview.widget.CardView import androidx.core.view.GravityCompat -import com.arlib.floatingsearchview.FloatingSearchView -import com.arlib.floatingsearchview.FloatingSearchViewDayNight -import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion -import com.arlib.floatingsearchview.util.view.SearchInputView import com.bumptech.glide.Glide import com.google.android.material.appbar.AppBarLayout import com.google.android.material.navigation.NavigationView @@ -41,6 +37,9 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main_content.* import kotlinx.coroutines.* +import xyz.quaver.floatingsearchview.FloatingSearchView +import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion +import xyz.quaver.floatingsearchview.util.view.SearchInputView import xyz.quaver.hitomi.doSearch import xyz.quaver.hitomi.getGalleryIDsFromNozomi import xyz.quaver.hitomi.getSuggestionsForQuery @@ -60,7 +59,6 @@ import kotlin.math.roundToInt class MainActivity : BaseActivity(), - FloatingSearchView.OnMenuItemClickListener, NavigationView.OnNavigationItemSelectedListener { @@ -626,8 +624,8 @@ class MainActivity : private var suggestionJob : Job? = null private fun setupSearchBar() { - with(main_searchview as FloatingSearchViewDayNight) { - setOnLeftMenuClickListener(object: FloatingSearchView.OnLeftMenuClickListener { + with(main_searchview as xyz.quaver.pupil.ui.view.FloatingSearchView) { + onMenuStatusChangeListener = object: FloatingSearchView.OnMenuStatusChangeListener { override fun onMenuOpened() { (this@MainActivity.main_recyclerview.adapter as GalleryBlockAdapter).closeAllItems() } @@ -635,7 +633,7 @@ class MainActivity : override fun onMenuClosed() { //Do Nothing } - }) + } onHistoryDeleteClickedListener = { searchHistory.remove(it) @@ -646,9 +644,11 @@ class MainActivity : swapSuggestions(defaultSuggestions) } - setOnMenuItemClickListener(this@MainActivity) + onMenuItemClickListener = { + onActionMenuItemSelected(it) + } - setOnQueryChangeListener { _, query -> + onQueryChangeListener = lambda@{ _, query -> this@MainActivity.query = query suggestionJob?.cancel() @@ -656,7 +656,7 @@ class MainActivity : if (query.isEmpty() or query.endsWith(' ')) { swapSuggestions(defaultSuggestions) - return@setOnQueryChangeListener + return@lambda } swapSuggestions(listOf(LoadingSuggestion(getText(R.string.reader_loading).toString()))) @@ -682,7 +682,7 @@ class MainActivity : } } - setOnFocusChangeListener(object: FloatingSearchView.OnFocusChangeListener { + onFocusChangeListener = object: FloatingSearchView.OnFocusChangeListener { override fun onFocus() { if (query.isEmpty() or query.endsWith(' ')) swapSuggestions(defaultSuggestions) @@ -699,13 +699,13 @@ class MainActivity : loadBlocks() } } - }) + } attachNavigationDrawerToMenuButton(main_drawer_layout) } } - override fun onActionMenuItemSelected(item: MenuItem?) { + fun onActionMenuItemSelected(item: MenuItem?) { when(item?.itemId) { R.id.main_menu_settings -> startActivityForResult(Intent(this@MainActivity, SettingsActivity::class.java), R.id.request_settings.normalizeID()) R.id.main_menu_thin -> { diff --git a/app/src/main/java/com/arlib/floatingsearchview/FloatingSearchViewDayNight.kt b/app/src/main/java/xyz/quaver/pupil/ui/view/FloatingSearchView.kt similarity index 89% rename from app/src/main/java/com/arlib/floatingsearchview/FloatingSearchViewDayNight.kt rename to app/src/main/java/xyz/quaver/pupil/ui/view/FloatingSearchView.kt index 0792cac1..79b4b362 100644 --- a/app/src/main/java/com/arlib/floatingsearchview/FloatingSearchViewDayNight.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/view/FloatingSearchView.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.arlib.floatingsearchview +package xyz.quaver.pupil.ui.view import android.content.Context import android.graphics.PorterDuff @@ -36,21 +36,21 @@ import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.swiperefreshlayout.widget.CircularProgressDrawable import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat -import com.arlib.floatingsearchview.suggestions.SearchSuggestionsAdapter -import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion -import com.arlib.floatingsearchview.util.view.SearchInputView +import xyz.quaver.floatingsearchview.FloatingSearchView +import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion +import xyz.quaver.floatingsearchview.util.MenuPopupHelper +import xyz.quaver.floatingsearchview.util.view.MenuView +import xyz.quaver.floatingsearchview.util.view.SearchInputView import xyz.quaver.pupil.R import xyz.quaver.pupil.favoriteTags import xyz.quaver.pupil.types.* import java.util.* -class FloatingSearchViewDayNight @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : +class FloatingSearchView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : FloatingSearchView(context, attrs), FloatingSearchView.OnSearchListener, - SearchSuggestionsAdapter.OnBindSuggestionCallback, TextWatcher { - private val searchInputView = findViewById(R.id.search_bar_text) var onHistoryDeleteClickedListener: ((String) -> Unit)? = null @@ -60,8 +60,10 @@ class FloatingSearchViewDayNight @JvmOverloads constructor(context: Context, att searchInputView.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI searchInputView.addTextChangedListener(this) - setOnSearchListener(this) - setOnBindSuggestionCallback(this) + onSearchListener = this + onBindSuggestionCallback = { a, b, c, d, e -> + onBindSuggestion(a, b, c, d, e) + } } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -83,7 +85,7 @@ class FloatingSearchViewDayNight @JvmOverloads constructor(context: Context, att when (searchSuggestion) { is TagSuggestion -> { val tag = "${searchSuggestion.n}:${searchSuggestion.s.replace(Regex("\\s"), "_")}" - with(searchInputView.text) { + with(searchInputView.text!!) { delete(if (lastIndexOf(' ') == -1) 0 else lastIndexOf(' ') + 1, length) if (!this.contains(tag)) @@ -91,9 +93,9 @@ class FloatingSearchViewDayNight @JvmOverloads constructor(context: Context, att } } is Suggestion -> { - with(searchInputView.text) { + with(searchInputView.text!!) { clear() - append(searchSuggestion.str) + append(searchSuggestion.body) } } is FavoriteHistorySwitch -> onFavoriteHistorySwitchClickListener?.invoke() @@ -102,14 +104,14 @@ class FloatingSearchViewDayNight @JvmOverloads constructor(context: Context, att override fun onSearchAction(currentQuery: String?) {} - override fun onBindSuggestion( + fun onBindSuggestion( suggestionView: View?, leftIcon: ImageView?, textView: TextView?, item: SearchSuggestion?, itemPosition: Int ) { - when(item) { + when(item) { is TagSuggestion -> { val tag = "${item.n}:${item.s.replace(Regex("\\s"), "_")}" @@ -199,7 +201,7 @@ class FloatingSearchViewDayNight @JvmOverloads constructor(context: Context, att isClickable = true setOnClickListener { - onHistoryDeleteClickedListener?.invoke(item.str) + onHistoryDeleteClickedListener?.invoke(item.body) } } } @@ -215,10 +217,4 @@ class FloatingSearchViewDayNight @JvmOverloads constructor(context: Context, att } } } - - // hack to remove color attributes which should not be reused - override fun onSaveInstanceState(): Parcelable? { - super.onSaveInstanceState() - return null - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/reader_item_boundary.xml b/app/src/main/res/drawable/reader_item_boundary.xml index caff3bcf..18006135 100644 --- a/app/src/main/res/drawable/reader_item_boundary.xml +++ b/app/src/main/res/drawable/reader_item_boundary.xml @@ -4,7 +4,7 @@ - + diff --git a/app/src/main/res/layout-v23/activity_main_content.xml b/app/src/main/res/layout-v23/activity_main_content.xml deleted file mode 100644 index 78db4973..00000000 --- a/app/src/main/res/layout-v23/activity_main_content.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index 210d502b..34ad0fd2 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -1,7 +1,7 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml index 714138d6..b9fd3fa8 100644 --- a/app/src/main/res/menu/main.xml +++ b/app/src/main/res/menu/main.xml @@ -20,10 +20,10 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 74ad60e7..bc19c9c5 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -114,7 +114,7 @@ 잘못된 값 서버 주소 서버 - 간단히 보기 모드 + 간단히 보기 다운로드 모두 취소 업데이트 업데이트 진행상황 표시 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9c18a0a..4b7631ea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,7 +50,7 @@ Email me! Discord - Toggle Thin Mode + Thin Mode Sort Newest diff --git a/build.gradle b/build.gradle index 444c535c..8fb3c4ba 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,6 @@ allprojects { repositories { google() jcenter() - mavenLocal() maven { url "https://jitpack.io" } maven { url 'https://guardian.github.com/maven/repo-releases' } } From fca42c79a867b87b11de7249140ccff4d34d7f3d Mon Sep 17 00:00:00 2001 From: tom5079 Date: Fri, 25 Sep 2020 15:39:07 +0900 Subject: [PATCH 3/4] Updated startActivityForResult to launchers --- .../java/xyz/quaver/pupil/ui/BaseActivity.kt | 23 ++-- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 38 +++--- .../xyz/quaver/pupil/ui/SettingsActivity.kt | 29 ---- .../dialog/DownloadLocationDialogFragment.kt | 127 +++++++++--------- .../pupil/ui/fragment/SettingsFragment.kt | 33 ++--- app/src/main/res/values/ids.xml | 7 - 6 files changed, 104 insertions(+), 153 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/BaseActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/BaseActivity.kt index 5963073c..96d8b3b3 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/BaseActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/BaseActivity.kt @@ -23,6 +23,7 @@ import android.content.Intent import android.os.Bundle import android.os.PersistableBundle import android.view.WindowManager +import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.CallSuper import androidx.appcompat.app.AppCompatActivity import xyz.quaver.pupil.R @@ -34,6 +35,13 @@ open class BaseActivity : AppCompatActivity() { private var locked: Boolean = true + private val lockLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) + locked = false + else + finish() + } + @CallSuper override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) @@ -53,20 +61,7 @@ open class BaseActivity : AppCompatActivity() { window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) if (locked) - startActivityForResult(Intent(this, LockActivity::class.java), R.id.request_lock.normalizeID()) - } - - @CallSuper - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when(requestCode) { - R.id.request_lock.normalizeID() -> { - if (resultCode == Activity.RESULT_OK) - locked = false - else - finish() - } - else -> super.onActivityResult(requestCode, resultCode, data) - } + lockLauncher.launch(Intent(this, LockActivity::class.java)) } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 207d040e..32f34979 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -23,7 +23,10 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import android.text.InputType -import android.view.* +import android.view.KeyEvent +import android.view.MenuItem +import android.view.MotionEvent +import android.view.View import android.widget.* import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDelegate @@ -50,9 +53,12 @@ import xyz.quaver.pupil.services.DownloadService import xyz.quaver.pupil.types.* import xyz.quaver.pupil.ui.dialog.DownloadLocationDialogFragment import xyz.quaver.pupil.ui.dialog.GalleryDialog -import xyz.quaver.pupil.util.* +import xyz.quaver.pupil.util.ItemClickSupport +import xyz.quaver.pupil.util.Preferences +import xyz.quaver.pupil.util.checkUpdate import xyz.quaver.pupil.util.downloader.Cache import xyz.quaver.pupil.util.downloader.DownloadManager +import xyz.quaver.pupil.util.restore import kotlin.math.abs import kotlin.math.ceil import kotlin.math.min @@ -95,7 +101,6 @@ class MainActivity : private var loadingJob: Job? = null private var currentPage = 0 - override fun onCreate(savedInstanceState: Bundle?) { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) super.onCreate(savedInstanceState) @@ -137,6 +142,17 @@ class MainActivity : } } + override fun onResume() { + super.onResume() + + runOnUiThread { + cancelFetch() + clearGalleries() + fetchGalleries(query, sortMode) + loadBlocks() + } + } + override fun onDestroy() { super.onDestroy() @@ -180,20 +196,6 @@ class MainActivity : } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when(requestCode) { - R.id.request_settings.normalizeID() -> { - runOnUiThread { - cancelFetch() - clearGalleries() - fetchGalleries(query, sortMode) - loadBlocks() - } - } - else -> super.onActivityResult(requestCode, resultCode, data) - } - } - private fun initView() { var prevP1 = 0 main_appbar_layout.addOnOffsetChangedListener( @@ -716,7 +718,7 @@ class MainActivity : fun onActionMenuItemSelected(item: MenuItem?) { when(item?.itemId) { - R.id.main_menu_settings -> startActivityForResult(Intent(this@MainActivity, SettingsActivity::class.java), R.id.request_settings.normalizeID()) + R.id.main_menu_settings -> startActivity(Intent(this@MainActivity, SettingsActivity::class.java)) R.id.main_menu_thin -> { val thin = !item.isChecked diff --git a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt index 7e797ac5..38685e4f 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt @@ -18,24 +18,10 @@ package xyz.quaver.pupil.ui -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Intent -import android.content.pm.PackageManager import android.os.Bundle import android.view.MenuItem -import android.view.WindowManager -import androidx.appcompat.app.AppCompatActivity -import com.google.android.material.snackbar.Snackbar -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json import xyz.quaver.pupil.R -import xyz.quaver.pupil.favorites -import xyz.quaver.pupil.ui.fragment.LockSettingsFragment import xyz.quaver.pupil.ui.fragment.SettingsFragment -import xyz.quaver.pupil.util.Preferences -import xyz.quaver.pupil.util.normalizeID -import java.nio.charset.Charset class SettingsActivity : BaseActivity() { @@ -56,19 +42,4 @@ class SettingsActivity : BaseActivity() { return true } - - @SuppressLint("InlinedApi") - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - when (requestCode) { - R.id.request_write_permission_and_saf.normalizeID() -> { - if (grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED) { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { - putExtra("android.content.extra.SHOW_ADVANCED", true) - } - - startActivityForResult(intent, R.id.request_download_folder.normalizeID()) - } - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt index 042854e2..0b4b1904 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt @@ -26,11 +26,13 @@ import android.os.Build import android.os.Bundle import android.view.View import android.widget.LinearLayout +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.core.net.toUri import androidx.fragment.app.DialogFragment import com.google.android.material.snackbar.Snackbar +import kotlinx.android.synthetic.main.dialog_download_folder_name.view.* import kotlinx.android.synthetic.main.item_download_folder.view.* import net.rdrei.android.dirchooser.DirectoryChooserActivity import net.rdrei.android.dirchooser.DirectoryChooserConfig @@ -40,12 +42,70 @@ import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.byteToString import xyz.quaver.pupil.util.downloader.DownloadManager import xyz.quaver.pupil.util.migrate -import xyz.quaver.pupil.util.normalizeID import java.io.File class DownloadLocationDialogFragment : DialogFragment() { private val entries = mutableMapOf() + private val requestDownloadFolderLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) { + val activity = activity ?: return@registerForActivityResult + val context = context ?: return@registerForActivityResult + val dialog = dialog ?: return@registerForActivityResult + + it.data?.data?.also { uri -> + val takeFlags: Int = + activity.intent.flags and + (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) + context.contentResolver.takePersistableUriPermission(uri, takeFlags) + + if (kotlin.runCatching { FileX(context, uri).canWrite() }.getOrDefault(false)) { + entries[null]?.message?.text = uri.toString() + Preferences["download_folder"] = uri.toString() + } else { + Snackbar.make( + dialog.window!!.decorView.rootView, + R.string.settings_download_folder_not_writable, + Snackbar.LENGTH_LONG + ).show() + + val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath + val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } + entries[key]!!.button.isChecked = true + if (key == null) entries[key]!!.location_available.text = downloadFolder + } + } + } + } + + private val requestDownloadFolderOldLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val context = context ?: return@registerForActivityResult + val dialog = dialog ?: return@registerForActivityResult + + if (it.resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) { + val directory = it.data?.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR)!! + + if (!File(directory).canWrite()) { + Snackbar.make( + dialog.window!!.decorView.rootView, + R.string.settings_download_folder_not_writable, + Snackbar.LENGTH_LONG + ).show() + + val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath + val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } + entries[key]!!.button.isChecked = true + if (key == null) entries[key]!!.location_available.text = downloadFolder + } + else { + entries[null]?.location_available?.text = directory + Preferences["download_folder"] = File(directory).toURI().toString() + } + } + } + @SuppressLint("InflateParams") private fun build() : View? { val context = context ?: return null @@ -90,7 +150,7 @@ class DownloadLocationDialogFragment : DialogFragment() { putExtra("android.content.extra.SHOW_ADVANCED", true) } - startActivityForResult(intent, R.id.request_download_folder.normalizeID()) + requestDownloadFolderLauncher.launch(intent) } else { // Can't use SAF on old Androids! val config = DirectoryChooserConfig.builder() .newDirectoryName("Pupil") @@ -101,7 +161,7 @@ class DownloadLocationDialogFragment : DialogFragment() { putExtra(DirectoryChooserActivity.EXTRA_CONFIG, config) } - startActivityForResult(intent, R.id.request_download_folder_old.normalizeID()) + requestDownloadFolderOldLauncher.launch(intent) } } entries[null] = this @@ -132,65 +192,4 @@ class DownloadLocationDialogFragment : DialogFragment() { return builder.create() } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when (requestCode) { - R.id.request_download_folder.normalizeID() -> { - if (resultCode == Activity.RESULT_OK) { - val activity = activity ?: return - val context = context ?: return - val dialog = dialog ?: return - - data?.data?.also { uri -> - val takeFlags: Int = - activity.intent.flags and - (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - context.contentResolver.takePersistableUriPermission(uri, takeFlags) - - if (kotlin.runCatching { FileX(context, uri).canWrite() }.getOrDefault(false)) - Preferences["download_folder"] = uri.toString() - else { - Snackbar.make( - dialog.window!!.decorView.rootView, - R.string.settings_download_folder_not_writable, - Snackbar.LENGTH_LONG - ).show() - - val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath - val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } - entries[key]!!.button.isChecked = true - if (key == null) entries[key]!!.location_available.text = downloadFolder - } - } - } - } - R.id.request_download_folder_old.normalizeID() -> { - val context = context ?: return - val dialog = dialog ?: return - - if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) { - val directory = data?.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR)!! - - if (!File(directory).canWrite()) { - Snackbar.make( - dialog.window!!.decorView.rootView, - R.string.settings_download_folder_not_writable, - Snackbar.LENGTH_LONG - ).show() - - val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath - val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } - entries[key]!!.button.isChecked = true - if (key == null) entries[key]!!.location_available.text = downloadFolder - } - else - Preferences["download_folder"] = File(directory).toURI().toString() - } - } - else -> super.onActivityResult(requestCode, resultCode, data) - } - } - } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt index 3514ff42..8345dc45 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt @@ -22,25 +22,21 @@ import android.app.Activity import android.content.* import android.os.Bundle import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatDelegate import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import com.google.android.gms.oss.licenses.OssLicensesMenuActivity -import com.google.android.material.snackbar.Snackbar -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json import xyz.quaver.io.FileX import xyz.quaver.io.util.getChild import xyz.quaver.pupil.R -import xyz.quaver.pupil.favorites import xyz.quaver.pupil.ui.LockActivity import xyz.quaver.pupil.ui.SettingsActivity import xyz.quaver.pupil.ui.dialog.* import xyz.quaver.pupil.util.* import xyz.quaver.pupil.util.downloader.DownloadManager -import java.nio.charset.Charset class SettingsFragment : PreferenceFragmentCompat(), @@ -48,6 +44,16 @@ class SettingsFragment : Preference.OnPreferenceChangeListener, SharedPreferences.OnSharedPreferenceChangeListener { + private val lockLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) { + parentFragmentManager + .beginTransaction() + .replace(R.id.settings, LockSettingsFragment()) + .addToBackStack("Lock") + .commitAllowingStateLoss() + } + } + override fun onResume() { super.onResume() @@ -89,7 +95,7 @@ class SettingsFragment : val intent = Intent(requireContext(), LockActivity::class.java).apply { putExtra("force", true) } - startActivityForResult(intent, R.id.request_lock.normalizeID()) + lockLauncher.launch(intent) } "mirrors" -> { MirrorDialog(requireContext()) @@ -267,19 +273,4 @@ class SettingsFragment : } } } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when(requestCode) { - R.id.request_lock.normalizeID() -> { - if (resultCode == Activity.RESULT_OK) { - parentFragmentManager - .beginTransaction() - .replace(R.id.settings, LockSettingsFragment()) - .addToBackStack("Lock") - .commitAllowingStateLoss() - } - } - else -> super.onActivityResult(requestCode, resultCode, data) - } - } } \ No newline at end of file diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 820c1b4d..83022f36 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -1,13 +1,6 @@ - - - - - - - From a973cdfe0b57d44074cc1098af47ab4af701c5a4 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 26 Sep 2020 09:07:52 +0900 Subject: [PATCH 4/4] Download Bug fix Added favorite to TagChip Improved eyeblink recognition --- app/build.gradle | 2 +- app/libs/recyclerviewfastscroller-release.aar | Bin 53588 -> 53539 bytes app/release/output-metadata.json | 4 +- .../pupil/adapters/GalleryBlockAdapter.kt | 15 +++++- .../quaver/pupil/services/DownloadService.kt | 24 ++++++---- .../xyz/quaver/pupil/ui/ReaderActivity.kt | 21 +++------ .../dialog/DownloadLocationDialogFragment.kt | 3 +- .../quaver/pupil/ui/dialog/GalleryDialog.kt | 14 +++++- .../xyz/quaver/pupil/util/downloader/Cache.kt | 43 ++++++++---------- .../main/res/layout/activity_main_content.xml | 2 +- app/src/main/res/values/dimen.xml | 4 +- 11 files changed, 77 insertions(+), 55 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 48249cea..5a64e6db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -108,7 +108,7 @@ dependencies { exclude group: 'org.jetbrains.kotlinx', module: 'kotlinx-serialization-core-jvm' } implementation "xyz.quaver:documentfilex:0.2.15" - implementation "xyz.quaver:floatingsearchview:1.0.3" + implementation "xyz.quaver:floatingsearchview:1.0.4" testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test:rules:1.3.0' diff --git a/app/libs/recyclerviewfastscroller-release.aar b/app/libs/recyclerviewfastscroller-release.aar index d0f8ce00ac5a31a44b329e9b8d0907c80dc2dd15..896f7d6d9187a0911645a70074d3518d3f150992 100644 GIT binary patch delta 38039 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

p&oMa1 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 delta 38069 zcmV(zK<2-rq65^T1F-2Ze>+fL|5}v*0IRA101E&B0Ap-nb8}^LE^1+Ntol=MW^dH> zjmErVyOWM>qhs5)?R1Pgwr$(CZQJSC=KjC6pKn*a-|4g0*_yLzoviV@#+X-41!-^y zkpCVS5Mmf&unysnpEFtzkPHtH5W)Yd#`d-hjxL5a)(lRj#(#}%e@va+EKS|b44qw^ zjh*am{(EOo`k#i{e+{w!8p{9Epf|QLbao#0hBZ)GUcPOAkz-EWC*ws0)BIxugG?Uq zM@2-F^bbh@sR3#qD0=7=DUO8Mz!q%ehmd2f7u_|FRW$|>Hl@YLs=m3UWyR{H+ih1p zX~J*D=VtmHY;Eqwe|_A`ookZs->myD6_iD2^wv4eYG8w>nr%@ z*Mfcr3oZLKB1(Z)Uer_ASChQ1j;>9LQdbvfZuaqSJxyP`(pqt-ipf?864XxP*^M)n zlGz+x-(Yxba05o@`emD#cTe_Z5io*H9#61%y8gZux!kCUe;A22=t;I}vq5Sbi@p%{ z#(r2ts6!uOKT`b1RU3r&PB6twnJQaY*0+|>k3zXIGsX%_WzG#Wz%naz0e>&UdFG(M zEh;DNQNW8`erx<|i(ohC7mCK?tVs=5XwCP*^we}@+g)$WPiI4vyE=P{?yF0hsnzUY zX`qw!A7PEGN7l{!3WVi{c3jN5E*Hs;N0O;c8maeSYP1!3m1=Mh!K$ zi|hKHxdvTs|IGAYYCqQ69wB>MDnic~)JuK;m(9LQD$8y$691soP*i`ZX3xpN`(CMr zq#8;l(<|-dZ2rA-6>t`t>s7<8#rk$phR8dIj-VXAf9g=0bA?++$lX9zO-VMTVqC6b zT#ap}2$y0dYI$2lIkWoT-eU7mxz^S@%w=VHk63g`o^xWJv#P9~k}Tm0`bA;bs#a>` z8FzQOZQ7PGv>K5a)XBB!2k-@{-#D_wFZMA{b;66%%FMsIWc z>F=79-Hotdo4PQ3G?q!`7mX;MF~r(70??bYf3gGo;<=qoe{$`GW?8KNUHqe~p2JFK z#acRP$A2F{Rqy#tWNo%YhtsuE{7$!k_4~@RF_$L#!LvKxHEYLWfG*wf+os1~pVOl{ zsA~Djf$dycJMz&qqSbj}BjrrC`q+~t+S%L5Lw}x{)CB(4Pm+GKr3hKoa?&X-ByG!Tn)~R@qMj_Pr zk;ZnfR^-*l=ho`pL7i+pbTYc<+Un7DwQdFWeGgIXAcM(+Zj+K8rz?hRU*XHmf1o$E zeudiS7Rn93`y|<<9m<_~iI%_Cylj)i=axLB1cTzKBR*eG>akxtNxz3H=zvb*PAy~u zr%U$fm6JtW9+#nju+=bjQxmplJHXz(!O6Q5e)rl;& zQc*jG{}pzHTbHOS)pTR<378+pf4CKi9rh#7yhO$C&a^~5aU6g)am=qw|B~tScT9~Q zDM2SLGSs$h4d>s1VPd4X3_T$kJ@R?|p%9;$5TBh8pP)inP-zk{*F+Lkk=p~VxIGhr zKbsG`aBV<;(m-#KQ3yXug`AauW1ye#FMqF}Xj^UXY?e3pcJY!cce|Nu|kdC-s zzJrT35mmna8U?9cFxBFX`d!qbWi$f?Qt2KHtMC>IcdGoV*BsGCGVYRh9YsA){D7$I} zs*P*jf=o%2-e&0vE24$*dm-Nzf0)w(CFBvK8##Uz*TUnV@EIQU)HPTZ+DF!wjAETv zSPDnw(~~7!I+&LN^5C|+_vt{Tont1TtZ2g)m5kUhj@Jr~SPNLNfA61YIr^nxvbbrt z?9$bYEezWPj>KC=)i!=9p^JqIM<&aG`Ql!j8;lW&ZT%k1heB_?v;(-3Fdtc%P}aGk zoB+Ox(8*pCB=T5L%=h67?8e}=FSj1M6P)2%R|IBXS7I>ISKmmXVeX8iFo&~BPf+brAH+a*sb2iX0}#6E_H^s0}n zfO&=}+zeH?#1*A6(h{t+zldPm=sP0_c~(m!#T!5wbel88f6ihld!t0_2q;n4%<>iI z1pbaD$*Qv4-NCwD6(#ApqWqw3D(_=IB4W}&1JaI%s(JYyhwsU|^(+(SK9m?x?nPo> zH>_g`X_GZlj+Q(#TBX09!HR(MZOS?(%F++42l3{(g5|H}lh4acsZ2*mv@sxu+tn&( z0MOvy)U-C|e~8Y1bx-Bt^blX}){vLZqg7(P2@!xc(Yu&5+9u@$aG_Oa#4fDjFg9%y z>Y;G-#1^@;)jQLD%JxW0j@u5VGo;PD6u*TR_+q zJ}R4-QZ={5D0R!!x~o)#JMBAgBCT;Tp<9a5)%(52e@%b?kX;}W zycZcgL~2%JRrzq}b||Rh44VTc@b+Ws%L~M`=dm>6bTdf}Kq1;%rwP@Whh+8AwHtE# z@mQIdAALs!_up#)$klU--0{d*0!meK099J>9gBb13XLRxtu03r#<1Z&m`O^}&18xh z?-Z@bf6KqZ>Feu<-XEnDmR(%1=y>ts|2YwND;0woAIbpBud!$)Swa3cS%Ghet`7aB zG7$-`iNRc5P`633tRodkDdqXV$Ae z4a$no(Hl1yt^@ET!c3UBC?#!f5W%HC^X$k)NM0GgQyzpfxT(QAMMo&jD-3wJrYk0I zrfSVJ<{hLgrRr$0S2@xQt!!|OlH_Q}L@p}xMVw8Q8$32sCxoPyQOn-Lro$Wr$%8~y zf8sX?$bJ{}NEk>nZZW9lC8F=-^^4UT;~k50K2f4eQBNe1+?A(HtFRTR9*ZeY{>4<$ zL6|>M(qlz|Uk&{XiL{ZgO-y(7MExbUjw0o+ELg2&sm{Z%t2d6ag^vm!fIUDr6DE%} z?~M24?1o)i*66{&dXg zvXxlRwsy>0T-`+zm4a-6*AB3)VX^v4X{SJ=ikMLL8%M*noknT8%cd;7afesjsIQfn zp^HJpUJz*GmURmkbh2+S5!Z{><6)&hzH|v>e?U;C zV1GUWu7-@8Z_Ee}%TRbj4$d1MW2I*rW0-U9R{~N1(6&Z{A!(l*<%4P$Kn|QHMEQvH z^xuwevQU-Z9I(M?J#0E`>%{?buPtab<_ZG%Q;rO0z#D_Abv<`}vK^cc$2QXD8Yw83 zekANHwcU-5E>|CCA8qaJx2Fs3f0SDLYW*YKC6(O{UsdBTE7q6i>pz;zwl2|`AM?_0 zliY*x%=h<#to_o-c@r&Ah1;g%A`{%+`3js`EyN0#=Qn4L{joS%0#z_%{5tsamXh<_ z@rp7_Wu|3pzy8g!i*hcgHZmb^Bi}&^Gnc1US;C5I$B|tg%g?<0LyYVse{T5VdiZBC z2m6gb7O0QtOkaJC2+UyO5-cuY`Njw-#(2vA-eFJj5pP{rU;EBG&nPznVtae^D9c^$?GpfB=;0qSY1RUE&1y6Q0-ZmEsexFyatMCFen; z?p>u?9t$NN-j1{oj(DFwhBH*~q06yqEHUXVG{lu(&D!?zylt-!=e|HfOwj6I0a~Qm-D36MlSV;%j(aF6SHe_kc{PGdjv)iXZX%DJy{&VTK{uZ&o+w!vSMeoZy0AKOG{8epBFG*>(RjZDlATCBIdYj}#LyTZ)`&vagEx2fTq z(8SHO&*MeH8Bt_=XHzp@dluRddi>D-@B+itwgD9Eter^^f6@d=Wk#<&F!@|b$HSUw z;_~Fu5g%H!qL#OvV`teJ|1CQ4z)~4zUJ-d-jjG_psa4OH>&>#^I+^zUeWYW5nN)Q% z=(vB&<_0Qh4rwjhp=Bz)J-#uox12+DP;{Y76SxU>Ql2oP)-S@LJ+8J1|Ars^7lF98 z|4l5tT#)cMf0Dc)3RrE7HLuc(O@?5eSj0e#!AgxrI1^uC=ucqh5wwr*@)&HYLJ+!U zBOs$&STDCCN^;HqoTIeNOC~8gy4X0v-XJ^VgXH;03=$>6;yPjQt!(j6dOrOb=U}s{ zU%8AiOGqhbG`iJSxClz9yuO-rjB(TK(u<6&3AZzee-zIw701$xS8-(xLu@elbPd%h zAHzpfgHAOZGC+4aFL)rf$f5}RSQir^HFzN3vVtlirfv%V)dlzU@wKni9C2&7rdV|3 z&}_AifHOU&F{Ah`EgM(I3T7V);XSG~bL-MmO}GTuqKvA4xD?<3BFhmmsZEL+!?`{> zkGLSre{(Fs$Ya>rxlYh@l&yzFT?n}rHXhgzHG(g*$K5(Ld_90q;EIt)7i#G?+KQt} zj?JnTe>T0`4>1FnYOR&fAt(aIih2qUEWSQ6yzu~!uC zf9S%>av^0l*)c4WLp;mFhz3Um*ZUa(9$zi|OB{dCR7WHyk|t!X*0x#Z*38!h0W|CX zC_PoTd;|J9@itagu#^OVl1dR3ODDx6PzYo`D9K5jV@&K=adWAF$I$tEmU;6>ab|rp zg(y3ktDewyuA2JQeIwLm_3c~Nlhr+`e?bCo-5~3IT+a_N-Xq!Fg4So_G0{BrzwmtK zp%cMqiN>3&&t5=>7FaIU89>JXCOLBWKe^A z@G;5}LZgy7R=ZsX1|tDQF9HY~eM1DSMN`R5{Y~e(`#RDk8A_<-#h=(#z`wm%e+AU? zW&kdo%VbKuiptom{F?ms<>;k3fF393q281V$neGgpc5VFuiv(h2T&flWA92Q z)Lf`zLYlg`dot!vV)O^q2A9B_AD1|JwXn#JDa@CtU*t_my#s&O(q_S(;AMNpd)DUo zVEf31V#!a@xg%n2BWRi5%ngCze`G9uk3@0!WFuQ2eyrOZ|DO5t_}-%Ey*tO)ENJ{= z^5fL#SLbJaTNd!*Th z_ZpS&#-Lgw)tO4)H)e}UHWQ3PMJw8mDPCo!Nz(Rkz$l{ zytDSC)H*+~eUfzaWVi*{xiW6p+NIw<*>E#?!v;0}NNdUU1jMW^T3BqwQeoZffg0O4 z&a8=*euNX5s*q#Hlt#KQdIXMZCs4p&A7w^m*SzvcM!zJKe|UOG1XWY(?D^ob3bJ&I zvbM<&U-3#A4xeFj+|q?aXn{X!=C`kw-PzW~6txm4BRNxvxi3|dpab?_O*x-obgk@= zI2N{LIw-cw?r2_dQt?(vVb&GO<_hmNU$5-gQ+D%D zwJFXIY0$#0PNor}cZY8XL2K{5u#ZU6fzm6l-A%PDDSiopnhUHq`8>gVme6o=zC=M+ zbovo5U93DQ_5fSJEl8b^vnS>;`rJU}?qn!aP`Lf%ujH?jQ0yDYT z{X~cI+=ksy{A+(Qd@|T!KffO%BOmw&bXOu&49K3$-%2gCcuV`Of)4+o{1ealHD0PM z_YJlYf9i_1Qvx0oOcZR12Z(s+{uIsd|6pwc`){;iLYN6)BCQ0+onqhNuk1%~_}%O) zw_W?hFx!Udwj*vxPN3s>5BbeJev5qGL9vw#LkurzHL>@lT$2;}`^9(lt%ImGye|ZmCAh0Hl_7?dEgoRM+$MRS`@*3iMpHToD zJFr99-%%uap~s<#hkR!1Zo#1->3_#Bm-KvhNZ$M{a~1);tFO z9D{`3sf8gjs498zTBddG7;!FNNjfUWY@CyX6gJJ11zSD5(esX;9{2_VsNKmO@pLUxo4CF&3PGC5@8D;OJ)t2HwwpqHJjiE5roQwtJl? zZjWiH=jLj@D(vAiava|3I)cc%1ML!P-p#t7R7$Ny@>z-Jn!Mmydv=sbR}#P2t67Q7@$7_3#WpBLquw>5M=h-8G&d@t1o(w%Mm!2Ri2$NjOnRslFiL#^USPk}e} zqO97XhIj18E9fK0OQ@?%s3VIUKkrA}tNefkKsoQ}piUXXK41BP1g!NMro+2eL=LoAzmcx6+U0B{s{+OT}36C7Cue}X}t7QYB{rSDLvcpS@` zqD!Z|a^lJ%h?o;&Wq-^YB;7LDd-IrNE)-U?u(0Q^`MF`EqZ7J~7PA}{;}M)@^I3(LGP&(_2WJi4 zS`udG(^9-9f0F?!!!B8OS#LS-9RxYSmrc}nsofHC$L;5zMd3|fK3mO(X@+iqdMkVB zP0?lqX(HhP&%Sa!H3vE6_@OdxCZ;_F*e|K_#8&IA>{TF%6)DTC#zI59ZfA>F*nW?2w9hcW-3=wS_Yn@Bf zU8l&_Q<55I`h+aE9q&{R@u0VnnQ?a=dE*O-K zWcj`F+xJ6jSd4@3WwmY9-pX)ks{33cL9SAQYs#e0 z4GT^j$`eJz5fP=1GkfA(Cp06z*>EorSVLN{SM*ak-HqZFF)!iX3cgS__Vm%87e`mI z0rO@u`ki-Q@}k^2Yj)TBd1O-bVe$x79Q;0+F)#`c>UxMC zf9PH46YKyoM1i6E*n|mz0HcYd<&UpAoC`MZStuw0Wmg`&_O9(%)TrdO!1eY*Z!wf6OsVN-kC`RQ@wwg6 zd;NOH{xt1yuQ@bKQ^|OOK{tHb?V8jBSO4Bc>O+wS@NXd;A~D}0GJZRG{+`@;t5IA@V)k}udmnVjFWVx%21 zV#dtM9-J?xVa2Qh&AE8@R|~@kuh#}Ywmy94?Gt6ph{2;`Bzp7!RP9M9YmCxhG!Fz{ zj(vQbeC|f?cLxc!ah@?5c}K1%e`15>4*8ex*B~gnF;V6A^UVw;`?LEPY@ae{eN&68VTuF$1J-==XE4v4X@gcnwQKyl};wzD>fV6~-!w z^JhM^N6J$M8OMZ=-K4n$IVvSaRjZpW*kCyo!n9jO5SWrMRa591KFOnn@_l}qi&I{qy*seM81$BW;aCcA)MqhoTT zLG7CMirWrA`8_1+sbXp$t@o{@_*5gzP?ySg#nqRi-<{fxZ46Es zoQhaCOJvmkk?zIdwO-~KT(KAQb=%5!KHSS`}^E8tPIVy`%nP z-2&cC2tQ?wVvTn}ZNG5up3~?u8vS`!JU3Uq6N7xrXN-Sce=2v>3%Tc7^zajR{e=Jd zL|7rH;ishajj^pVJ&3^IhJ-?Zx6juXxo6+@xeoN1(0F-$?e^pAGV|!!`LQ@6QM z5rG1|hC+G^f2#F9pPdc8R*(I!GoQ0P0KSo!ryo=*ujq8w3RTy?q#vW-krER%O3xK} z=bpZjaPK!S6Tj5779*yUTuL1>W;(5&RYx(#p<95ob`xHM7;VMWy1{7c~p!He|tpg_3@lyvT$Ogb5-}dv#yaN zV`eA8)HCrIb+OB|Q0aM)TubBOW5#*>D+pjdm--)g9A-x-W|Twol#$o<*>cbeQVOW3 zRqA1x60WLW)-qht&zFb)66!5Z4WVDRwz0t})c8%_VU8Fa?%!Z#8Zk=9E!f|_i@Dy| z3sW!&fA*qxOqq5Dh@eWr9m92t4ryDaoUtWPCjVVRVY%642l=Tf-I!(WOfRo>;(E=p zdFpevLUcxvj0RqD6_fd1PUS{6wu6e{eg~}byn*>cw&^9ZC_$3hR~}8|_;P76WVJg(4xg?dBY z^2;7gslKCR-;Qg>{x@sUpkf$cG!i$wRXC{%lcG)hn1>dz1*BAQ)8x=It9k60aVD|( zt4$SsWt1v05Hxi~h4dkBC*rhA=4|0*~GL`&QL^^0j+^@LCZbrF2_CWkjkAd-3!CQrlsG%P{#2~DqfAsXhFC^U-}gnb-2OTT*L)H5?=3 zelFA5P59jxERa(b0VwXUaP7ofW*qNaE60sY$Vg8Aa;5?V{jSRf#5 zd4k6)2N@eaJ9bl-s6{qMgLKc3A*(ENQ&KrMpxLKyd#{3UJ7{T#11X0kD2R;Qiy(%I zTwDI^v0AOIUd+q#WA*e3`rX|9naT8B{q?yS^Yy8#`g-l_A^+nb&>8=|e^piC+m^d* z^wDRC9qsgP`K0%q^Jn$`!|a#<#q!D5_ZsBq5ag$Ezh|9b?Vmlt~L?jDQOz{RvQUc zY84sq!PHfX!I4n|o~mmG5`FT#9AspoP^-Eja#XhH-5O|U*eTUKf0QKHsj%((k3_)M zGuKH_$2Z^aF+q<|DfO}ibHss8l@2F?AMb$@Es&rJHxbBU-njH?9HYVPFm)Dn$W!8Dd zUG|0OSh}ufyg-=T^N}FtUDQ4u*ykSJX&c7U8vIFk2ixeAboQ^2(!yiMrbpeIxe#aj z7T)ZEe#H>nXHLjBw@m;|i}y8a{WH#kGl(OL4@qk;HcZ^MkEk_FfHv$|McERbw3d@!#YCGF4#{Mr-iY~fvL4k=nxHi#8+3auYxy|GP_!a zAb}o+enY@b>l{%F9zjSN=Bu@v*(kq)S*R+KU~IbIe-ta3eq0YIwH}et$S}o6Dn>;p zu}J~<>oMqQ6&GS`a*jFbKHTTJKI8*&;$i4`Vv^!V{+0Wa@tFO zS9XYjjCoR zU%B-n z-`cGodzST`gZw+pdQu{c>y++*s6$zbD%@G34Xo2-z z<4*aAx(+i9U10ETD)_IP*_V8=gEO7nf9f-56Joq2Sz7@r@-Ek}m?EIsxM^>bC!iFMXE@IvE}A0Hpd7)37_XEw>UL_Y&IK1uDb zq$(^;uYAbxIUc>dHN#I7hYdJwPBBnh;TRx;0Z6aCAQS$;zW_)w#;{o|re;5ke_Zf& zE(h#fCU0My+>g7rj)p7}k3nzWZExQ}@1EkE;oBBX-%;-#>lHt&yUSoBaejqw8hpst zQ?VJHS9`hNCFs9b0{cqe<%4u8lUBo~&WHG|X#MB_5|nX_T7hv2l!j5jdejI~bZN?X z1!}`A;2o-5BBP*C`ng*N&r6J4$f!T?7ZsC|)D;y|N`us}9_R^+fI5>} zCn8h`EJjU{v`Cnv%@-YTf~6tV`IWCKlnHc$r6H?IsMG4!DFf+7U6IhBe=*DkMw05# z8g>JvNnc5A;^v6^8Hj)7D|fp{o~9rt)hP~;!}6hek^xD9WRH?-w8SKWQejf3sdb`X z+th}cz$+`xRH-(Zfn(H~IEP|jC8-YGJ}&HPMenNQ8u7j{s+&}s-T(rsU6Mm0Fq3Sn zK+i7u))BTyJ8T!o?i5=p;y%B9se?S%fuRUsd7m?dXFc1)OC=d|k|J@!nf2qBln5CVivxTIc znT?@~DJj$cceA=$MOPk85S?#PO)G^OQUGPHLxr}u&c6(%>{tAnhA|irn1?jzX0d8# zelgP|5e3{m5MWef%D_G-6qxXE2W7)1lJQyNaldYN7MPjZvELQ&0c8yT0K~evrIhHU zx2RY0(67c&h+FANf2J*#FzECrGd`FFSE6*1Tvk{uC2@6+>yq7@DZfT+jXN8;*tl3t zcxQtcgA5u+n03!>RcrOswc4t`%8J|AIu$2hdC^~07YiFC`-_65AO%EGU=f^^NeS91 z@sY3)iboMYWpT70J88D$*zjVt#1uy7f26vW6O-*ah~mSBf7BQ)FV_679u;~(UG)wL zP%T_?P9j#ahQfsxp+#14G%1uUV4az3?agF-c8`{z7LvB|doePJ;$!XUv5X`o37CZt z9;Hpq*{b=A;F?N&&Or*wfD!Il#sy%ZQ$QXS4Vf|KRmi!VvqJSbHTQVdhn=ygHB^s? zSr9^%1L~Vue=K5%n~q>#qiaiub+t|_vCHyKn`%d(v-&}r@yP92p@N@sAdj+z6sHV) zkBg;QfCxh^j4?erZDLB9P6!DcH5^31)lPjB-HLoeh3%%zkds^Ok^1VX0x3pxT zk~N-OJO$6)vh2&C{*A&u9i|li)|VR*#9FTg`jV*ofA(63^j|8%swuQ!u)9ssn3#aA zB19P{>|Zj7sd?L}$F_OA=eBWL6`o4;f067y<7Q~}hHDF6DEB9SZZpMLg0l#w*F)kO z1I7c3Ffny%lJW$a9s-(l<+&PU3iA(=v7=0D_cx8^9mhLEN5b5!L^7N#(x#-(&KxMI zqvi)Ae;3OvprwlgQze3a3+;k1n{*3raES;<#%tsG#`g1>>_RO<>H;5$-j7h=eHPlA zXC-PeoV~DpL;GXvLIn22%C^aEpZ81v?viec;Vx~xf7tM=UWA&kQW>#UP=sakampcS#e`3s3{K*;otK~?H%y;wx{(nOz22Ez5 z@gHR95dV9~*2Qp>t{{z{#nRd%2T!V*gI}CkT8c1X`5=2fI zY`qfD|9&7S-7d7jg{Sjc27XB5m5%=n&zlh_?w52YWBJ?4W5MPn>mhs6{bVY~_vh{j zf6pH)&3KKIXH)b06w;9f_IJ&o27S{($E{kIibx>M{MZqpR3)c@?bTOJV`9Gg9S`X}%2(xWm;7F4_hPd+FAo>b+p=-&h1atw9i0j_YD z&tNRtPCRlO;di~#=Q@%24S;Ku8wY`de};Ygk(Tj7}?1ACGtE>}bv5Ahj!;udS%|m+f9qo$N zc4?6_Y(cBJOYC?Z5iqA{4G zp5NrW=}oITy^ic*;^!pQe)ff&(u!(7SF0Ii)DN5XiC}f5|57eDw@mnuVTYOCgS0V?SkqrJd%&0{mI6q(v8cI_^@+&$23Neb zAs*uL!V#9w-=W*jxaGqbjIy;ZF1TMaz!w}f;1diDht%n&m|w&g!6byue_<3DahJ5Q zwseAWi}rsDd4UO;JpmE~Bp(0*qW8ZPvZ<|u%U@*&Lt|4(7gJjiQ)7E4Ll;YXJ5uKV z$2gkRww2M;(SNp0#>t5-LS;|<$5P?=;h7&bYlHq=W6f4DgnDl|Uw8k@;@kD|{rUK(4~jpq z3ix-ug+tVp%$Vgg+|*{y?IyoY6*ijq)8rP)=nnsUO=rQ zc_hL$x4Fv0nbt-C^`DcdCZx3QJ6iJ}!Woa(0kzqNr#0#MEZbs4e?O)?u8b1s#ZHY1 z+~U!XBU)J%_d~}17Id>pBoL*0srboRnx%!r5nU9eKiX3jsRs zA7aeY-OOY>y88HXObs3couJPMDb+Dr66A)KZbe)Kixk=1@KO!k`NR z92lq7QU~W#mX8Dee-QCxhOf3lz88S!d&C*|8xROa=gBdOFbXm9ZhXFm#$ndPjuQT0 zTPe&E7_4R1YGzS&bSW_-lvh1UIBsj+qEFO)Kt|sHO!>C0tp?|kcbg`|s8sfA>Lks6 zPSz992wxzWRwaWOFMq)uf5A64DtRRAXD(S+t^K*9E9*4Hf8e3O;nqt{UbW_ukI^U1 z2FK7gBp*C_Hff4+AKNX_bv-#tUscL}yQ;{t0YJwUh5jW|CjTfCYduq>4v0x_Im^sC02e^Q;qS$qasJJTdK@};&>3c4yRbG&8Oj=05lcF~5#?Hf=Fj8^g*J9ehE zGqU{qcfT5e8&u${7%hmSN4EIgB^KmBMui zdFr?nl>>||{5lXj8#L~CEsC=ct>_1?Q>5=`I;sIVMyDV0 z#D5ntf46i;tBo`AeO8*_f0xj7ODbour05UNKCp$%stnccJ6nxLD3mjvYe4SDa9-1l z`>-Z&Mo?J~jKwhYB@?g!Lce1n2p~i1Bs(e_vCZbu1OCK|g{z;-LU+@UklLuE4JTj? zb}>64VzLe6j6P&BBj6=nv1h@I{26cXt2Tc9e;U5qoJ$uKR>_H`MIWJI-*&YkY_5DX*mlp_Tx|amGgP=^D`vOTq*5u2%Uc)3E3u4=%3zFS zf5Frlz&n+-nu@)fFqKm@m55O$&NPj0tege=Dv-|6vhGrO;o8K!t{W~!Z`%Gl!cGfU zf2Ug{S#=bbScoZ#J#nhRq0T@IJ>sG^aB2lCMq*kpcA(|JHNJE zCM4PH4pbghcQCV(@Cpo3vxWQ@WATCve}_N6k=bb|0o613M}89y;Mx@mBMnzBUz?ZJ9ok{gQh5bxw~-<4qgi#1ID)r|g^ zZXjW3XJTWj?DAirk+F1kF}3@zeWS%r~+(%b`si+b{x@2!ee=@3Xfdc_J z!y}s)Ql=J*c*<59GZWiaqnpVQFMmOWK)~$VGk#{I*lv~K1VSPf97S$A7c|gH!Vk9W zWx_Gh*vK=K3qFO;V+u-=Q_kb-i{38%JDiGakdcxduKxqe441y&^+72uhh9jo7e*ysm185h~2e=FyW#)of2=uN7O zm{9pVcPf4p1e|bxNZ|@+VP=j~B9voN(JN-8SY%_QwTBW+^-uFcKtpcz$sRexHWr6h zd-$Zs5i+Fmg=yoXJK(vSxy-`T5+!#=ola4*X&VCMUm;`GUQGD<2t!{ z_)c1e|HJ@8ulE2@f9$o_qZ{C0`I%1Qv^q_lF9TKpySlS`sLlfaFCFf_^BIwYgMd6i zgMi5WFLkJHVQMF9=-^;!XZ}B$YfiRSUi^a|vRiDCU!!qzkR1jGhmPDF7}4B= zXVe{BCq*i2mAJBbD*hA8dB_=ah;%E?l~dP$%IYgr%JR?We}%Wx%dL@T^G2Y@8=Mg; z+wgsxhwe*^Da&fQ$z|5%vcIB{Hp#J=o;JTz2uDH9#eGf#Wu#)WtYhL8ZQE(se*xV! zwL^J!K7T*oMeFY-=m&#N$rHoo}^_2eVmO3uFS~9^wRi zuCtEh5~o{@f90yw4*v=;Ztkfpui5d%s;c8j4q%9>2JpaF{-20pCFb$oaD9dbuwfJ1 zj9_X~&FnGuwRi!itFSGXH2gb+REVzEfo|1uBNM{c&DE)x?PusYBBjvno~9uhZT5Tq zZ2t7I{q#}8<=xxmUC8C#$c39AyJx75!-{9nZ#?#se@q_ls?BEZg`>L?P~Y>-EbPcK zO2}@P#=6lP=9p!&wy{(llGjN6^rQ~=(>4GxYWYa!0QZIORbPvy?U3T8He*S~mPy69 z^^HUZ&9o#*rVP;CUw-a&#D8o*l=E3{a<%@dtib=rn9@giszh26k>Od(sXc+tNk1XE zfd6sae=*91DB+%7sNGSC4_(|j;waH^fgf7j+3zUQ!5h?(?lZ&HEM`07DErq&8PJ%? zS1nMYBT%XhTb6dhNxjND*jM}SUX<>otjM%s@iFOZF;H~MRjGdyu*v+UB$ueld1Bf# zC=MRQ{e*yt#fSxBQ zkepKP&FbH%MK`qZm>y#GwJw ze@rONGGHCqOxu7S*pBJJ0^|_Zh;wj5&;l9Xd2>Dz;&jS4-55ruZ|ReQp`p7Kgdwu& zL;4oL+_<&i8@Ww;#Lbq3{^C|8t*Z`9gR3#>jG(_152viVgo}?qztF~eWG5PO%CY*H6CoQ4q>mbI4s&esHj2Q3*t4F(Y};D;-)^A8fQP`}9p%&+wbJaxVJ1?x0GlC6dPio?g2GR{LnJJ} zIKh|zMNbi}G2PNwT2y%=6oO*1l~L5tQ%X0D+|t;j9Db#J3p49~N!-*!QtH{(uz%KW z>^x`N***+b^c%$dK7R3q8ha$G%tH@yLR$-6FUI%%>=euN=Yo z)?&Y@3?PG8a((;H>-@jhf-G6$$>zQMWIcF~}o|`P`hFja|#tdkcihrVu=zI!< zQiK{QbkyXC&LCMnjgr|$tqA=46C*eq=-4fMGLa58eF==Dkh#ibtEQB#H>6*Puq5H@ zoxwK3aOB4PR0VTa3$6Oet|njXmKmnS!~eU4DOoj!6SOw<(=2AEj`C2WoazmCH=JcL zUmtyOABs3RJBbG}3*9x0b$^gbnq)_nCAJf0Gjrt?3}bM1a~Z8}!u%0R9ZoiYR6<>^ zz!2Sw?sh?b|6$AebZad@s}b4%>{XJwmkDYtlkniY52L%l?}gVI(tKiL9H%ZlAO?MhVZVT6%vSyd}%&@-pLvemWq>c;vCx3pXz@Lw_)lo4d zt%LJ^H`06JzS=$GG6q9IFkPg+cUsLiNB)*=2z$e{Oue(jXjJZ99D(M$L3Z>wmL zxZ8g4QQ?=7nIt{H zvZL%eg+6fO)`{>a+<$2Uk6QcqS@|wcnE9AAfywY%Sz58EaFWHeK?N@{bPuj(@4olT z`rsrGOyW1dm7NFVb}penDs}D~nf4`Ii`L;6^u$c|q3;ipDMQG9M^eJ-YjlGnn$Bt{H_J0-fm5ea3U5PvBdrd*M z7UuxB<$kRir_ZsQ@&{6@Uf&-lSP`{}mySD4(uHbjB}4&lv)b^&@hqK;C-eQ1zgKK@MXl z_GB_jeS)RNj!2pPB|@Uo2F%e7!8~FU9v*|eLJ@rA0)NK}2VW4Rl%4e%L*>q)3knnK z&z6zr|2B!lA(ThAUYO?k_4E0B@bZ$*2O~~#ad@B70{fEcXZ|i~NP8u$)J7K}82%IT zO^T8)PH9AqSQgh6`8EzBoOpC%}S zfyMd}{lgwkTlOxgufS9X*`d%MUFGF*SMZF4DSsyBUj%@<`W5}Yc$?doPwP_S75t?A zmNKwo!x6;z?)VyEk=hpW$oQ$z>mn(`=@CZWrbsJSoEq-7&=zZ_mM zT9UUYAGN*&>|CQqJOqaNLX2E%?7hu{ zeAa>`U8#H&E+Zo1W9sDn_KGlK-oUMjX3HRQCZjHAcyrpu5W@t(`<1%&oN?RCfq$&i zjTLDtKx<;zws!`pGqy!y-JM*pdKYZ&rOD0C(j2TNYwel*2Mnnr9z$Gixpw{ad&fOX zv#{x?mKg&HdL7(6JLB_r^8k^abceRqNVOZ_!cwV8+<;!9c)VziO$TUFZbkN8XMDl& z;~P$ffvV*D1={gC)Z|dh=D|;1CLt%|S`ilo|iW zMoqc;OVTbkn-N=pZUt%)3!PPlz517-+i@mZx!=mOP2y3ev4eXf(JOLK)||`MoN@*3 z%&Xms9P8}qAJIM4D9c{W3C{i-9NLo^KE>Fxt*Q+(nSWYOxbQYH z-8rpnkY|E?+A?-{m{(I6D*IUhm4-X~2!a|5G`~-%5eHXdYBXD8f zjLk=l$`hvHL}8~1;D!^+X+G?r72ZPOWb5FSM-uWN%N6=Z*wnOw7k}(((8e2qY|7z( z1hl7iS&yl!Y(*9fjC-I=uqKVteJ~VBAN56!q;RxrTb*~E^D;$#?fZ)Glk`R~vlm-o z=g*h+GdAwH)Q;?|X>O$57UyXD!>drX?5tb<>)rLEN&ClXsn;yj#naP~8rBUbxqErv z91m?h3*wXx`5h0fkAL9A$E4YQ_Z22 zQ=+aAd4skrPi*sV7c%u)@9@bM6O)vluSgXsIi^Jum1VrgLw_KhzWpd9sb*J5h7wxk z#V)pf_2Q*+cvrIrbOZXsj`D4`3WfUOsRI+ux-l~`FS*!?XLk$##H#G>Kq;HXy^QWG z6MuZ+Z%F*zQ2JKxrvzR35`EPO`7JY>eR_bQ9#v)7)lKycSLaW@1+$QDi%LNdj%^@Y zK)67r;eDk(Fx!ykwi9r|)%+gv0^gxz-fd-=5YP{k0)M39R5U`lrYkU`JB%B(T>XIf zXR9DwmkPE1*Szz?K|rYen^xifT!>oz{q{e)3IFBc)s$55)G*%9&ncE|TkLY-f+3Bg zGYY>#tVTki;^xMDH9;Sf-OFpB!)~u#p8K6yy1R6oB-lquY+Rad4ErGKlnUkxlF#DpBwlKKB0HJsp2dU@|TbKCDmufgvHuG%g<(7vUzw~Gwi#h z>I9Yys36lZ8wqaR2UxO;TH7x=LlY@9wK2lU52X*64KFXxweSEx14l6EKg0~%V88ub zHCSbMSpD+hyoeT1`&KOD-Z|qoH&iDbYrUA@XMaV<+o-LM5j0>}bD?8Ld!fCd@7Hg` zey}*nEn}3|?RdN?WgO0YTS>(BdGYERkFVCfvYQm2SFtRpQLkt^WyNf!Sp>;had<7= zyw(4e%ZMsS`cUd9G#~GI*u(bn@k-N2Jl)uZ&aXm3!>a(^O)_0szBA6+i!M(ik-(dy z9e-HFJv-&fo`+=R1wvgf0p99zJ&{d`*JU?au=BA zWm72fZ($EA}*7>Da5z2td7ZM-Nl>H@|}W z)tFzq&}$ELoLyrcRVjEFnK^K;DFke9NTY&Vek3|c+k#B-1C1IWre6mGBm4kE>`|h#@nF&1aoPJWDKA{v9g=3h(mT>wAF!1Pb+9YeSrt zh|fm!`+6{b16cJn0a%>!ht%yUC?O4KUCuXh$+Z-`QV%M$Gm8P$&hyJRmAU&#_9=XE zFGg(3nguJiPaFnry4U2i^o)+Uzkd$kELQhrauxx-HPM<`#h<5-^>DOgrAHt@5=F8A zsp@!2>d6e#8a}}Y&?|fNEcO9|R?BeyBoab`Mfltwh5gzE-aKoGAtGb#akUN=)(l*E zy+!AFku{%4*KC4qun2}<%7qP8Vh7tuZqU>bY+BoM(>9q8-!)zePpNZwmVX3(i{fd@ zl!9`K;cH-K*X{&!ia$b~ll2lMBa<}jEZ*>2K#YkfPa5IKk5gl>b|=y{gSuOjqlHVW zR+kV-qC5eRl@IoXQXEf+s1su{4GrkQ>RZ;cQL^Kw11#0V?GI80{uYMR_^*>#X}Pr; z&5laB3R_5@)N&0BzZxnMQ-3po9Mudp4Mh!Ax8$Nxp&W)u#FYLul)m$96Jq$sFbmSZ z9|qbvxSRcFFb!h)PmmO;>u8{BV7$u50Qq{o_rN@pCuZ5~Bt;&)8 zVr0mIZb9+Mrs+1{?(D73LC@FHz%G@lqI$mG=Tz{zf8ICr6NaK|oqsyZVe{nj=KKBf z%jrkX+Z*zC@MHS+>DlV%Do(QUbVf@a54Ks$u}m#gZmhashE{sgh#{&Lym_U(*wy}D z1l%0GZaN@Ra-(ICd?LNvxLj3Lf)1u3!0@POHu=w&#X(G&QchJpO>#NeXvft$wb41N zN`NP#NaK_UqLl+l27jkaekz`po~TYBl}Va>OlE8~PNcQA`Sdivh}NX&*IyZ13#g_& z&euZ`=jgvlr*p_mO(7){6Zt{0EFHIKWA(5=`BSjkr884~JkU}{$f(3hvE&GCZi9=_ zv1cl)IktHY$mk??C@z0I84a&C!3^4faz_yg<*x}P6eSm#wSTsCjgV#bkmuqXC6H%Y zf&)*a)~&Oh#|NLo`f#|hok+s6;6AEMo1fqSwo6&dmzA>7YogX_W9aYnHMV~=t;{{W!Du3yB^-xQ?Cmy_wo;nnouT035 zTWy$c7;@?A@;K=713S24q?~}+Z5O3wjkyS6J^cvZ8Z=e{YAI!;QD)^a?M5LLJMy+E z{y$JoiAFl|T-k4*->_kleAhK*v1blDUfSC`fX#jC-M9nZM}TdN_Fl`L)x`81CXU_s z(>s>ADu1u0ATDt2G?-DWQEDcCi^s1!8-=xATSa>%0eHw040hp~to3l> zmm(Z@;+G2!KbKO&05J*yn5bwL@3aRit6C)W^ye1M`@*dvR-W5XDr&N)vZhy{`!IpJ z`MmVpqu(|N5J+O80BSOI(9HPatoJfB3@ThGb$`FL7ot*C$dWmzm-}%OjeNr6geA9V zz_FN*CulrfB;4B=0$SXLTxh%vC+j-HIyChpre96Z_sVH(d1;i|!V|ycptFGTp+jF+ zAj?R^B(#fDvQ<6vh&MgYsnE4klBr7&LgYP+g-EtXj8s{^N|gBrBQ+) zpL3o^3!dw5;bW~iDN=(1if_Cw-Fps}Q?@WtQ&45gNE{0@s2g7Q*Bfr98^{8Md}N)r z7cBIfxhLs!u+RIe{qJb+bfJ6$bx79w?0;}%E<&l)i?P_dpuA9ihAD|kN&Djr=x{N3 zdmJO36rv^ih$+>?{@e`_N~bo%Q7#<+mcS-`&7*WnZ!SI3ETe%v<|$OkQne2_Z%wDl zVgnetovbxO)7zbLsIE5-la}L&%azLrTQyjg?y(glz+vl z|C0DLYe!uGsit;4p1=W0O)-mcQcGvUx8D!yfzXRC#_)H&{Kv>;*2}krQ13NSKSyzg`dpfMu zol<~K4K!Np%=^n|qrTYWJZBh|OlsH`G);p5w zd|H}Y%2n}&{;llDlxsVXTo6qZo=kv%_!RqrBdXqeaOOTIYopnFiAhJ9%^kzJyV+j%qGy`Fft_+04bfFB;LEeoYM8QYLTR^bQiKUbzL z0Mw7fze?BRuhP}}H!IVB%zuC>I=EQ<$Ha_?gPo(1{r^MlPCDR;VZ57roay0(*^5N% zz7qE%8J0+KFhdJxg;L0?(96kU!pf+Druxzg@oGHACsq_m^6^nVK6B0?;v;X(mot(zdU0~Qv~#ecxU#;@SGmCx13 zp?v!y{M3g7rFu)*l(GT2HLIK-rK#PP-PGMLwL@9fe3dkwE!!Nc*rNFGpnenhw^Eg& zWZsDlt+!)_uYfaX1DnY@*Y;VGo4P&99PC^JXg*ayskV1N@^>v;Z`>52Ke6bOcC|`m ze2M8!U+P>CaN7fr`SP&cX@EnQ)R8}ho@5RnoO01C2H1p!- zix-_w(1Eje!S97Er69~%NkXEWGVw94CwT%s0bP0E$Z$ccd7s?dZetk|HLGsg9bn+1ZNn{k zC&&(szox9Fi1f)gUd+ zA$L8aq!-ZcigUk`aWmx;_{4P@IKIIxpl;};0R?)!;|jb2&8$rf{d)?BU5oW*M?qRp za<7rdet)s0a^jb3{)R<}{!0N?;pZ?&;+GV|z~Mh#Mpy6al$`VZ(+Ltove8)QlQw(Z zm&oB3jf0!zr-QSClWSfla=0hdXj86h#!64WomaLYrElYA3!mi2b@H0K8YY0%iJK-v zJ1bQrYsF3>muiVWr)`7$;PIq>)kFUIw<&vq3BG!;DxY zhXKu?1)~~LQl&Mf8v(<#QbHJP-JLEdPPp88-l+wiwt}QF2V=j03;dIJ z+kY|@tzdtSfxP|JT+Tfv`488;Kb~J61V60_#TdN}C!M@5QiJWXG@H+Ls#)h9AI9f| zM_BDt4$ZAu?lcco225tT4#r^==<$y@I4M==XLtAHb6jRwXK!xG959$*n3Cb?AKGeG z2e~KNI$3OIZL|)sVR;_fw%a(4+pGr_DSyGZIMxKLxtUPHoB&+)_m#6a$TR%(8-^%g9n8;&E3YdzL9f85n+il(XLl|qJQf7 zPDL4(e{K@?;bN@HD}#5OmDPK%hER>B7G17^jDB z@iY8>SB1{t;D*y_$L=#S1BzS^*8+ z#3ez5xWB49R$K&B^9-fH#G!pzW+%hBMrBHbg{TPYr8H8Qu(=P@IjC%(P6lN)fa;ErfwFIOn$M7b`{YE@~4 z#h!EWCpOjZrs;pDNGw}eD}S~~vq_O_7Hv9yR0mh;tgSSR2ky4|U0Po56efZwIOD`J-ttgQjalp^unMpFe54zkl2h;RxWqL5DOi zns2p*1JxBzgPA0CgLB`by}NdHT`J#!j{{UjKYv{&tO&eqpE@jYNwl8LO4yL|2>23Y zIo{(S2tt|T==4mGTi-J6lL*}s{OZU$g+l8o`GlM&{Tg08NJV6g!$0MYLQ44R?X;`h zp(T#*%WIfrXs{~8IDZH+_y?aPRw$Mv)+iQAB5@aM5N?oa5IBejq{RM3Eg7l!uZ9^#agoX#sDGYGa%BqhXXQF~*N4YA z-5lz0u*k^sW7%iWXS79Pg^>Qg39_WT2fq}h^h$b<3t*eC^QLYT9XH1Op2b)hV(*|8 z0XwVPbK}WVm~840L&AOWaH%27V_aACYRO44(iqMxW=go~{mR-|QEQl=9Z=%%k6&lx_|hO48GL;G z@}P}D)72z%M8AJ)$Mw-*WE34glASyfGH`W_>LLBEv)T(H(PLD%DH<^%GoW^ik>ya~3Gi3xjJ$`dn`gXZ!>UUbMjH)g-hY@E?TtGT_5hLO9MayLYEQxQ zKj~RT$bmEwV`XZYdRP5SafKtlVH|T3TI2w?s1K~heqGVstbO$jFqmuTy+XGrejan_ z6xabf{35(}F~EI6{O7xS$r$t2^!LtIL;d>`*B}>1GZQN#TM)>~-qyTW^Zp~ zZ2P}gb$^QfdsQc;nT{A5^GQ_;oBk(aDSVzKo2c<;n9srCd~zPJ!1nAa-dRXyG`}c? z&WuM)BEa@Ek=d_R$ma?0MmF!^*zd!Qwe(GYzjw$>xHz1YxVXiGja7ZkvXSq2IOW6A zM~L1Vv7*GSSogud2k#17D1X>2Od>fj`qzoPV~5vrR{E^Rn}^b6WTh1u}o%MiO(` z#34*xm-Lj-C(dujfaTT2I}sZ6Z}{_I0!_U10Eh`=B2`O(j)N zu74u?DKPQSep1a3Ke7VAC6p;*2BfLAXv?DKw}pbtP;3 z>it0!GDC?u0%x|?|LAXtkP0D%xOO-oT7R#~YOI$g?Bv=&Akr!qFqShn!3IwHL2H>G zDmZFD{gv*BAyj8N(0gvvM`bHK1aLmfcZzVsQ@K!%r>g0bVni(HrL`4s8?mMTJ;Z&F z+1d!j1n_(9CV1hCMtyJ0QnGf6De*Wecwio6P#hQ68q?=svW%V4fJ0W0w5ry|IG*HzXnkMdk|1v zM*&X)<9)y*6FLRrAO(sE^a+wnYBohTxzBLcwsnAmjoNO#pU}|g_n-4hDSyj(suK}^ z$)C?tVOWHuP0AS4spW#@C(BI)y1UW|lAp%8H=ic5T+9!~YW?5dR&5|Sm5en#uSofC z?C2b@WHPE(GOT1V$06g^W3_Y-%eU%=mttv(uX*{pC`ZIlJAN0P1S$;Nw~-HJ^Et>G zWagwt_+mqvK!_yf_jfg``F}FnU%d+HA1-tb{Io0U#rifn2R}HgW}F@Vjg&>rm~FUa zuHHV1*avW3-Ci@`Hop{GV|#x6i$L^yo{7_BquY2mqmvGOX|q>Yz}Yt|spL(SHIGL3 z84f+9i7j%?)`_J*oQ#xYIr<8HWMO1E@u{YWQVRW8*Qj3-lFPZ!o_}|}6)rMU8@A&Q z9|ylPVkAk-C@s%kv<;X;B10;~`VS@Yqg;jX)u#dt&<74#J{i9v$$tG({IbWyOcF*? zA-YhDfBX=lZ5q+av7`N`m7^`2OY5BYT=%ob#6C|%)QFy3y_-^V>6%`q+Mw&`S)XX; zSVX&vR|XTm{n>9M_J7-U_S?2QB$P#iL8PI>hz?={kbSMuMlP?zP?c}1R0!DlIenL}h)w?D}oEQR_feb!Bzc!NQMdmI^wW z=G1t>l zaiK#g8Q%jsEoNKo+TJNKGd@1KZ-WC7(W(??jSgHQe{?1h&Wppy)##RCBgdnpayaSd zIp{<0397njV>g!nx%74EDMoRbjnCY{xRB=^8?cUcWmS88!$)!{I1L&J)<7CR4s+4xR^~R@8 zz0VUWSpjbvC%Sk2B{KKAQ;ID3awe@Vq4hzJ;UuaZ&H%Eg;wFO4{rln~>(KCuP@|Re z4+2yJjdmWyYn4)Je`Po`?j$+7$s&+0_zo_xRexciLk}T^C?Nh)k~Q#3o26)v7p+g+sAHAECY{ zj&iH*ibb;;U!fbBmD~BF_M}gz#{?eyV<_DthAwONi*Za|m)~f%xMZ@lZj&mR0=$4* zZ}o0OaDSOJq*qb$!$O3RkNg{FW`==OiSx3nvAs}lDiC=WaStTRl|e)U9`W`|2pm%R zTv;-sWyVlP6;Qw!4cQF3<;@`C1$;iPH=4bt9q6QB<2mY+YMIW?CNruC{at-xcH*^( z@B28VjRD?T$f`!@8KzBS9#zkow3+BXsesWH#D9!!pHYyLA|g!wnGw?HSE8oNt@}eo zO{zoqr&LEFtmKBXovK?<6>{pd%roIJVIyj%Y8Y8?$J86vCIx;K*aJR}?QxLW-}l!v z%-U>x+&TI&iLmQo_%ys*d|?gWBc=X!PtExqfaEHrQ*7c3{~hnEf`QRJ+^`6hLR_t5 zaDS0VVO%^vR8NeEk6ZA#h%J#&MeuPqFtprg&l+o!1k10wK4^TY2p7+0z})84mDRmq zK))aKW4+t{eW(78awgzYmf%@g_Wf~`F74l?6}cnfYM6EM8yPR zqC-Ikq5?7H<3}Mipa!4@pefd_%DW4@le-(gX5ngWwRa==d`)ni#Stj9{#S*o0!RrF)q0{Thos0@F7SRxIZ=D81!H8q z!)5#-j;2}>4>fhsLU^l8Ulk{}Xpr>I02eqY==Vh7Ou>JoW~T%V;$vK|`hREKOPO-O zk?n^6NX;7TRXU2J%ecXcvLRdxqHL`0k1lKBYx}?jEQU(Ia_WUGdp#yTdk>83^)B*W z*7)U;{oOR$bmM!--hmSQN%#_+Ioakh$2T{>E=xP9lbglFPy)ss{7?zI38}#jK!kt$ zM7*E`1i=NfE;kthc%1Xz+ka8S_PQO91>c;(Q3f*#@q=ISDN1v{?WQ%0*FI#@sTVqsGsQ@o8Im-K{`m`Im*M>rsPU*L3MQUvd7YqoJL4~Qvg9xyheGHk3~pL2k3#}ui7e$$X|3U6j5Otbvm^(Y=5`8t%#Z zVAy2AB76heK(~G`$V_`P<=8BrE-=&&JlG{#Ehm22*JW4)?LQN26?qT;_Yz?mIKA3s z;&rzj)p6qLzsXt{_UuxTgiAj4LbhXd_T)kHa(q;?+bG{~9DnK+48=z9pm|$pz;FEw ziEta2G-G-Lon27ZfMWr%NPY21v(M&X3wPOVR<` z3H|^#tq_f8F+RSPG*4Rhho?loOukOO1S!1}((mA0M%?G&YlnXZ!4;fGPit?T346T)B64LV*N&sIGVHP|awcnie+`YOK|n149LU@EeWSS{*KqqA+jQU%vi zj?4Z-&$G{$ytrNtl}4Fzye<88?A7PK1OxaPNEpxl5*GfV#*1-|zKCr!iyju&8kvj- zBk;DWQxZskR+*6NNmJW;@nhe8X#J#~uF6I0I>c@LYaoeBcjnrC8{KN=3v6!;0EENf z-l~H{{eRTS2q*-?AkGtC^IJKDho^e>VdH4B%R3F?7&jGfFw3E3pqwoEB}rPP7@h7> zndRW8*U3hwj15o!(9EgI^nXi?E;81(h|P0|82u_x294wvMMB5{f+wUUy<3U_7PEzUHx=G1R>{FE_PW4Fc#9N@1dP?WODZWD*Ot42{>iPwpBuv z&VSp5siTzV80u7Z&GLFQ-9oifp{e7CnJ%T{?0PF4xZ_SmYD6ba_q}|J`X47riq2ie z{>=IIFx^p5A}L~%Cx=@Wf}CyIk?nUfZtm1ssbQ` zz71fLhx(i&#dF72zxmo`EOm3LzF>OE0iUB#<(S)9SG~Tn77|EpsQXkW=jMGgQfv3i zJrbC1tcKc~ql1Z=!nDa*Aj}&k{KkI5wm*GkMjcdor%t_RH3ww-?cKwI!|!dGGJkl~ z5lQFNV#yio8D%1WuKz-?K=k++Lih*-4L_EBk;pG{@wn#H987z~e7cCcS{^%B-oX(U z_s$`C!Z*==q{MoTb$a23;qj+EJ6k;4*XQ$#hGo=tkWR2f-r0Sl;9goF4qu*i7L0bd z+ZAE=LFT2Oa^fp&`ie`TeB=@@{(nKZ^92T9*D=0lYuP}2l;J#pTDO;>8pGiQ?e+_r@mjq{jN#OGDlEB`|&dAkF-O9zv*vi(*_1pi+M;z>h{^QNR z+Cap}-o)(h=S}~2R-&e(vMP@8uFjF7DCvln=xD=Gow&4SYPq7ErBBs^)PF}Z=enj$ z$P)GIQvh9?_A=6}Rj9#Cn7~~VE7JIF9{6&JX#QAh83k8%RF-W5zn5KEssFQ^X*J`~|QhK_@T9Pr{ zEJhy4DKRT!NI_P?!jG*R*nh1^W^?a>`p|r)$i*8=*;`E8=|5lw%4WJevQJ%&MqrNY z)3joxJMUm8jEJONcUyERAQ*M_oxBs9M|fRMlhQwIy?{%s(N5w?1RT?E>@^R*A-xPg zr#O-lQ2%{kG{D_eE3b-^_F8ble=ZfB%|Je=Crm(wl;)uDtmQbdzJCh79cY;5Y~orf z)~W^75`CVkLCR8cp~VvrSmC8ZW9&`u&iYOJR}s4kt1_9b|02`NgGWgtpANpH2a@&E zUUGswfZ|0<-`n$U>ri#(NV+7v#AEN6dGct8)mYy{Lf?bO?NVlh&-2I1rkavGbMj^} zTlSR&kRdyk^;7BmO@HtyyjdvT@`v)68jt~hHshhQxqxhbSq#{pRzQ1S-S4hu6icO!$|2}z43UYgp#*&{SuJM zd&GLHHM5;V&P`P(aTm?5O z?w)SRdck%vPJi^sWm5mLARfhuplsJAG|!WP0Xjk0?EM=*hB8t=!UJyd`?~G%c$+Gh zxRz2e2Li$~Y#JwXm@&3C@{gM=jOie8U_te@E}u?LlxN{J9W&_AGG2v#6iLw8#<<6! z{L4)r3-UKPMS+Hzijk>?tyzq$o7UvO>fbk=yU>X{1%FDdIEs7+(o=8*O0N7YJX0Ln zR_T1^@JVyZJa5qLc}273s}L(?i&Rw%`EiEH3*_xcBsg(X8wvCC)2YA~{oZ#1m97Ce zlxE;}EX14=1(imuKk&Xhcf1=>`!JJKoIc`h?__OsAtigE5`N%ELV^784RA?Cs=2{- zlmOovcz?HsH%-zwT|LRZ%K6LIXj(>(U9!m{d}S$VQZW4IL#(Nw8ym?f!Y=G7Z%-M< zEmDT604ZJZO1X!5n1*%5;^qoD2`==8m==#;56HNlHcWGY@M~s&;R3-A*upUKPSr;YeP$ZYf&#w z!k*aTEtjs6oE9TzOInk=Vr0Hj1yf#*-N%gn%taw0YaSzyl!qDn;Myf5@J;}J03sBr z+<&|)rd6XsWE-D12QIUkYweImSsv(#v6_h;VJBUwV*H0R;VP(jX{-J;V$289DfIS} zgY)Wcy>ZtDFN%EfS4xph%=YE@#EWmF0e@{*8J1`c?U@GYjv3*V8H{?=w3`VabaRey zmZBPoU}4E7k$RFfIwzZAyg_AF60fmvQhz=yhHsV0-|vVmG4z0r$+gB2XUIg*veW`l zS4%?eR5&!JlQUYoHgJXxG-s+2??#!dRr-pTN{;N7dW< z)?6k1Z0h0If=G~-Yh~)j7b}Ghzh(m5jwMSTQ5ALd%gmpo6~-Q(!+GV{GTuXuRUdr7Y)2Y%y;p`gkLFk!mr&NOXYNfJ4R52$i~rl z(!}bd#L&XDNppHt;xoP08p~S4@oZn@lqr3S^kbpxqRvR5J zcc-MGJ~jT#!+!}1tGZ!&v_MN^PvRy+?ofM*fwls3H3L8E!*62|o zfmgP%d*-n!`W9N7(d%8CyS75^!bf3&{9B|a-sKf%Nh>{_^M|{7$_b9J*cY#$H@R`Y ze1UxLaF}ooDX-(97tTz`JjI)hhfO=>!brc+>N$R*xPQ|xt4Jo)MoI!Hz~uHD&y+mQ zchq2tB!UJ&LUylPQ3{~YLTReNR9fBwxF%K_WNBg9o}1b3l3--Gz7}krj=@FAOnRKp z+S;k;?n=gd%GI1h&FhoF8)WJZEI}a=k{80R(+|y?W3VN?5WwC10dXwhubY9{fBbtX zD6BBR0)GPv)q*R#{?x}fhZjd@UM@jVZq|9N9z6nnG@S}>zz{ABD8De{)~PIevsOV+i?H8B43F_G4u#>d&MHg#DP}AM z1qZquA?;FW7eypT(U%uHkr=lF*>9|KEKG{ld4Knv(^keQF|zt7aR}%72Tn@M%-4L# zOHi#L;w0z3g~obMY!EXrvCY~_>(!4;v|1-F?}hbv4*pL4YCC(-!^E&Nix7HAr8X0W zAazWkaVFOh^aucd(#~phlQ!k-JpYtr#22arO$IbsGC;hFu1WavL`?HcisczoHGvNp%-DNNp~9&idZ6k{LpVHtD;<(x{cL+6Xg?NCFbKhl9C z?9^fyMn(`#R%Y27(Ct}L(X$*I2+v&raXy|iXI#6Oj@m+KsW|fNK)LiJO5Z&Jf%ej? z#9L#O$ti~g*#L=3q($*c-M+jsJ5p3s=zj`ZQ!*Sv>Z#bnvVu~WvlvzDLHKRNWL}*r zgq6ng$hP9I-E&9;vd?k>2+|wit24w?3}=KK=m^V-r>mKEoXo%q@7OF0%gs-k z$T8a_QM_b-dg}N$G>zf?CQ&Gb2RO~q-Jb!voBK0xKd@~s2#PC7dEIeJie2K2IMs$l4bot5G zsYeTf^+()Hf%Q^>@v|^Q*;Kpaw>p@nH!p5Y_ds~qJ+z>UCfW*{Nh4xzv>)$n&tdXA z4e%4DZ-$}K#yrmhhI&}^rvXMLFI~#EvGL5;es}{|9|R8z&kc5p=iX@B^?%sZxz-8j z9wMiw%>2QZjZ(CzqxjgM@qaNKBKLtKN3KP;EU+f`QlFqp5u8c*-p13Jc`#zrs@;EsUG6!(JA%9CZq$8oHD`2Tb5)fr?F()+6_TRuZT$o!kN_g@-1Rf*&Ouu|QdW6i5( zRkgXoLSni~JrIa}BA*As-AH1@66wo`@H32X43FHgJc`v!Kz%{};gmHwvV6dq0{`SI zJC(km95&W(M1MElH}}7@AKnHR9UvUBi{bbLcn~5T)|u=HBg3swN0-fif!E17w^1!3 zJ6O*JR2sGgknzgrRnKP_qA-3st@0@WV-uoWZe05FUnU@hA>ba<#=Xn5<}T3)JK@Q4 z8lnB0Mw8Wz&?Jt$g^=e^DoIQ4yG`L~jnL2!iAB1(4S($p#AMIE;jO~*&2clq1JrTr zVuNoN+RS-n8_XaJjSLkuA?%t}Y#^%6s-er6rq;EHFL(C19A+V#%4Qu@MjLsEqI-w0 zzyeY30vR~8f6{ttMFx-fsAphrwGQ7Xax&cq@?!%)H?WCL(G!%cseVQY-P-$IjdAob zFG97bbAO9()^29wHG<2fuztti%64Gyw3q#*4NINxy~}w}osk`IGHGp~#=M0Qe2Lb} zj&TDby3~{}_*t<&wDY)<%gEvAK18s&TcvX^G-$s80|Jq_(}-)C+@9TG&x$Dv4Oo`)eB|nRC%mIc;pwfX10c}UB^Rhy_i*c>wiG;j55PX%6-W@nl*YcI#NR#V!^g- zmQwT?zbKNIVjm-u>&{~v1EFOTWh_2XG0?#dx}yCSn&WDS|9t~p?JwUZg3{4tv;yXA z2ZkL}NaG1%4Q%5^_g2}ff3`2!=ygHVFu)O+unP!i@3?V%pZmiIhTsC0F?~#7X(BLC zF@Is`sya&b)CQtLLx-dfUIH0Pb`bPm;Q#p)qhhBAG5tNkSTGO}n*X+f{Qn3aRW}{* z#8BSvUw0YgS9D3_P8%EdPm~9roMNd_(1KOPVsM!hxs}UlkmsN6lWcu95L+xnf=jO* zE=SO7B#EJrsZPlJF^unb8b7U}!5`aun16SrJ6If;pT`OMzYuiuS2FuNpK5vU<1vPN zhq3IGMb8^EehFzgAty!CMRe#{J@jH;!WPna@Lthb-%r3o-1rL07#pr{o72?Ry6SZ6 z26j(TaD0p=OXvxr_9&r5m=gDEbm*4wNbZEYcJV_s!!HpV+Q6xrxET!VV-53Y1b^g$ zYujzfCbtMLKRu9D-@h{Qz>-SZVc;CJAtY&r3JBiZDB$cAdQmhM%7>suAcbv90c8}L z>sR2FB&fdsui~ycD#|x)BND=I2qgqWk&tF+Y5CDZ4Bd>X?6V z!0v@kD5d?_lU2dGKF8y9)OE7+j64oPY?W_+WQa^Ecu30CJsHJR2_}$L^Dc#2bwlEe zH+-w3BMm?rZ#_ed7tN#K0|FnS!DEo82w?HX!n*EbYxv;$!c6mPgzr|_CstrAQ@h7{F%qpH-^eLI`+sE44i+&@!H@K zA=Nw#(~ojRJEX6XGF!vBxlsK4S={U~KDYVxXX))yWk<4`G<|t4c-KA}?a1-I3+&HU z3aLOyzpF6LA3WWg;M>scUT3{s-RLUOm~z{dH;1xu=R~F8BJ2eyTF!lG=Vj>YYDpaJ z^0EE2R#38_F$>rTG7cf3rm1F zSarlHcsE9GiQtA=sExURQa+`RJk7~xR6ifXNHAfmsgGu!rMZ+97YBdu4y1V6W%7sj zYVXc>0pBx%Iq(Nl_oJU4=DVvAB%kYG(Q@{4(WrpbP9<~6c|5R;1$$Nha(xvz9Xejn z)B9OtQ=U7?I!rZANROOxmn1$u#SnCP>-)@-dS=?z1Qj9euU!l+{}%Q-)0tA92_z~! znOK{x5O#|tX#zj|)INVhE_+SEZFGOiYO)eG>*B3eh3PA-JzUB=<%TtmD)EnEkn#)= zKx{bq_W8VTpiPI!g&8ND)^Iu6J`~@sGPvnKDEuYiF(sa1pfCvjW4Z5scF(#T-2(r; z9lGn2O2m4BO2q=BWy!9^JA^j!gB7m9^Qfi_#g&;T&uSlz^PGRb<_{b?xK0mU@%1zN zh;kZnYP>3qa!3NYe3DT2U^5pSiF^&iEW_XKKKCr)6<&+bMNO-rGL$ziGI3(>a>$4> z4DH8%60>&WH{X9(D*EhI<3bs>B@q#ICt;E3_uBKWsb)fA5JVaY+^CYf&5m!yAy!tj(W`~ZLS_FUhN0*?eMv&*7o2`9MH{Gei zjmsajSe=#+iydLTPCcTC2ML^`U>&6M5tO<1p}T){WsYPi8QK0Jx2*|IF1Xr9v!7R8`tXi%Z$pcauWK zXn(@$0Br->Xz7-_HY^$Ef6E`7sK2{e0*?EYKfr$${-6B8^77Dain=GCd_r4jxUaWy z;JiV?Ex(N>l;nCUy;DAmiZ*F%)|eo8JzRD%2v+>Y(l{S0&ix^L;H&A@LeKIaBk#7M zH22mQh7RvaGE_i{<@2?LaJTK)`{o!~cSiBp3+dv6@UB~~3js)`0{Xwh`o+|8^CEC7i;@Y-e2iN*Nz+8X9 zE2#EUd$O1&8(4>!|3eEJ%O{X1?LTjhxJO~g>h^ZrF_(@B>0Q@*XOxQbJfc*#yGmqe z)2lf7HOqwy^sNRmO$MGN9gHiJZKLGJB1ag?pQ>!ee9u+)01q)Az!b$EWx5buvQBblc&mJjw>kdi>AY^dWmt zc(-pSwp6}m-y1N+J@bxp#ae4l6@LD-?gIv?ib$n-E z1rZ{a8yXrv38iIEHcPm(N@Qg<16h*VlRUZnHRSh5lJ$~3`34-{X7r6PI+%Y?(v_$7 z8}S7Zrkg^{4Ctz?pBYEY-?-b41wds3YV1HwP^aYn+GoMTZZ#oO^d}<@D68}=1 zJ*y5Ym)FJEqZ_>eorm&E>IQVazHLbFTze`)=IBtNA}LVEZF+MvsRT_88@+wxI*|lO z>_M)y;Hpb0HUZJJS|*KE;n;uI2c@|Da7~#q7W?d&g5kvb_+s3g-c+Dk_seU6OeT*+ z4amA&shx4;k@Sh2W0FOFAxdSDVtjLIH>ggKW>#V|(mN$ZuX`ydNrO|bDEMn; zA0wm>Qt3Fn5(L@PPcSTn>H-SAlf(DiZgE-D7s_7uCY@V14&XEWcnyD6i^OOZjAZ*9 zuGTgxc1P~zIwsO>gxpg>&@X^3B-ybbP$_h5>-6DT&6jyHu1I>p2LHfz?ns}=YtZi? z>uh2BG?JwgGJr6|wj4gmrPG(k`S;sz|JU7y-fz|wHMn}8XP8tp^2_vq7pkdnQ^z(nlb=2W=*2H1%%*aJK z7?W_w+n6P1(-N!L1#*^D)1ZOL_pd{am@>CtG^UDLJMlHo}_c;Ei1;bCq-zx_TOo_62ft*x2;Vdw@we3tOg zGNaY|hi=)ju8@D{H1*K4(7T(f>4?^|A}!-OCfI4UR)tTd$0=QW_qhGqL3SFi$Y?|w zZ7O3b|FfsDEiw_AY6YicZzAjZOP*lL|Y@n8z!8^a!9Iz!@U#KpiVb~j~Mf}@m$Emmt4D3BNsUn zTELcW!54DfNfB=5T_mwV|H8y;2AcbIFRz1dJ{K==<>mL(QwpMMG^@t*xC<7L+7RK~ z4MpF@g=)8;7E4?*8l_#-XSiUiv)Z*G;vkxBk@US-JZ}_pJD?5#FJpa<_qmBudJw zJvlL|MP)U)Holm8VjCK}S9P>xx!p{B?@YBFq2CsGl!ItWIo|l`dbtHZTpXPcU_5Eo zzg)w!-O7YfRyia%<00;?rQnkzkHvpe>xFa7np~=STpHVxt2tywIwjWT*J5`e6>9Ac zA$tB+8HY`atachK+ZS`He&JN=N~HOWi`c&m{27;L_f$7l%J3BWa@m%uriktVT*Tit z5{p;PhS;q={-P zF}xvwaOqE3P3Ij*PZ6Sd^uYsnPHxJ=eR~1vyideAI8+NlBMjt5cgdF~w%|w2J1^U$7e}we5nphpxx*+v$2`CpXA@rbWuw zBh5hBLyrlXpJ)M*d7OXGEnqhFXN_`A17Ecz%h~x8@W+qID*O385o8C4jOt_uFV4?q zy;IILn}h0BDR5R0!!`oLp@@#{rF#69K_)F7H>}o?;ia9?4A&Y{t1sHh@t_)d_C%!2 zf*5CFwPu=4VY8OVSmg$8YLtea?@-rWgHucfZTPu=O~um(+I)XOrK3zbI8Ky0l@z%! zSB+GYp!rQT)<4sJ);!C>iW<=(brF2|9h9OTZN?Jqqr{V*OER(WcrzGgcNA@4Kv!NP z5n(KR zI{FByY0GApH4J}uYBQ6cnf2L?O{( zje)Q&4%9`lwfy*)k&RW8(8jqlfDFGZd-L(IFD1&#HL6;zQiB1vyI8<*LH2~d`=TLO zU-ymk%(@UkY>sRw$+FI?^N!0S5K>Qnf{;wMwXbw1P4-E*%l?>hk5&(`NL!*@IN`{gF2>{1Oq2bDV z)x)HKT!6z%&$g+`V373xL-X#jO<(0H%^+f{3T#(}aHXy6Lwa@~P3$Sbb?^c`H@9bd*+6A^&qOop$<&Bm=GQjpOH1_STtl0}l0@zuC#)Z>= zrO$r^NDz2FLSrKBUp_7U(@z1YZAT-(^>uBI#$ z$N*RlgT_$6Z!L}i8U|J{ppgu}x_Sm63t)y84Y9EQO1}1=?hb(54H|7xSC+~7r!xv5 zq>Tno+!Y46fi!^eJT%@XUP*KhNB|hFLE{+7tE&y(s48OP{IWxR`OzT6z>rM;_4XH& zQN|jxN50FlkUz>0g{tG&o~0T$CLWV z8k3UGGXf9EllsUhlkm?f0nw8i&^Q77lT^?`0b`Sw&^7^#lg`jIA+yZ@0Cr()b!Bre ZP)h{{000004gd}SWCH*I+RXp}003#wA=3Z= diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 794f670a..3f844996 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "properties": [], - "versionCode": 59, - "versionName": "5.0.3-hotfix2", + "versionCode": 60, + "versionName": "5.1", "enabled": true, "outputFile": "app-release.apk" } diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt index 6d9862d2..ef080b6c 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -26,6 +26,7 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.cardview.widget.CardView +import androidx.core.view.children import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.CircularProgressDrawable import androidx.vectordrawable.graphics.drawable.Animatable2Compat @@ -48,6 +49,7 @@ import xyz.quaver.hitomi.getReader import xyz.quaver.io.util.getChild import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.R +import xyz.quaver.pupil.favoriteTags import xyz.quaver.pupil.favorites import xyz.quaver.pupil.types.Tag import xyz.quaver.pupil.ui.view.TagChip @@ -222,7 +224,18 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri galleryblock_tag_group.removeAllViews() CoroutineScope(Dispatchers.Default).launch { - galleryBlock.relatedTags.map { + galleryBlock.relatedTags.sortedBy { + val tag = Tag.parse(it) + + if (favoriteTags.contains(tag)) + -1 + else + when(Tag.parse(it).area) { + "female" -> 0 + "male" -> 1 + else -> 2 + } + }.map { TagChip(context, Tag.parse(it)).apply { setOnClickListener { view -> for (callback in onChipClickedHandler) diff --git a/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt b/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt index 8e1d88f2..36755a49 100644 --- a/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt +++ b/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt @@ -43,13 +43,16 @@ import xyz.quaver.pupil.R import xyz.quaver.pupil.client import xyz.quaver.pupil.interceptors import xyz.quaver.pupil.ui.ReaderActivity -import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.downloader.Cache import xyz.quaver.pupil.util.downloader.DownloadManager import xyz.quaver.pupil.util.ellipsize import xyz.quaver.pupil.util.normalizeID import xyz.quaver.pupil.util.requestBuilders import java.io.IOException +import kotlin.math.ceil +import kotlin.math.floor +import kotlin.math.log10 +import kotlin.math.roundToInt private typealias ProgressListener = (DownloadService.Tag, Long, Long, Boolean) -> Unit class DownloadService : Service() { @@ -218,10 +221,11 @@ class DownloadService : Service() { kotlin.runCatching { val image = response.also { if (it.code() != 200) throw IOException() }.body()?.use { it.bytes() } ?: throw Exception() + val padding = ceil(progress[galleryID]?.size?.let { log10(it.toFloat()) } ?: 0F).toInt() CoroutineScope(Dispatchers.IO).launch { kotlin.runCatching { - Cache.getInstance(this@DownloadService, galleryID).putImage(index, "$index.$ext", image) + Cache.getInstance(this@DownloadService, galleryID).putImage(index, "${index.toString().padStart(padding, '0')}.$ext", image) }.onSuccess { progress[galleryID]?.set(index, Float.POSITIVE_INFINITY) notify(galleryID) @@ -309,24 +313,26 @@ class DownloadService : Service() { return@launch } - progress.put(galleryID, MutableList(reader.galleryInfo.files.size) { 0F }) + val list = MutableList(reader.galleryInfo.files.size) { 0F } cache.metadata.imageList?.let { - if (progress[galleryID]?.size != it.size) { + if (list.size != it.size) { FirebaseCrashlytics.getInstance().log( """ GALLERYID: $galleryID - ${it.size} - ${progress[galleryID]?.size} + ${it.size} - ${list.size} """.trimIndent() ) error("ImageList Size does not match") } it.forEachIndexed { index, image -> - progress[galleryID]?.set(index, if (image != null) Float.POSITIVE_INFINITY else 0F) + list[index] = if (image != null) Float.POSITIVE_INFINITY else 0F } } + progress.put(galleryID, list) + if (isCompleted(galleryID)) { if (DownloadManager.getInstance(this@DownloadService) .getDownloadFolder(galleryID) != null ) @@ -352,17 +358,17 @@ class DownloadService : Service() { } reader.requestBuilders.also { - if (it.size != progress[galleryID]?.size) { + if (it.size != list.size) { FirebaseCrashlytics.getInstance().log( """ GALLERYID: $galleryID - ${it.size} - ${progress[galleryID]?.size} + ${it.size} - ${list.size} """.trimIndent() ) error("Requests Size does not match") } }.forEachIndexed { index, it -> - if (progress[galleryID]?.get(index)?.isInfinite() != true) { + if (!list[index].isInfinite()) { val request = it.tag(Tag(galleryID, index, startId)).build() client.newCall(request).enqueue(callback) } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt index 3187b240..788f23c5 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt @@ -118,7 +118,6 @@ class ReaderActivity : BaseActivity() { private var cameraEnabled = false private var eyeType: Eye? = null - private var eyeCount: Int = 0 private var eyeTime: Long = 0L override fun onCreate(savedInstanceState: Bundle?) { @@ -248,6 +247,8 @@ class ReaderActivity : BaseActivity() { override fun onResume() { super.onResume() + bindService(Intent(this, DownloadService::class.java), conn, BIND_AUTO_CREATE) + if (cameraEnabled) startCamera(this, cameraCallback) } @@ -255,6 +256,9 @@ class ReaderActivity : BaseActivity() { override fun onPause() { super.onPause() closeCamera() + + if (downloader != null) + unbindService(conn) } override fun onDestroy() { @@ -265,9 +269,6 @@ class ReaderActivity : BaseActivity() { if (!DownloadManager.getInstance(this).isDownloading(galleryID)) DownloadService.cancel(this, galleryID) - - if (downloader != null) - unbindService(conn) } override fun onBackPressed() { @@ -304,7 +305,6 @@ class ReaderActivity : BaseActivity() { private fun initDownloader() { DownloadService.download(this, galleryID, true) - bindService(Intent(this, DownloadService::class.java), conn, BIND_AUTO_CREATE) timer.schedule(1000, 1000) { val downloader = downloader ?: return@schedule @@ -564,28 +564,23 @@ class ReaderActivity : BaseActivity() { // Both closed / opened !left.xor(right) -> { eyeType = null - eyeCount = 0 eyeTime = 0L } !left -> { if (eyeType != Eye.LEFT) { eyeType = Eye.LEFT - eyeCount = 0 eyeTime = System.currentTimeMillis() } - eyeCount++ } !right -> { if (eyeType != Eye.RIGHT) { eyeType = Eye.RIGHT - eyeCount = 0 eyeTime = System.currentTimeMillis() } - eyeCount++ } } - if (eyeCount > 3 && System.currentTimeMillis() - eyeTime > 500) { + if (eyeType != null && System.currentTimeMillis() - eyeTime > 100) { (this@ReaderActivity.reader_recyclerview.layoutManager as LinearLayoutManager).let { it.scrollToPositionWithOffset(when(eyeType!!) { Eye.RIGHT -> { @@ -597,9 +592,7 @@ class ReaderActivity : BaseActivity() { }, 0) } - eyeType = null - eyeCount = 0 - eyeTime = 0L + eyeTime = System.currentTimeMillis() + 500 } } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt index 0b4b1904..4708a470 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt @@ -37,6 +37,7 @@ import kotlinx.android.synthetic.main.item_download_folder.view.* import net.rdrei.android.dirchooser.DirectoryChooserActivity import net.rdrei.android.dirchooser.DirectoryChooserConfig import xyz.quaver.io.FileX +import xyz.quaver.io.util.toFile import xyz.quaver.pupil.R import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.byteToString @@ -62,7 +63,7 @@ class DownloadLocationDialogFragment : DialogFragment() { context.contentResolver.takePersistableUriPermission(uri, takeFlags) if (kotlin.runCatching { FileX(context, uri).canWrite() }.getOrDefault(false)) { - entries[null]?.message?.text = uri.toString() + entries[null]?.location_available?.text = uri.toFile(context)?.canonicalPath Preferences["download_folder"] = uri.toString() } else { Snackbar.make( diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt index 6fe1b42a..76ef9827 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt @@ -45,6 +45,7 @@ import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.R import xyz.quaver.pupil.adapters.GalleryBlockAdapter import xyz.quaver.pupil.adapters.ThumbnailPageAdapter +import xyz.quaver.pupil.favoriteTags import xyz.quaver.pupil.histories import xyz.quaver.pupil.types.Tag import xyz.quaver.pupil.ui.ReaderActivity @@ -141,7 +142,18 @@ class GalleryDialog(context: Context, private val glide: RequestManager, private listOf(gallery.language).map { Tag("language", it) }, gallery.series.map { Tag("series", it) }, gallery.characters.map { Tag("character", it) }, - gallery.tags.map { + gallery.tags.sortedBy { + val tag = Tag.parse(it) + + if (favoriteTags.contains(tag)) + -1 + else + when(Tag.parse(it).area) { + "female" -> 0 + "male" -> 1 + else -> 2 + } + }.map { Tag.parse(it).let { tag -> when { tag.area != null -> tag diff --git a/app/src/main/java/xyz/quaver/pupil/util/downloader/Cache.kt b/app/src/main/java/xyz/quaver/pupil/util/downloader/Cache.kt index e34747c8..257a67d9 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/downloader/Cache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/downloader/Cache.kt @@ -200,24 +200,18 @@ class Cache private constructor(context: Context, val galleryID: Int) : ContextW fun moveToDownload() = CoroutineScope(Dispatchers.IO).launch { val downloadFolder = downloadFolder ?: return@launch - if (downloadFolder.getChild(".metadata").exists()) + val cacheMetadata = cacheFolder.getChild(".metadata") + val downloadMetadata = downloadFolder.getChild(".metadata") + + if (downloadMetadata.exists() || !cacheMetadata.exists()) return@launch - metadata.imageList?.forEach { imageName -> - imageName ?: return@forEach - val target = downloadFolder.getChild(imageName) - val source = cacheFolder.getChild(imageName) - - if (!source.exists() || target.exists()) - return@forEach - + if (cacheMetadata.exists()) { kotlin.runCatching { - if (!target.exists()) - target.createNewFile() + downloadMetadata.createNewFile() + downloadMetadata.writeText(Json.encodeToString(metadata)) - target.outputStream()?.use { target -> source.inputStream()?.use { source -> - source.copyTo(target) - } } + cacheMetadata.delete() } } @@ -236,19 +230,22 @@ class Cache private constructor(context: Context, val galleryID: Int) : ContextW } } - val cacheMetadata = cacheFolder.getChild(".metadata") - val downloadMetadata = downloadFolder.getChild(".metadata") + metadata.imageList?.forEach { imageName -> + imageName ?: return@forEach + val target = downloadFolder.getChild(imageName) + val source = cacheFolder.getChild(imageName) + + if (!source.exists() || target.exists()) + return@forEach - if (cacheMetadata.exists() && !downloadMetadata.exists()) { kotlin.runCatching { - if (!downloadMetadata.exists()) - downloadMetadata.createNewFile() + if (!target.exists()) + target.createNewFile() - downloadMetadata.writeText(Json.encodeToString(metadata)) - cacheMetadata.delete() + target.outputStream()?.use { target -> source.inputStream()?.use { source -> + source.copyTo(target) + } } } } - - cacheFolder.delete() } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index 34ad0fd2..201e31c7 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -139,7 +139,7 @@ app:leftActionMode="showHamburger" app:menu="@menu/main" app:dismissOnOutsideTouch="true" - app:close_search_on_keyboard_dismiss="true" + app:close_search_on_keyboard_dismiss="false" tools:ignore="NewApi" /> \ No newline at end of file diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index 616e6f93..14682b10 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -1,12 +1,12 @@ - + 16dp 16dp 100dp - 2000dp + 2000px 24dp 72dp