From 90871d18f6c57d8208f43e43479c54c56192adea Mon Sep 17 00:00:00 2001 From: Tim Kluge Date: Fri, 6 Dec 2024 18:44:31 +0100 Subject: [PATCH] Initial commit --- .gitignore | 11 + ICON_LICENSE | 9 + LICENSE | 201 +++++++++++++++ README.md | 41 +++ app/.gitignore | 1 + app/build.gradle.kts | 51 ++++ app/karoo-powerbar.png | Bin 0 -> 11503 bytes app/manifest.json | 11 + app/proguard-rules.pro | 21 ++ app/src/main/AndroidManifest.xml | 48 ++++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 10634 bytes .../karoopowerbar/CustomProgressBar.kt | 74 ++++++ .../de/timklge/karoopowerbar/Extensions.kt | 86 ++++++ .../karoopowerbar/ForegroundService.kt | 54 ++++ .../karoopowerbar/KarooPowerbarExtension.kt | 47 ++++ .../de/timklge/karoopowerbar/MainActivity.kt | 53 ++++ .../kotlin/de/timklge/karoopowerbar/Window.kt | 230 +++++++++++++++++ .../timklge/karoopowerbar/screens/Dropdown.kt | 62 +++++ .../karoopowerbar/screens/MainScreen.kt | 153 +++++++++++ .../de/timklge/karoopowerbar/theme/Theme.kt | 13 + .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 601 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 373 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 790 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 1314 bytes .../main/res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 1825 bytes app/src/main/res/drawable/glow.png | Bin 0 -> 5856 bytes .../main/res/drawable/solid_background.xml | 7 + app/src/main/res/layout/popup_window.xml | 14 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 470 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 286 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 1344 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 392 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 214 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 912 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 648 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 348 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 1928 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 902 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 574 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 3184 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 1166 bytes .../ic_launcher_foreground.webp | Bin 0 -> 466 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 4316 bytes app/src/main/res/values/colors.xml | 13 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 4 + app/src/main/res/xml/extension_info.xml | 8 + build.gradle.kts | 6 + gradle.properties | 23 ++ gradle/libs.versions.toml | 52 ++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 244 ++++++++++++++++++ gradlew.bat | 92 +++++++ powerbar0.png | Bin 0 -> 38786 bytes powerbar1.png | Bin 0 -> 23396 bytes settings.gradle.kts | 38 +++ 59 files changed, 1687 insertions(+) create mode 100644 .gitignore create mode 100644 ICON_LICENSE create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/karoo-powerbar.png create mode 100644 app/manifest.json create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/CustomProgressBar.kt create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/Extensions.kt create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/ForegroundService.kt create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/KarooPowerbarExtension.kt create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/MainActivity.kt create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/Window.kt create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/screens/Dropdown.kt create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/screens/MainScreen.kt create mode 100644 app/src/main/kotlin/de/timklge/karoopowerbar/theme/Theme.kt create mode 100644 app/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 app/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/drawable/glow.png create mode 100644 app/src/main/res/drawable/solid_background.xml create mode 100644 app/src/main/res/layout/popup_window.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/xml/extension_info.xml create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 powerbar0.png create mode 100644 powerbar1.png create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43ebc8c --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +/app/release diff --git a/ICON_LICENSE b/ICON_LICENSE new file mode 100644 index 0000000..d8e6845 --- /dev/null +++ b/ICON_LICENSE @@ -0,0 +1,9 @@ + The MIT License (MIT) + +Copyright (c) 2015-2021 Aniket Suvarna + +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: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a828d8c --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "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. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "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. + + "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). + + "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. + + "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." + + "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. + + 2. Grant of Copyright License. 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. + + 3. Grant of Patent License. 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. + + 4. Redistribution. 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (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 + + (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. + + 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. + + 5. Submission of Contributions. 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. + + 6. Trademarks. 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. + + 7. Disclaimer of Warranty. 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. + + 8. Limitation of Liability. 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. + + 9. Accepting Warranty or Additional Liability. 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. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 Hammerhead Navigation, Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..80c4ad3 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Karoo Powerbar Extension + +> [!WARNING] +> Only tested on Karoo 3 + +Simple karoo extension that shows an overlay progress bar at the bottom of the screen. For Karoo 2 and Karoo 3 devices +running Karoo OS version 1.524.2003 and later. + +![Powerbar](powerbar0.png) +![Settings](powerbar1.png) + +## Usage + +Install the app and start it from the main menu. You will be asked to grant it permission to show +it on top of other apps (i. e. the karoo ride app). You can select one of the following data sources: + +- Heart rate +- Power +- Average power over the last 3 seconds +- Average power over the last 10 seconds + +Subsequently, the power bar will be shown at the bottom of the screen. The bar will be filled according +to your current power output / heart rate and will change color depending on the intensity, as setup +in your power / heart rate zones. + +## Installation + +Currently, Hammerhead has not yet released an on-device app store that allows users to easily install +extensions like this. Until it is available, you can sideload the app. + +1. Download the apk from the [releases page](https://github.com/timklge/karoo-powerbar/releases) (or build it from source) +2. Set up your Karoo for sideloading. DC Rainmaker has a great [step-by-step guide](https://www.dcrainmaker.com/2021/02/how-to-sideload-android-apps-on-your-hammerhead-karoo-1-karoo-2.html). +3. Install the app by running `adb install app-release.apk`. + +## Credits + +- Icons by [boxicons.com](https://boxicons.com) (MIT-licensed). + +## Links + +[karoo-ext source](https://github.com/hammerheadnav/karoo-ext) diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..337fc95 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,51 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.compose.compiler) + kotlin("plugin.serialization") version "2.0.20" +} + +android { + namespace = "de.timklge.karoopowerbar" + compileSdk = 34 + + defaultConfig { + applicationId = "de.timklge.karoopowerbar" + minSdk = 26 + targetSdk = 33 + versionCode = 1 + versionName = "1.0.0" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + } +} + +dependencies { + implementation(libs.hammerhead.karoo.ext) + implementation(libs.androidx.core.ktx) + implementation(libs.bundles.androidx.lifeycle) + implementation(libs.androidx.activity.compose) + implementation(libs.bundles.compose.ui) + implementation(libs.androidx.navigation.runtime.ktx) + implementation(libs.androidx.navigation.compose) + implementation(libs.kotlinx.serialization.json) + implementation(libs.color) + implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.cardview) + implementation(libs.androidx.lifecycle.runtime.ktx) +} \ No newline at end of file diff --git a/app/karoo-powerbar.png b/app/karoo-powerbar.png new file mode 100644 index 0000000000000000000000000000000000000000..27922460e122d1eace957b08fa676510db5537f4 GIT binary patch literal 11503 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 literal 0 HcmV?d00001 diff --git a/app/manifest.json b/app/manifest.json new file mode 100644 index 0000000..e4ef285 --- /dev/null +++ b/app/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "karoo-powerbar", + "packageName": "de.timklge.karoopowerbar", + "iconUrl": "https://github.com/timklge/karoo-powerbar/releases/latest/download/karoo-powerbar.png", + "latestApkUrl": "https://github.com/timklge/karoo-powerbar/releases/latest/download/app-release.apk", + "latestVersion": "1.0.0", + "latestVersionCode": 1, + "developer": "timklge", + "description": "Adds a colored power bar to the bottom of the screen", + "releaseNotes": "Initial release" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..ff59496 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle.kts. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..10950ee --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0ab518a821b7febc4522784ae4c57afca0234e GIT binary patch literal 10634 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 literal 0 HcmV?d00001 diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/CustomProgressBar.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/CustomProgressBar.kt new file mode 100644 index 0000000..986e6ec --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/CustomProgressBar.kt @@ -0,0 +1,74 @@ +package de.timklge.karoopowerbar + +import android.content.Context +import android.content.res.Configuration +import android.graphics.BlurMaskFilter +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.RectF +import android.util.AttributeSet +import android.view.View +import androidx.annotation.ColorInt +import androidx.core.graphics.ColorUtils + +class CustomProgressBar @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null +) : View(context, attrs) { + private val mPaddedRect = RectF() + private val mBlurRadius = 4 + + var progress: Double = 0.5 + @ColorInt var progressColor: Int = 0xFF2b86e6.toInt() + + fun isDarkMode(context: Context): Boolean { + val flags = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + return flags == Configuration.UI_MODE_NIGHT_YES + } + + override fun onDrawForeground(canvas: Canvas) { + super.onDrawForeground(canvas) + + val linePaint = Paint().apply { + isAntiAlias = true + strokeWidth = 1f + style = Paint.Style.FILL_AND_STROKE + color = progressColor + } + + val blurPaint = Paint().apply { + isAntiAlias = true + strokeWidth = 2f + style = Paint.Style.STROKE + color = progressColor + maskFilter = BlurMaskFilter(3f, BlurMaskFilter.Blur.NORMAL) + } + + val blurPaintHighlight = Paint().apply { + isAntiAlias = true + strokeWidth = 4f + style = Paint.Style.FILL_AND_STROKE + color = ColorUtils.blendARGB(progressColor, 0xFFFFFF, 0.5f) + maskFilter = BlurMaskFilter(3f, BlurMaskFilter.Blur.NORMAL) + } + + val background = Paint().apply { + style = Paint.Style.FILL_AND_STROKE + color = 0x70000000 + strokeWidth = 2f + } + + val halfStrokeWidth = 1f + mPaddedRect.left = halfStrokeWidth + mPaddedRect.top = halfStrokeWidth + mBlurRadius + mPaddedRect.right = + ((canvas.width.toDouble() - halfStrokeWidth) * progress.coerceIn(0.0, 1.0)).toFloat() + mPaddedRect.bottom = canvas.height.toFloat() - halfStrokeWidth + + val corners = 2f + canvas.drawRoundRect(0f, 2f + mBlurRadius, canvas.width.toFloat(), canvas.height.toFloat(), 2f, 2f, background) + canvas.drawRoundRect(mPaddedRect, corners, corners, blurPaint) + canvas.drawRoundRect(mPaddedRect, corners, corners, linePaint) + + canvas.drawRoundRect(mPaddedRect.right-4, mPaddedRect.top, mPaddedRect.right+4, mPaddedRect.bottom, 2f, 2f, blurPaintHighlight) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/Extensions.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/Extensions.kt new file mode 100644 index 0000000..710c101 --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/Extensions.kt @@ -0,0 +1,86 @@ +package de.timklge.karoopowerbar + +import android.content.Context +import android.util.Log +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import de.timklge.karoopowerbar.screens.SelectedSource +import io.hammerhead.karooext.KarooSystemService +import io.hammerhead.karooext.models.OnStreamState +import io.hammerhead.karooext.models.RideState +import io.hammerhead.karooext.models.StreamState +import io.hammerhead.karooext.models.UserProfile +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.channels.trySendBlocking +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +val jsonWithUnknownKeys = Json { ignoreUnknownKeys = true } + +val settingsKey = stringPreferencesKey("settings") + +@Serializable +data class PowerbarSettings( + val source: SelectedSource = SelectedSource.POWER, +){ + companion object { + val defaultSettings = Json.encodeToString(PowerbarSettings()) + } +} + +suspend fun saveSettings(context: Context, settings: PowerbarSettings) { + context.dataStore.edit { t -> + t[settingsKey] = Json.encodeToString(settings) + } +} + +fun Context.streamSettings(): Flow { + return dataStore.data.map { settingsJson -> + try { + jsonWithUnknownKeys.decodeFromString( + settingsJson[settingsKey] ?: PowerbarSettings.defaultSettings + ) + } catch(e: Throwable){ + Log.e("karoo-powerbar", "Failed to read preferences", e) + jsonWithUnknownKeys.decodeFromString(PowerbarSettings.defaultSettings) + } + }.distinctUntilChanged() +} + +fun KarooSystemService.streamDataFlow(dataTypeId: String): Flow { + return callbackFlow { + val listenerId = addConsumer(OnStreamState.StartStreaming(dataTypeId)) { event: OnStreamState -> + trySendBlocking(event.state) + } + awaitClose { + removeConsumer(listenerId) + } + } +} + +fun KarooSystemService.streamRideState(): Flow { + return callbackFlow { + val listenerId = addConsumer { rideState: RideState -> + trySendBlocking(rideState) + } + awaitClose { + removeConsumer(listenerId) + } + } +} + +fun KarooSystemService.streamUserProfile(): Flow { + return callbackFlow { + val listenerId = addConsumer { userProfile: UserProfile -> + trySendBlocking(userProfile) + } + awaitClose { + removeConsumer(listenerId) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/ForegroundService.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/ForegroundService.kt new file mode 100644 index 0000000..5213a4b --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/ForegroundService.kt @@ -0,0 +1,54 @@ +package de.timklge.karoopowerbar + +import android.R +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Context +import android.content.Intent +import android.os.IBinder +import androidx.core.app.NotificationCompat + + +class ForegroundService : Service() { + override fun onBind(intent: Intent?): IBinder { + throw UnsupportedOperationException("Not yet implemented") + } + + override fun onCreate() { + super.onCreate() + setupForeground() + val window = Window(this) + window.open() + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + return super.onStartCommand(intent, flags, startId) + } + + private fun setupForeground() { + val channelId = "de.timklge.karoopowerbar" + val channelName = "Background Service" + val chan = NotificationChannel( + channelId, + channelName, + NotificationManager.IMPORTANCE_MIN + ) + + val manager = + checkNotNull(getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?) + manager.createNotificationChannel(chan) + + val notificationBuilder: NotificationCompat.Builder = + NotificationCompat.Builder(this, channelId) + val notification: Notification = notificationBuilder.setOngoing(true) + .setContentTitle("Powerbar service running") + .setContentText("Displaying on top of other apps") + .setSmallIcon(R.drawable.ic_menu_add) + .setPriority(NotificationManager.IMPORTANCE_MIN) + .setCategory(Notification.CATEGORY_SERVICE) + .build() + startForeground(2, notification) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/KarooPowerbarExtension.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/KarooPowerbarExtension.kt new file mode 100644 index 0000000..7db8df8 --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/KarooPowerbarExtension.kt @@ -0,0 +1,47 @@ +package de.timklge.karoopowerbar + +import android.content.Intent +import android.provider.Settings +import android.util.Log +import io.hammerhead.karooext.KarooSystemService +import io.hammerhead.karooext.extension.KarooExtension +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch + +class KarooPowerbarExtension : KarooExtension("karoo-powerbar", "1.0.0") { + + companion object { + const val TAG = "karoo-powerbar" + } + + private lateinit var karooSystem: KarooSystemService + + private var serviceJob: Job? = null + + override fun onCreate() { + super.onCreate() + + karooSystem = KarooSystemService(applicationContext) + + if (Settings.canDrawOverlays(this)) { + startForegroundService(Intent(this, ForegroundService::class.java)) + } + + serviceJob = CoroutineScope(Dispatchers.IO).launch { + karooSystem.connect { connected -> + if (connected) { + Log.i(TAG, "Connected") + } + } + } + } + + override fun onDestroy() { + serviceJob?.cancel() + serviceJob = null + karooSystem.disconnect() + super.onDestroy() + } +} diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/MainActivity.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/MainActivity.kt new file mode 100644 index 0000000..624fd61 --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/MainActivity.kt @@ -0,0 +1,53 @@ +package de.timklge.karoopowerbar + +import android.R +import android.content.Context +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.material3.Text +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.preferencesDataStore +import de.timklge.karoopowerbar.screens.MainScreen +import de.timklge.karoopowerbar.theme.AppTheme + +val Context.dataStore: DataStore by preferencesDataStore(name = "settings") + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + AppTheme { + MainScreen() + } + } + + checkOverlayPermission() + startService() + } + + // method for starting the service + private fun startService() { + if (Settings.canDrawOverlays(this)) { + startForegroundService(Intent(this, ForegroundService::class.java)) + } + } + + // method to ask user to grant the Overlay permission + private fun checkOverlayPermission() { + if (!Settings.canDrawOverlays(this)) { + val myIntent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) + startActivity(myIntent) + } + } + + override fun onResume() { + super.onResume() + startService() + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/Window.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/Window.kt new file mode 100644 index 0000000..b925eb5 --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/Window.kt @@ -0,0 +1,230 @@ +package de.timklge.karoopowerbar + +import android.content.Context +import android.content.Context.WINDOW_SERVICE +import android.graphics.PixelFormat +import android.os.Build +import android.util.DisplayMetrics +import android.util.Log +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowInsets +import android.view.WindowManager +import de.timklge.karoopowerbar.screens.SelectedSource +import io.hammerhead.karooext.KarooSystemService +import io.hammerhead.karooext.models.DataType +import io.hammerhead.karooext.models.StreamState +import io.hammerhead.karooext.models.UserProfile +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.launch + + +enum class PowerZone(val colorResource: Int) { + ACTIVE_RECOVERY(R.color.zoneActiveRecovery), + ENDURANCE(R.color.zoneEndurance), + TEMPO(R.color.zoneTempo), + THRESHOLD(R.color.zoneThreshold), + VO2_MAX(R.color.zoneVO2Max), + AEROBIC_CAPACITY(R.color.zoneAerobic), + ANAEROBIC_CAPACITY(R.color.zoneAnaerobic), +} + +enum class HrZone(val colorResource: Int) { + ACTIVE_RECOVERY(R.color.zoneActiveRecovery), + ENDURANCE(R.color.zoneEndurance), + TEMPO(R.color.zoneTempo), + VO2_MAX(R.color.zoneAerobic), +} + +fun UserProfile.getUserPowerZone(power: Int): PowerZone? { + powerZones.forEachIndexed { index, zone -> + if (power in zone.min..zone.max) { + return PowerZone.entries[index] + } + } + + return null +} + +fun UserProfile.getUserHrZone(hr: Int): HrZone? { + heartRateZones.forEachIndexed { index, zone -> + if (hr in zone.min..= 30) { + val windowMetrics = mWindowManager.currentWindowMetrics + val insets = windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()) + val bounds = windowMetrics.bounds + displayMetrics.widthPixels = bounds.width() - insets.left - insets.right + displayMetrics.heightPixels = bounds.height() - insets.top - insets.bottom + } else { + @Suppress("DEPRECATION") + mWindowManager.getDefaultDisplay().getMetrics(displayMetrics) + } + + // Define the position of the + // window within the screen + mParams?.gravity = Gravity.BOTTOM + mParams?.width = displayMetrics.widthPixels + mParams?.alpha = 1.0f + } + + private val karooSystem: KarooSystemService = KarooSystemService(context) + + data class StreamData(val userProfile: UserProfile, val value: Double) + + private var serviceJob: Job? = null + + fun open() { + serviceJob = CoroutineScope(Dispatchers.IO).launch { + karooSystem.connect { connected -> + if (connected) { + Log.i("karoo-powerbar", "Connected") + } + } + + context.streamSettings().distinctUntilChanged().collectLatest { settings -> + mProgressBar.progressColor = context.resources.getColor(R.color.zoneAerobic) + mProgressBar.progress = 0.5 + mProgressBar.invalidate() + + Log.i("karoo-powerbar", "Streaming ${settings.source}") + + when (settings.source){ + SelectedSource.POWER -> streamPower(PowerStreamSmoothing.RAW) + SelectedSource.POWER_3S -> streamPower(PowerStreamSmoothing.SMOOTHED_3S) + SelectedSource.POWER_10S -> streamPower(PowerStreamSmoothing.SMOOTHED_10S) + // SelectedSource.POWER_30S -> streamPower(PowerStreamSmoothing.SMOOTHED_30S) + SelectedSource.HEART_RATE -> streamHeartrate() + } + } + } + + try { + if (mView.windowToken == null && mView.parent == null) { + mWindowManager.addView(mView, mParams) + } + } catch (e: Exception) { + Log.d("Error1", e.toString()) + } + } + + private suspend fun streamHeartrate() { + val powerFlow = karooSystem.streamDataFlow(DataType.Type.HEART_RATE) + .mapNotNull { (it as? StreamState.Streaming)?.dataPoint?.singleValue } + .distinctUntilChanged() + + karooSystem.streamUserProfile() + .distinctUntilChanged() + .combine(powerFlow) { userProfile, hr -> userProfile to hr } + .map { (userProfile, hr) -> StreamData(userProfile, hr) } + .distinctUntilChanged() + .collect { streamData -> + val color = context.getColor( + streamData.userProfile.getUserHrZone(streamData.value.toInt())?.colorResource + ?: R.color.zoneAerobic + ) + val minHr = streamData.userProfile.restingHr + val maxHr = streamData.userProfile.maxHr + val progress = + remap(streamData.value, minHr.toDouble(), maxHr.toDouble(), 0.0, 1.0) + + mProgressBar.progressColor = color + mProgressBar.progress = progress + mProgressBar.invalidate() + + Log.i("karoo-powerbar", "Hr: ${streamData.value} min: $minHr max: $maxHr") + } + } + + enum class PowerStreamSmoothing(val dataTypeId: String){ + RAW(DataType.Type.POWER), + SMOOTHED_3S(DataType.Type.SMOOTHED_3S_AVERAGE_POWER), + SMOOTHED_10S(DataType.Type.SMOOTHED_10S_AVERAGE_POWER), + SMOOTHED_30S(DataType.Type.SMOOTHED_30S_AVERAGE_POWER), + } + + private suspend fun streamPower(smoothed: PowerStreamSmoothing) { + val powerFlow = karooSystem.streamDataFlow(smoothed.dataTypeId) + .mapNotNull { (it as? StreamState.Streaming)?.dataPoint?.singleValue } + .distinctUntilChanged() + + karooSystem.streamUserProfile() + .distinctUntilChanged() + .combine(powerFlow) { userProfile, power -> userProfile to power } + .map { (userProfile, power) -> StreamData(userProfile, power) } + .distinctUntilChanged() + .collect { streamData -> + val color = context.getColor( + streamData.userProfile.getUserPowerZone(streamData.value.toInt())?.colorResource + ?: R.color.zoneAerobic + ) + val minPower = streamData.userProfile.powerZones.first().min + val maxPower = streamData.userProfile.powerZones.last().min + 50 + val progress = + remap(streamData.value, minPower.toDouble(), maxPower.toDouble(), 0.0, 1.0) + + mProgressBar.progressColor = color + mProgressBar.progress = progress + mProgressBar.invalidate() + + Log.i("karoo-powerbar", "Power: ${streamData.value} min: $minPower max: $maxPower") + } + } + + fun close() { + try { + serviceJob?.cancel() + (context.getSystemService(WINDOW_SERVICE) as WindowManager).removeView(mView) + mView.invalidate() + (mView.parent as ViewGroup).removeAllViews() + } catch (e: Exception) { + Log.d("karoo-powerbar", e.toString()) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/screens/Dropdown.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/screens/Dropdown.kt new file mode 100644 index 0000000..6824493 --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/screens/Dropdown.kt @@ -0,0 +1,62 @@ +package de.timklge.karoopowerbar.screens + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MenuAnchorType +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier + + +data class DropdownOption(val id: String, val name: String) + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun Dropdown(label: String, options: List, initialSelection: DropdownOption, onSelect: (selectedOption: DropdownOption) -> Unit) { + var expanded by remember { mutableStateOf(false) } + var selected by remember { mutableStateOf(initialSelection) } + + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = it }, + ) { + OutlinedTextField( + readOnly = true, + value = selected.name, + onValueChange = { }, + modifier = Modifier.menuAnchor(MenuAnchorType.PrimaryEditable, true).fillMaxWidth(), + label = { Text(label) }, + trailingIcon = { + ExposedDropdownMenuDefaults.TrailingIcon( + expanded = expanded + ) + }, + colors = ExposedDropdownMenuDefaults.textFieldColors() + ) + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + ) { + options.forEach { option -> + DropdownMenuItem( + text = { Text(option.name, style = MaterialTheme.typography.bodyLarge) }, + onClick = { + selected = option + expanded = false + onSelect(selected) + }, + contentPadding = ExposedDropdownMenuDefaults.ItemContentPadding, + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/screens/MainScreen.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/screens/MainScreen.kt new file mode 100644 index 0000000..a674ae0 --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/screens/MainScreen.kt @@ -0,0 +1,153 @@ +package de.timklge.karoopowerbar.screens + +import android.content.Intent +import android.provider.Settings +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Build +import androidx.compose.material.icons.filled.Done +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.core.content.ContextCompat.startActivity +import androidx.lifecycle.compose.LifecycleResumeEffect +import de.timklge.karoopowerbar.PowerbarSettings +import de.timklge.karoopowerbar.saveSettings +import de.timklge.karoopowerbar.streamSettings +import io.hammerhead.karooext.KarooSystemService +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +enum class SelectedSource(val id: String, val label: String) { + HEART_RATE("hr", "Heart Rate"), + POWER("power", "Power"), + POWER_3S("power_3s", "Power (3 second avg)"), + POWER_10S("power_10s", "Power (10 second avg)"), +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainScreen() { + var karooConnected by remember { mutableStateOf(false) } + val ctx = LocalContext.current + val coroutineScope = rememberCoroutineScope() + val karooSystem = remember { KarooSystemService(ctx) } + + var selectedSource by remember { mutableStateOf(SelectedSource.POWER) } + var savedDialogVisible by remember { mutableStateOf(false) } + var showAlerts by remember { mutableStateOf(false) } + var givenPermissions by remember { mutableStateOf(false) } + + LaunchedEffect(Unit) { + ctx.streamSettings().collect { settings -> + selectedSource = settings.source + } + + givenPermissions = Settings.canDrawOverlays(ctx) + } + + LaunchedEffect(Unit) { + delay(1_000) + showAlerts = true + } + + LaunchedEffect(Unit) { + karooSystem.connect { connected -> + karooConnected = connected + } + } + + LifecycleResumeEffect(Unit) { + givenPermissions = Settings.canDrawOverlays(ctx) + + onPauseOrDispose { } + } + + + Column(modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background)) { + TopAppBar(title = { Text("Powerbar") }) + Column(modifier = Modifier + .padding(5.dp) + .verticalScroll(rememberScrollState()) + .fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(10.dp)) { + + val powerSourceDropdownOptions = SelectedSource.entries.toList().map { unit -> DropdownOption(unit.id, unit.label) } + val powerSourceInitialSelection = powerSourceDropdownOptions.find { option -> option.id == selectedSource.id }!! + Dropdown(label = "Data Source", options = powerSourceDropdownOptions, initialSelection = powerSourceInitialSelection) { selectedOption -> + selectedSource = SelectedSource.entries.find { unit -> unit.id == selectedOption.id }!! + } + + FilledTonalButton(modifier = Modifier + .fillMaxWidth() + .height(50.dp), onClick = { + val newSettings = PowerbarSettings(source = selectedSource) + + coroutineScope.launch { + saveSettings(ctx, newSettings) + savedDialogVisible = true + } + }) { + Icon(Icons.Default.Done, contentDescription = "Save") + Spacer(modifier = Modifier.width(5.dp)) + Text("Save") + } + + if (showAlerts){ + if(!karooConnected){ + Text(modifier = Modifier.padding(5.dp), text = "Could not read device status. Is your Karoo updated?") + } + + if (!givenPermissions) { + Text(modifier = Modifier.padding(5.dp), text = "You have not given permissions to show the power bar overlay. Please do so.") + + FilledTonalButton(modifier = Modifier + .fillMaxWidth() + .height(50.dp), onClick = { + val myIntent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) + startActivity(ctx, myIntent, null) + }) { + Icon(Icons.Default.Build, contentDescription = "Give permission") + Spacer(modifier = Modifier.width(5.dp)) + Text("Give permission") + } + } + } + } + } + + if (savedDialogVisible){ + AlertDialog(onDismissRequest = { savedDialogVisible = false }, + confirmButton = { Button(onClick = { + savedDialogVisible = false + }) { Text("OK") } }, + text = { Text("Settings saved successfully.") } + ) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/theme/Theme.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/theme/Theme.kt new file mode 100644 index 0000000..a62690c --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/theme/Theme.kt @@ -0,0 +1,13 @@ +package de.timklge.karoopowerbar.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable + +@Composable +fun AppTheme( + content: @Composable () -> Unit, +) { + MaterialTheme( + content = content, + ) +} diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ce174571b3f2680048fdd98cd139fa8c2f40ff73 GIT binary patch literal 601 zcmV-f0;c_mP)#C_e zwr6LWo!Pz1WKyKqAk=ELvud?^t&Q{AcO_tQ-}gVYabEkb1REzPX34U8Vr}p|F9&;u z?Q1SEl*{E)B)F+mDm{#2j2{>$DA^O|$|RIv#0F0b8`OxI z&g%pDM>J=4>brcV(R11-77(Z*5;iqY{3VEBPYIuf=3@Z?dNvpvSo6dpL0l(%dYTU* z16gBPl+Va=g+gIRau$mO@$`xKW6g)qV&(~wN4?+gZ%NK#ksz*%ivI&z%)AAD0z1TY z!e^xUSb)H;2zH@)7jT{U!(GkC0)hlWP)qYJz`CZ05okUZc<;!2DDFK%f7^#n_mJaF z-Ldm{9^h57Cu2mx+|&cHcJWQ^B8cxGZ}zPdin8B3Q7}6r#U%GGBk);TvRiKwuzYv0 zOYQ`ZHb;Nfz%A{|^)g-}FrvbpaxwZZMT`YXb$~=|+vrhd_%{7@jHQ654+#V8z$3KP)P&TO7B29L#0%L+u|?SlCfS&1yo|uk*rwb@pC*c zSu9RC2HLiL_Yv#A#?c4NABaJU_u(gWrxH;qp8`Pw73!o#+NT&rkS^ z0ceyTJ--)bQP*|1u@-?wH`v75EZilpV=V%WYSWkOZL;!vda(i<$X#JT7gGSpV71VxwxIyh2BwpIjuWKZSqZaii{11Epgq5bS TT$m8400000NkvXXu0mjf*`%q( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8603ec3e077e37e8fbd46003bc52f34336ec0cf9 GIT binary patch literal 790 zcmV+x1L^#UP)fyH2MeZAzjUx*8ujOfQmJ%@ zZT}3qGxb`ncBJ2D>{}$odcA&MMLe%ot8Z0MUv}uiWZ%{PPQP7itWBIAi@5kdOKfdz zZQ+9`D)G9C_`>x*&a73TPxRXei;w$`%H{HHCYcMGyjx28i3Mgg7hkDVBIcP3O87_# z_gO?%%UnDI(Wp1N#SfKmK&|XRwk@l)TCHo{Zug?i*KX6^coA#p=K*Xm&r~oFjrvBT zadXtnYdP&`U0Jp|M zfcHd%jjgtO)Xj_nZ=tAdYC@(RfN?D7x2TyJ&G>GZME|SQgrpgOV})8DMW`8q2~gZ2 z^=j*f8ZD{o)Pyi5`$HTH`TNui!2}2}Y5*r*T%Atm5;Y-=$^H<>LjD0YLofjXoWB96 z{TnnZ)Pyi5`$IAeCD}xhm(*m%u`oHC)Xa>6-o*e0 zK4nsu7QYO+zvl8HD;yss_ArRo6s1KI^9nK39VJ5NQ5I_T!O>#B+Mb4*G}xE%QXl3R zfCjnm!uzmaGx#&hAnaq`Fjj5e$7xe4m2T8Ve9(9~O|vJgv37+2zGG8=Dhx!U-ZY!d z2i$mZ5d$BO{cWr371`z3R@~;kaej`;JaZ);#L%5cYmTw-;uGTKbYf4WG5cm(HfKyx zo3W{4KC{4aCheYm?8{((6F;F=WgD_LD)4J`{H1l^Yq!OHtJcyvCnqN-Cub7B0bE#g UN|Ged9{>OV07*qoM6N<$f>3yPaR2}S literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d950758212ae5762c02a2b965cef94be3fb84f1e GIT binary patch literal 1314 zcmV+-1>O3IP)Fnlyl9O$Azvq6x^W8i5&g`_&h(schNF)-8L*RHxBGIUf&t*LND<7s)_lw)9D=7 zaR_J5#Kgq9u34r@12vOIa3B{@{6jWF4=5yhpa)Y^Q|HnFvopu0foanC`1n`+mO1_P zAo9wLu{t|D`?YQ6h}O))T~9du@r~c(X=5qAY^`#JX-&0ZW@hF~6!@p5@Y01@R`2Fa zPfuS&fje4w6)L)r#6uN3YUuHx|iEsb}f-aHK=%%xrm_3ae8qvZwH9N%bBM%`X#53%@jHOOrLUG*C^ zHNG-j-yF26u|6#RTn!@0{#E&bG4jmh!a-3hT97H~JB{_B{yrOYUHudrr?EkF5TAIh zq5c#!;xCP-usB}QSRd+7rExx(Q~gF;8XLqih*Q1>C60TeJoi~d{i!t0hgpXXjKNJr zV}s}*J_Q;;AE5o(Txvd+8ng#}s_|vPT&^9JHEMiiaOZF>)X;*)mj!0Y zZA<>6zgZl6=ncNTQyO11%)wli{A|$A8echlR-QPXoZ_2()F}7a_z3bm(!8cQ z@3PPF`$h*2N&O^o+(}bq?r5%^i(*Y0-xoS?Na`p2f!wu7n%On2p2Na1T{D-p)aplj zg45})#-=jU{rg5SryKu`X5Q5tinXYzZ*=gG)StrL0@~2{tnm5D+}zx0_4W$AT-S75 z$+1!B&ZP-LQhyc{_Bmp<)sq!scKLsVd3HF)($jYARvB$$c737#Lt#ncmHHL4tL>^! z#dRXt|L?FHyqM!}*k%@BJZXge^I3fA_(G$)0p8}!U_ zFolXa3O}u?!rY21_Hv5kl{rNh^ZqzjOK>1(pq0e4HTNoxVa7V6c?KRnE5|`D2FkJ6vkV%n&2Ld2BWxX;#?|YZI)3LE22!bF8f*=TjAP9mWSfjMt?f-@m z{Q@T(P_O70IN^YLMZdra2h=P21x`4iUePab!U6S)et{DXs8{q0oNz$BqF)dMy=b*s zuQr>_{dzgh_ks~)gD+jRrAt2#j>RNYM}F`-(w^`M+if@&78V|`!I_<%eOH6>l?LS( z{r;z3FX`v9e!s1s*X?i8N&Wtf-h0ntES7#n$omxzer^&z9ouMof(BzkYH9$!?=~vr(x=jWf*)_;Ko*Gx;54SqrA zF430rs}@`BT-AQ;>j5^eZAe;GSk|H`!jI_HTB(c=BK# z=H=P*biMF%8GR?g&b^{v5o-4Z<9g_bU69dZSQ?GS!{%MkU!gQLTcNh7D7u=Ptv$DFr$3q0-;+xKDIa-at_^1YyJvJX)%u@Dq>d5|rOJ`~&c z!_N5=a=j=`Ft)a6*Pdn()SzcP^r6^3g_NbpYGPb%(dpZFEFdp!O@9q~p+hfw?*A^ES?`K@?up3!S9)&Cq za&M;t{V29i#d5OT=$BWeH|YjNYx`~{o|lR|#TXCtquAbqayv=CyzI#g#?%fa`6Uz2 zt2yMeHuR&|-h(FKApP>v#`QI0+|bk`4c-m<5f$+hY~`eiYk# z$ZlER%YCJvouOkL0x{#!x5ceEyMMW~1^Ogt~WzdScL_Y~t+8_UUZW4_3J3*%~s-Hx^k z7AB8EYWESJ^4iNhp(U%0akWGPe5{~=JJJOGJ?sTpnOH8C6Z6c=zUsud+M#k6H=et!Nj##W8xkg#N48ukjla%`PvA(YzuFy?$L zrDVn}2j)dJNBIRkcIFlRI;gNs?LMCkn^yDGuHUD3Ce?A(YGG_?utTrtmnU&ASZ)n@ zbvy{_d&c@^KGaCJeuEu)MZY|Db|IZ(Oo47zISJO6^;wX|U9#NmE3}L+6?WZdut%L(^E{{ce zj0AS<75$3HPD^_}@&VbGqj#6F`)A+6xAXkICj=d-{i(`MJK4Ec^y`K_h^xYWXM8WI z{YCr#4vj|R8T$3ZVl37?=-W${;~)pPp2GrD4Q(lY39AIumZh%LKU){*8Sjj$d)6|F=3>#Tq<35>Ol4c z!l6Nyin5gTeW0d z(mw?QH(5siS*rVpPCcfQLQ^xHaUjw-yeXc=0 zE}gS2T5I?XlfBOVcHG)n+w1|bQQlVyf*=TjAP9mW2!bF8f*=TjV1x2MyVHCD;b>r^ P00000NkvXXu0mjfPTrR# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/glow.png b/app/src/main/res/drawable/glow.png new file mode 100644 index 0000000000000000000000000000000000000000..b96e5b46c7238742e7a0b38ff3a9a443e7d0a4ca GIT binary patch literal 5856 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/solid_background.xml b/app/src/main/res/drawable/solid_background.xml new file mode 100644 index 0000000..c41b00a --- /dev/null +++ b/app/src/main/res/drawable/solid_background.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/popup_window.xml b/app/src/main/res/layout/popup_window.xml new file mode 100644 index 0000000..51b7027 --- /dev/null +++ b/app/src/main/res/layout/popup_window.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..b7ea914c2f6932855bae5021a870af9500dec045 GIT binary patch literal 470 zcmV;{0V)1cNk&G_0RRA3MM6+kP&iD%0RR9mN5ByfRY=nI&yb|A-8kk`?NVoVD~>XP0euGVOw=Pp~8dXX)|`kv0%WT10Dk0Y4(a8;Rg` z$Xb@b4@B|yp-g8|2Bb=Y;5^0*15Qsc^mla$)s6iIw( zN@`qZqu*Oe?i5)g-qX0?*R&E7w(N*+o8W~V^Fc)Y(Vil*o`@vhQcu=98V@!3)+$n| znzBqjVO92BbBFShY58O=`z(_9SO-~WM3UbdBkQa`ew<-4Oy|7VTN)4KYRzX!PjrKG zogUHH61z;}K$#rXIqt59lvgb%1n2Aw|B&*YQyRqjT=c+0@o=D5o*cPSjhZNH6>#xT ztBKN=a>{Z|)MfG@SD8w)zcsX2~urJ4(up)=mKu(89h7sPuk4W&vI2odjB}0=r z2a$ZU7|0UzDKg4z{u=i@@xWuIt>@k`%P1v+A(1k}^q62W^PV00g217jTkM%K4S8R1r^>Iz^RXg7-k!kPVk(7E`tbz0J{vg1XNuH zh~Sn1FB<5iv~g2iS>}BRdc#v7gD!*32c84IWoW{r!7>aY*2^%7*#G@^tzZzb?yMsQ zoo__zD``dyJN<}uXBCn7O6)!Xz~AwLfGaMzh2#VIW8Iq(gA|o5Mr<$`8HNKC?r5|iM7TZrVN$Vsy=0R=`^0KU>p@)6`@tQAm*C{R?u3gbvV zm_Uwk01Bk9<{=Iff0(VL0SY+aSP}-3lQRK^^qcvDlk|VjZDfD}&LR0Aa&k1lka?7| zq<%mS7~pu44Nt)g4HiSJON6D$ z#PMXXjrG~2n|Pk|+u3&=uktSM5q+DN*+5x#84(z6AEd}?KISZmZ?TAiB-m$sU_{>o zoFL^-uB9v!0yVoJMhfPzf<)MDH1Qm%+E|}W`ibL6+2Z;v(?%S}ImDk}busu) z6UUKEqqpkwp+*^zpw5H!d0L%7Bomx~cr}2t1%Zg;^;rk8CJ{Cm&T~X0X!ZqIO$@%* zB2b{@W{5S3aIca);N(Wx1hF0wwwNgA0#c{V8({S?_&}RFiprFn2uQU^fHReZ7^&Cc zC$L%={GqCzdIe=?0a6_j;38#tA8F9(Gbrj%z}Gr8P@+uPT)QCFAi^$(DGMp2L5D}d zYGCk;4vmz|DXaMoM~d$E{z1OCRloi6Gh%Jl0G7GhNPzpSZ0b=Ipr#;IN`vq zlbo@HpSgnIHIj}KEaNv)PTN83c8ZD;IfI=EWQUG=|&l;yoGe=``N~(r;$M_Ne6NeHR0AF>- z8m_9u(a3^!y~ebc`Aq~wCQ3Py$V5Q&TYH5udbJBQKBuIjW_)|0_iX?G#+ca47y|$s zyx(4AyqbyTsdXk-8n C4rlZL literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf45a1085ad5788df28780cebd931845f085654f GIT binary patch literal 392 zcmV;30eAjVNk&G10RRA3MM6+kP&iC<0RR9mFTe{BHAu0wZP}^|cbDeSU;=I#BFPik z-Q9f-R3CvJ?`}hI|I_*8e{o3n8v)6-ZPU*A=e-}>w$X~Dn(ny=MytM24Ce&sx}=~q zE^nlW3rNZXNr+iCSU1cDvxG<&l3;{uYP5}uYeoptjaytu9;i4`5X{j4U;G*8OEg&~ zDE^}q`*gvdj9by;grIcdfR3MV*$P=(AeBE(J<#4g~SZj|J^2J%u5}gTfY;$3f zJ?7NzE+kH^dXg$cxi|y93y}0#ql>dEz;V^Z+2gb(I1!R0v(`qrI1$FZ^@;S+jzkwG z&l>@bB`!>%cbqCc7|8U3!#70`?TEu4b)aod-GUOL!lE^j8bpAK%~&I;T^uOOs5O$h zrSnAx{K>c#Jx<*?qI*F&ccLIzqXoYBGtQT2v*RR^As%rdd1aU+oG3WugARRq)~GBU mJ~^jw5y>#yTySNaOSTy%33rkKMwu|qC<7$nnUbn;N?n&u=CeWo literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..b1b19a179ba26484c389526af1e6905a9904603f GIT binary patch literal 214 zcmV;{04e`cNk&G_00012MM6+kP&iD&0000lYrq;1g~K+I6lwBL+6S|}&kPZ6Yi(PT zFZrufQijf<`d1(wS%Sj=wt&0a0N%ND4v~sgv~>F>px{Sx43DrxFUE_zcp5Nuz+E_I zzX5&stBOUot&ZdAlf_$*gi}YaF$U%<}9QY>`9@GwgF$v3I`2yK>h)GqfNH&kiOe z%9-MtAL#5ynW8L-FbuJJxQTE0 zi^ku%nWltRoM8ypp%QyRE6w{kK~wIdEwo}kL#mCBWuTQYLMv7hzD0=6GSG|@8kz1y zXkbY^g@~~t!gH3eGknYgmBy23EGB#smMEhTGK?1)6sbU15xdPfCXaa%@`V5-o zJj0*-#q4i9z#QZFq7{keGi&*Xzi57%1xC`AL<8@p5F1k+4L4 zMOd3nK?cPd5tbype5OwoC<}xdY?|ey8bYJwL%Nm3Y$1aO&K0`ZG@HaXmpD z=Toi$nd32j-~?6mE1$3pWGByZoD)>l&-%2k!#Q<0rY)?X@xk*KauFA07m>rvfn*Km zauG=`WG72NvV{w|h~%Q|0@mT8CIUyga`H5F1`#C;S|Z|{X7YH_z2s>$x65BhV)ZMr z;P2dSjpXs9FDs{x30@+SNTn`CMG5iJBz5FC(w~u2S?jsYijahMOcF(NTeMMGjv<2z z^3>99Znb;9qO-5=&8^n1kQILO$7o=Mr3(G m1vNF&S_ggfEq!!|Mrx`c@GKdb;pHMIP*(Yh0zs~LhV%x0QLeB6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..bef9a571ae3fd7b05cbeb5cec026e90deca6fd0d GIT binary patch literal 648 zcmV;30(bpVNk&G10ssJ4MM6+kP&iC;0ssInU%(d-g_LdE&;L1p_;a>xZ@;#eu)P2_ zqy5v&%I0-1GI`BtwwKIrj%s3+C$hNK8%0B1Z``!KH?(P;+bik!GzX-{RiJ&#^ z7Polrw+CnuNG&`u zAml8Hu+a~+L!phIb_peuWRL$LG4H69O|~~E{yQdTQ|xc8f;tV7>lL(~c_);rD{67a z7m@g{9$BqffM$9xlJ=7p0oo&y{)7M>mf^g=MRhdWR=Xu`F;%?)H96pmNXmDX2+$O7 zMN;3_TX<%RqC+e<%_<{i@sfeFsuo4ox zn4ltYjAm3*&HoJXKNkmrV&2I-?D8`temR^?R!n+|Rw%Ua%Ia)FZP+a|bi$ycf!l`F zBAWq6yhB4%JAj%R_~3*=UD+f9R=ey2f%MUJs|`xogvx|1<+JX1>yHKV7HZnO1%JJD zw|vePlPZy;q}wW6>?@xxoiAM}U9R!cmD2h08T)LpO1G4UkoB0h(N;U{s(CwYwb8U5 iS>!9J^&2;1)~XseYsR>KwIp(v6qUN>Rf;5jF9iS>Hb1%m literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..7889852ce58aecce94fbc285905d7a8aac762692 GIT binary patch literal 348 zcmV-i0i*s>Nk&Fg0RRA3MM6+kP&iCS0RR9m*T6LpH9&IPNRssbSM$~xk(hMN9-R@8 zYuh$ul^uhTg{>6qp3R#-(NMv>dwBwGLM$* zsPWOc1+`!!?C^-(f^w?i>3}*P#M!yIjd-&2+aZ_T?STFhfXglmEfb4Ya&kk!>pQ*+TwSjS`Clf uv9=EQ(8Sp`5l2QWpa?CKX2o2O4ueSwTBaySx^E&LtMT9XZ~XURy#WAN<*%v$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b7f63c37a9d360702e78a7b66af9a74d31b6d5a2 GIT binary patch literal 1928 zcmV;32Y2{VNk&G12LJ$9MM6+kP&iC<2LJ#sU%(d-WhiLdhDrFt?k zfWytFWpymM+4e|G9(imjS4!9`h`4biX@GhtB*h@QpaJM0844TeoEb;N03~z?Hwdv2CNYZ9BD7 zrra`CWjpCo+fM3~wrx9^Zsz-D5z+q%fd5CrFl>`yNHh$`u`tMT91{g$c^0a2I&>N^ zV#I(>9db}*d6w+Qas&Wm4B6E2ZuWxreQ%*Z{q1jmTIf6Pd%?|)x2Yi+03aN@7smpC z>9%sUxBY<={oyTF+sbqRV7Yx*7C_Nv?lc?Eq96#ONGYYFCI)X91PSav=GP+6A(>FxVU5r(TN1O1vp^ciYVala~5{>vRiUAI3Nm$ZsUNv zj0Z)}Af-5b&u=8){{>SXNGW<&Gw>I2pv5aFNI0xLN05JFE+`4;Rb}8V;Xu*LDBwh= z0}L7DgD9X^v;cPj3#_M6z?mK=s3~43pl5ktr!fF-K|$I}6431gm{}}19;t+Tp+wQi zz)s@9+K3c)LyBla;HPk);yV;@KNQjTW&$^X5aKQrFai|N{R|;E4s3-e#ULTt5x5~1 zH2WMyi~&XTr8Z!Ph*MF-C{RS_k`Wg4Sco(ZiheN!TpveVj3UN?BD$LNaiGh5q>)gx zz##BFEO7!-j07n^*z5>jJ8 z)elHFQS!|b19KdO0E&Ln1#FEcHb<29P%J(FCBUzhWPpTdCn8g08CM|1Jp!Kza!r$k z6y3vF1j0XADB;ji|!ENesF(9-9;Z7{$7^IT? zktjNyVF7>;&J8G{{6P`j!4m?&fQ)CO@_#vC02rd+ov3`EOjrPxsQ9W!!7eR>ogSer zlr7(?)zr;K+7K4q6Y#R1EKxMqXoWH4myXbP0{>sqkSV`fl&Ki^dq)+)-nq+^KP**Y zP4x7lo#cTS_j>=pUH8XvUVnibPRxir|FpRQyqVj<%!vYXSljoxH ze`SUNAe@4mqH?z)M*x7Ab0SKT{E;Mdt{e|14Yom~@lZs2XplK^G8VHSCcjughCdNr zyVqm#t{FUY0$C;3#N-YoS*R)42~mnhLbShvh8nBUu`vFAdQ2fc~()<0Nq53?h0=U73SnBByEzU*SWDKtSJEMpc1~0i&d5 zXW@ZAbdviqYLZrmdrzb&*h@``g_*n#z3JSK{LP;_aOX;K+(z}$^8YZ8yd_0U7wgr* z!&IVC)!>`Ezw)>KNL~Mrl!Qgbi!%ZWic-!rMM}j=rv2~($0~2KzJRxE#f&u zx(7w{qQ!OV;0atwWK{H+a4({;gMjD(lX_HS2wY2KwCgsO&Nqc3U5$!pDqU<$w{{r< zR})^VZX?I;zCsk%5)gfz_A;VdD^K8h!fV!LC@=3}L@KT$QbdpD6%Faq!V_4Lu<~Z< zGoB9h2_mJ^3KFG=K23)k*JqYIOJGq(gNnN0vUIxKY(z<R z39qQ8&sbh7-Q;IP6hvvBBnpV==XCS2jxl{|iaddp39CW7ZUe^in&}cBA|g^ssWc){ zN+}|u57VW2ZQ}-XYuCUMSe$V3DtZhUD@&$>Jmg!fQt?cwc&1qOjfc`fWhr9@^r*;l z1U6)Nc@qropSOMCM{~?K-yA>s!rT7m?sP#q@YtX%Q6`KU&|{`nIi7)y2`j6hT}@rD zL8HdYWLc~%l~>Gb92*=P9UC1RUwmUrK%(^%P|B(Bn&5`QC_pMHWgJ>RaF&j%9`ah%5V&UPzhle OmgP8(V_AkF1eOIQaCy!E literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..95473bb448e97b24ffe01847e12ad5986db8f572 GIT binary patch literal 902 zcmV;119|*XNk&F~0{{S5MM6+kP&iC-0{{RokH8}kRSrS6P3N!uJ48e(^vcSLY}>V! zzKNVXP|pblu!4c40S8G7DzE^*AOOxj=PYtqYwZX**0!fsmE=#(R`dw&?(VKbaHpbj z8-Y{7Tv(L!UblUxPDrYVOWy!!UF^PL_Xnj$f@ z0)**s1!1<%M8gnf6pB+ket@$I$^?c6k*O2PcZJzi`g0D!lX4BdE6^@?jKoLGHUk_8 zl>_FQ8bKgO@i?An0N$cJ6)%=qehTBg9D(F{1AZ)B-c@8SM@}W2csLp+HK3LG4oDL< zplK>2(vkurR7Iq9U&M5cv5nN2uZF%h5&y2WZS1YZ8k^5R-w&aPTSUHYPcyR<1lcJ> zu}}nhV@R|PcbG7LEhO?OlBM8Zz_*o ziZ3u#48;&^-S;OEX&G!OhIR@eO#?&NJ(V6JR8whqLB!Wl48?dcuL$tmjbaK@2sEE! zhMO=g6f@q2>GKYy)x3&(uI@XlS!Q`rjSJvT|dWmvy1?~m4bzl4zFK~qeU~5%;hLFc09w{AGvgLIf5bR7`U-yIT31N087w% zJhlYc18|x+d7gn22?q|p6*V0nKnY1R3&n|p0|!`?Ce$NHwp97Y4JdB%_yNw$I^eh` zUmBYnkOW;&j*{cz;WvbN_;XxSB1e!;U;}ZAEm5JebJKDEaOuAfE@$V{hyRDm$d3LlXKO{^3}N-vd{>T~yL;54%Pr@_9|lu|`f#L@_CD30i2CCgQ+d|oO8oKtD1 zSUSSTWTPosSgI@qij?lYBKfjfSTr5s*yu(AOwocO5+#-7U9V~pK`~4Lgk$5o5k+G# cS;^k@%xW5i@WxizO%w{SsvBEz2bg~<1!o$fzyJUM literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..ad197b3e94359da4657e4a17b1eb7a8eae86481c GIT binary patch literal 574 zcmV-E0>S-KNk&FC0ssJ4MM6+kP&iB}0ssInL%~oG1>820BuVAJ(-gZpg+}e(QxR}( z+cx#w53z0Aw%#9zZKtyBq_eHk>C)M@ZQHo-oe3zk{$KyE|JVQP|MmZ`qqvv|mMXVh z0$&=~Cj^HWYv8VbqZ~2EgRp)ixb8~{=5XLM3?da{&W3zchA;M`LEb$GHH~vJM50ps z(Vq-$AXeaH7|4-48HRJ@uK(75>%X6T=oF+HcLjrX57w14#WEjQ#kc~uy=x{g9axpa z;6BO-@!3EZ4TDI%SVn`oE076u9t~L_)gb0%Scq{?VKUsu_+~U2$QTsc$pE>C_1~8a zP8!S+?X2h$nGw>8Yazsz;%Cea7+hpA0QA`hGjMwxCN0&A)|ps zCkVAqbTTM-OM!V!1}_k+ZZgE?=${O^IfmDN>%aBi`fvUBBSvhF{xkhKV$VFs_+|P^ zJaROismJN_?{>J=q-gv>O3IftkadB3n*WXRgo^# zjg^Bj5B@G7z1t9nuh4VjXTTQG&WAo^L;!BJ@azy4qU Mum9Ko>;LUD0Am>%#Q*>R literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..f4ba3f382005a9e70d71903c3392debb58cd923f GIT binary patch literal 3184 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..77dcd8a3d09bd3c9d9418507b5b82e6fce2ebe57 GIT binary patch literal 1166 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 K?KqB2`YHf5 + + #6200EE + #2600B3 + + #00B988 + #60EEB2 + #FFF500 + #FB8C65 + #FE581F + #D60404 + #B700A2 + \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..beab31f --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #000000 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..6fd0ff1 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + Powerbar + Powerbar + \ No newline at end of file diff --git a/app/src/main/res/xml/extension_info.xml b/app/src/main/res/xml/extension_info.xml new file mode 100644 index 0000000..46bffd9 --- /dev/null +++ b/app/src/main/res/xml/extension_info.xml @@ -0,0 +1,8 @@ + + + + diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..f41eb6b --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,6 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.jetbrains.kotlin.android) apply false + alias(libs.plugins.compose.compiler) apply false +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..cd0519b --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..bc7afbf --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,52 @@ +[versions] +agp = "8.5.0" +color = "1.3.0" +datastorePreferences = "1.1.1" +kotlin = "2.0.0" + +androidxCore = "1.13.1" +androidxLifecycle = "2.8.6" +androidxActivity = "1.9.3" +androidxComposeUi = "1.7.4" +androidxComposeMaterial = "1.3.0" +glance = "1.1.1" +kotlinxSerializationJson = "1.7.3" +lifecycleRuntimeKtx = "2.8.7" +navigationRuntimeKtx = "2.8.4" +navigationCompose = "2.8.4" +cardview = "1.0.0" + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } + +[libraries] +androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } +androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +color = { module = "com.maxkeppeler.sheets-compose-dialogs:color", version.ref = "color" } +hammerhead-karoo-ext = { group = "io.hammerhead", name = "karoo-ext", version = "1.1.1" } + +androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidxCore" } + +# compose +androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidxLifecycle" } +androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidxLifecycle" } + +androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" } +androidx-compose-ui = { module = "androidx.compose.ui:ui", version.ref = "androidxComposeUi" } +androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "androidxComposeUi" } +androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "androidxComposeUi" } +androidx-compose-material = { module = "androidx.compose.material3:material3", version.ref = "androidxComposeMaterial" } + +# Glance +androidx-glance-appwidget = { group = "androidx.glance", name = "glance-appwidget", version.ref = "glance" } +androidx-glance-preview = { group = "androidx.glance", name = "glance-preview", version.ref = "glance" } +androidx-navigation-runtime-ktx = { group = "androidx.navigation", name = "navigation-runtime-ktx", version.ref = "navigationRuntimeKtx" } +androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } +androidx-cardview = { group = "androidx.cardview", name = "cardview", version.ref = "cardview" } + +[bundles] +androidx-lifeycle = ["androidx-lifecycle-runtime-compose", "androidx-lifecycle-viewmodel-compose"] +compose-ui = ["androidx-compose-ui", "androidx-compose-material", "androidx-compose-ui-tooling-preview", "androidx-compose-ui-tooling"] \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..943f0cbfa754578e88a3dae77fce6e3dea56edbf GIT binary patch literal 61574 zcmb6AV{~QRwml9f72CFLyJFk6ZKq;e729@pY}>YNR8p1vbMJH7ubt# zZR`2@zJD1Ad^Oa6Hk1{VlN1wGR-u;_dyt)+kddaNpM#U8qn@6eX;fldWZ6BspQIa= zoRXcQk)#ENJ`XiXJuK3q0$`Ap92QXrW00Yv7NOrc-8ljOOOIcj{J&cR{W`aIGXJ-` z`ez%Mf7qBi8JgIb{-35Oe>Zh^GIVe-b^5nULQhxRDZa)^4+98@`hUJe{J%R>|LYHA z4K3~Hjcp8_owGF{d~lZVKJ;kc48^OQ+`_2migWY?JqgW&))70RgSB6KY9+&wm<*8 z_{<;(c;5H|u}3{Y>y_<0Z59a)MIGK7wRMX0Nvo>feeJs+U?bt-++E8bu7 zh#_cwz0(4#RaT@xy14c7d<92q-Dd}Dt<*RS+$r0a^=LGCM{ny?rMFjhgxIG4>Hc~r zC$L?-FW0FZ((8@dsowXlQq}ja%DM{z&0kia*w7B*PQ`gLvPGS7M}$T&EPl8mew3In z0U$u}+bk?Vei{E$6dAYI8Tsze6A5wah?d(+fyP_5t4ytRXNktK&*JB!hRl07G62m_ zAt1nj(37{1p~L|m(Bsz3vE*usD`78QTgYIk zQ6BF14KLzsJTCqx&E!h>XP4)bya|{*G7&T$^hR0(bOWjUs2p0uw7xEjbz1FNSBCDb@^NIA z$qaq^0it^(#pFEmuGVS4&-r4(7HLmtT%_~Xhr-k8yp0`$N|y>#$Ao#zibzGi*UKzi zhaV#@e1{2@1Vn2iq}4J{1-ox;7K(-;Sk{3G2_EtV-D<)^Pk-G<6-vP{W}Yd>GLL zuOVrmN@KlD4f5sVMTs7c{ATcIGrv4@2umVI$r!xI8a?GN(R;?32n0NS(g@B8S00-=zzLn z%^Agl9eV(q&8UrK^~&$}{S(6-nEXnI8%|hoQ47P?I0Kd=woZ-pH==;jEg+QOfMSq~ zOu>&DkHsc{?o&M5`jyJBWbfoPBv9Y#70qvoHbZXOj*qRM(CQV=uX5KN+b>SQf-~a8 ziZg}@&XHHXkAUqr)Q{y`jNd7`1F8nm6}n}+_She>KO`VNlnu(&??!(i#$mKOpWpi1 z#WfWxi3L)bNRodhPM~~?!5{TrrBY_+nD?CIUupkwAPGz-P;QYc-DcUoCe`w(7)}|S zRvN)9ru8b)MoullmASwsgKQo1U6nsVAvo8iKnbaWydto4y?#-|kP^%e6m@L`88KyDrLH`=EDx*6>?r5~7Iv~I zr__%SximG(izLKSnbTlXa-ksH@R6rvBrBavt4)>o3$dgztLt4W=!3=O(*w7I+pHY2(P0QbTma+g#dXoD7N#?FaXNQ^I0*;jzvjM}%=+km`YtC%O#Alm| zqgORKSqk!#^~6whtLQASqiJ7*nq?38OJ3$u=Tp%Y`x^eYJtOqTzVkJ60b2t>TzdQ{I}!lEBxm}JSy7sy8DpDb zIqdT%PKf&Zy--T^c-;%mbDCxLrMWTVLW}c=DP2>Td74)-mLl|70)8hU??(2)I@Zyo z2i`q5oyA!!(2xV~gahuKl&L(@_3SP012#x(7P!1}6vNFFK5f*A1xF({JwxSFwA|TM z&1z}!*mZKcUA-v4QzLz&5wS$7=5{M@RAlx@RkJaA4nWVqsuuaW(eDh^LNPPkmM~Al zwxCe@*-^4!ky#iNv2NIIU$CS+UW%ziW0q@6HN3{eCYOUe;2P)C*M`Bt{~-mC%T3%# zEaf)lATO1;uF33x>Hr~YD0Ju*Syi!Jz+x3myVvU^-O>C*lFCKS&=Tuz@>&o?68aF& zBv<^ziPywPu#;WSlTkzdZ9`GWe7D8h<1-v0M*R@oYgS5jlPbgHcx)n2*+!+VcGlYh?;9Ngkg% z=MPD+`pXryN1T|%I7c?ZPLb3bqWr7 zU4bfG1y+?!bw)5Iq#8IqWN@G=Ru%Thxf)#=yL>^wZXSCC8we@>$hu=yrU;2=7>h;5 zvj_pYgKg2lKvNggl1ALnsz2IlcvL;q79buN5T3IhXuJvy@^crqWpB-5NOm{7UVfxmPJ>`?;Tn@qHzF+W!5W{8Z&ZAnDOquw6r4$bv*jM#5lc%3v|c~^ zdqo4LuxzkKhK4Q+JTK8tR_|i6O(x#N2N0Fy5)!_trK&cn9odQu#Vlh1K~7q|rE z61#!ZPZ+G&Y7hqmY;`{XeDbQexC2@oFWY)Nzg@lL3GeEVRxWQlx@0?Zt`PcP0iq@6 zLgc)p&s$;*K_;q0L(mQ8mKqOJSrq$aQYO-Hbssf3P=wC6CvTVHudzJH-Jgm&foBSy zx0=qu$w477lIHk);XhaUR!R-tQOZ;tjLXFH6;%0)8^IAc*MO>Q;J={We(0OHaogG0 zE_C@bXic&m?F7slFAB~x|n#>a^@u8lu;=!sqE*?vq zu4`(x!Jb4F#&3+jQ|ygldPjyYn#uCjNWR)%M3(L!?3C`miKT;~iv_)dll>Q6b+I&c zrlB04k&>mSYLR7-k{Od+lARt~3}Bv!LWY4>igJl!L5@;V21H6dNHIGr+qV551e@yL z`*SdKGPE^yF?FJ|`#L)RQ?LJ;8+={+|Cl<$*ZF@j^?$H%V;jqVqt#2B0yVr}Nry5R z5D?S9n+qB_yEqvdy9nFc+8WxK$XME$3ftSceLb+L(_id5MMc*hSrC;E1SaZYow%jh zPgo#1PKjE+1QB`Of|aNmX?}3TP;y6~0iN}TKi3b+yvGk;)X&i3mTnf9M zuv3qvhErosfZ%Pb-Q>|BEm5(j-RV6Zf^$icM=sC-5^6MnAvcE9xzH@FwnDeG0YU{J zi~Fq?=bi0;Ir=hfOJu8PxC)qjYW~cv^+74Hs#GmU%Cw6?3LUUHh|Yab`spoqh8F@_ zm4bCyiXPx-Cp4!JpI~w!ShPfJOXsy>f*|$@P8L8(oeh#~w z-2a4IOeckn6}_TQ+rgl_gLArS3|Ml(i<`*Lqv6rWh$(Z5ycTYD#Z*&-5mpa}a_zHt z6E`Ty-^L9RK-M*mN5AasoBhc|XWZ7=YRQSvG)3$v zgr&U_X`Ny0)IOZtX}e$wNUzTpD%iF7Rgf?nWoG2J@PsS-qK4OD!kJ?UfO+1|F*|Bo z1KU`qDA^;$0*4mUJ#{EPOm7)t#EdX=Yx1R2T&xlzzThfRC7eq@pX&%MO&2AZVO%zw zS;A{HtJiL=rfXDigS=NcWL-s>Rbv|=)7eDoOVnVI>DI_8x>{E>msC$kXsS}z?R6*x zi(yO`$WN)_F1$=18cbA^5|f`pZA+9DG_Zu8uW?rA9IxUXx^QCAp3Gk1MSdq zBZv;_$W>*-zLL)F>Vn`}ti1k!%6{Q=g!g1J*`KONL#)M{ZC*%QzsNRaL|uJcGB7jD zTbUe%T(_x`UtlM!Ntp&-qu!v|mPZGcJw$mdnanY3Uo>5{oiFOjDr!ZznKz}iWT#x& z?*#;H$`M0VC|a~1u_<(}WD>ogx(EvF6A6S8l0%9U<( zH||OBbh8Tnzz*#bV8&$d#AZNF$xF9F2{_B`^(zWNC}af(V~J+EZAbeC2%hjKz3V1C zj#%d%Gf(uyQ@0Y6CcP^CWkq`n+YR^W0`_qkDw333O<0FoO9()vP^!tZ{`0zsNQx~E zb&BcBU>GTP2svE2Tmd;~73mj!_*V8uL?ZLbx}{^l9+yvR5fas+w&0EpA?_g?i9@A$j*?LnmctPDQG|zJ`=EF}Vx8aMD^LrtMvpNIR*|RHA`ctK*sbG= zjN7Q)(|dGpC}$+nt~bupuKSyaiU}Ws{?Tha@$q}cJ;tvH>+MuPih+B4d$Zbq9$Y*U z)iA(-dK?Ov@uCDq48Zm%%t5uw1GrnxDm7*ITGCEF!2UjA`BqPRiUR`yNq^zz|A3wU zG(8DAnY-GW+PR2&7@In{Sla(XnMz5Rk^*5u4UvCiDQs@hvZXoiziv{6*i?fihVI|( zPrY8SOcOIh9-AzyJ*wF4hq%ojB&Abrf;4kX@^-p$mmhr}xxn#fVU?ydmD=21&S)s*v*^3E96(K1}J$6bi8pyUr-IU)p zcwa$&EAF$0Aj?4OYPcOwb-#qB=kCEDIV8%^0oa567_u6`9+XRhKaBup z2gwj*m#(}=5m24fBB#9cC?A$4CCBj7kanaYM&v754(b%Vl!gg&N)ZN_gO0mv(jM0# z>FC|FHi=FGlEt6Hk6H3!Yc|7+q{&t%(>3n#>#yx@*aS+bw)(2!WK#M0AUD~wID>yG z?&{p66jLvP1;!T7^^*_9F322wJB*O%TY2oek=sA%AUQT75VQ_iY9`H;ZNKFQELpZd z$~M`wm^Y>lZ8+F0_WCJ0T2td`bM+b`)h3YOV%&@o{C#|t&7haQfq#uJJP;81|2e+$ z|K#e~YTE87s+e0zCE2X$df`o$`8tQhmO?nqO?lOuTJ%GDv&-m_kP9X<5GCo1=?+LY z?!O^AUrRb~3F!k=H7Aae5W0V1{KlgH379eAPTwq=2+MlNcJ6NM+4ztXFTwI)g+)&Q7G4H%KH_(}1rq%+eIJ*3$?WwnZxPZ;EC=@`QS@|-I zyl+NYh&G>k%}GL}1;ap8buvF>x^yfR*d+4Vkg7S!aQ++_oNx6hLz6kKWi>pjWGO5k zlUZ45MbA=v(xf>Oeqhg8ctl56y{;uDG?A9Ga5aEzZB80BW6vo2Bz&O-}WAq>(PaV;*SX0=xXgI_SJ< zYR&5HyeY%IW}I>yKu^?W2$~S!pw?)wd4(#6;V|dVoa}13Oiz5Hs6zA zgICc;aoUt$>AjDmr0nCzeCReTuvdD1{NzD1wr*q@QqVW*Wi1zn;Yw1dSwLvTUwg#7 zpp~Czra7U~nSZZTjieZxiu~=}!xgV68(!UmQz@#w9#$0Vf@y%!{uN~w^~U_d_Aa&r zt2l>)H8-+gA;3xBk?ZV2Cq!L71;-tb%7A0FWziYwMT|#s_Ze_B>orZQWqDOZuT{|@ zX04D%y&8u@>bur&*<2??1KnaA7M%%gXV@C3YjipS4|cQH68OSYxC`P#ncvtB%gnEI z%fxRuH=d{L70?vHMi>~_lhJ@MC^u#H66=tx?8{HG;G2j$9@}ZDYUuTetwpvuqy}vW)kDmj^a|A%z(xs7yY2mU0#X2$un&MCirr|7 z%m?8+9aekm0x5hvBQ2J+>XeAdel$cy>J<6R3}*O^j{ObSk_Ucv$8a3_WPTd5I4HRT z(PKP5!{l*{lk_19@&{5C>TRV8_D~v*StN~Pm*(qRP+`1N12y{#w_fsXrtSt={0hJw zQ(PyWgA;;tBBDql#^2J(pnuv;fPn(H>^d<6BlI%00ylJZ?Evkh%=j2n+|VqTM~EUh zTx|IY)W;3{%x(O{X|$PS&x0?z#S2q-kW&G}7#D?p7!Q4V&NtA_DbF~v?cz6_l+t8e zoh1`dk;P-%$m(Ud?wnoZn0R=Ka$`tnZ|yQ-FN!?!9Wmb^b(R!s#b)oj9hs3$p%XX9DgQcZJE7B_dz0OEF6C zx|%jlqj0WG5K4`cVw!19doNY+(;SrR_txAlXxf#C`uz5H6#0D>SzG*t9!Fn|^8Z8; z1w$uiQzufUzvPCHXhGma>+O327SitsB1?Rn6|^F198AOx}! zfXg22Lm0x%=gRvXXx%WU2&R!p_{_1H^R`+fRO2LT%;He@yiekCz3%coJ=8+Xbc$mN zJ;J7*ED|yKWDK3CrD?v#VFj|l-cTgtn&lL`@;sMYaM1;d)VUHa1KSB5(I54sBErYp z>~4Jz41?Vt{`o7T`j=Se{-kgJBJG^MTJ}hT00H%U)pY-dy!M|6$v+-d(CkZH5wmo1 zc2RaU`p3_IJ^hf{g&c|^;)k3zXC0kF1>rUljSxd}Af$!@@R1fJWa4g5vF?S?8rg=Z z4_I!$dap>3l+o|fyYy(sX}f@Br4~%&&#Z~bEca!nMKV zgQSCVC!zw^j<61!7#T!RxC6KdoMNONcM5^Q;<#~K!Q?-#6SE16F*dZ;qv=`5 z(kF|n!QIVd*6BqRR8b8H>d~N@ab+1+{3dDVPVAo>{mAB#m&jX{usKkCg^a9Fef`tR z?M79j7hH*;iC$XM)#IVm&tUoDv!(#f=XsTA$)(ZE37!iu3Gkih5~^Vlx#<(M25gr@ zOkSw4{l}6xI(b0Gy#ywglot$GnF)P<FQt~9ge1>qp8Q^k;_Dm1X@Tc^{CwYb4v_ld}k5I$&u}avIDQ-D(_EP zhgdc{)5r_iTFiZ;Q)5Uq=U73lW%uYN=JLo#OS;B0B=;j>APk?|!t{f3grv0nv}Z%` zM%XJk^#R69iNm&*^0SV0s9&>cl1BroIw*t3R0()^ldAsq)kWcI=>~4!6fM#0!K%TS ziZH=H%7-f=#-2G_XmF$~Wl~Um%^9%AeNSk)*`RDl##y+s)$V`oDlnK@{y+#LNUJp1^(e89sed@BB z^W)sHm;A^9*RgQ;f(~MHK~bJRvzezWGr#@jYAlXIrCk_iiUfC_FBWyvKj2mBF=FI;9|?0_~=E<)qnjLg9k*Qd!_ zl}VuSJB%#M>`iZm*1U^SP1}rkkI};91IRpZw%Hb$tKmr6&H5~m?A7?+uFOSnf)j14 zJCYLOYdaRu>zO%5d+VeXa-Ai7{7Z}iTn%yyz7hsmo7E|{ z@+g9cBcI-MT~2f@WrY0dpaC=v{*lDPBDX}OXtJ|niu$xyit;tyX5N&3pgmCxq>7TP zcOb9%(TyvOSxtw%Y2+O&jg39&YuOtgzn`uk{INC}^Na_-V;63b#+*@NOBnU{lG5TS zbC+N-qt)u26lggGPcdrTn@m+m>bcrh?sG4b(BrtdIKq3W<%?WuQtEW0Z)#?c_Lzqj*DlZ zVUpEV3~mG#DN$I#JJp3xc8`9ex)1%Il7xKwrpJt)qtpq}DXqI=5~~N}N?0g*YwETZ z(NKJO5kzh?Os`BQ7HYaTl>sXVr!b8>(Wd&PU*3ivSn{;q`|@n*J~-3tbm;4WK>j3&}AEZ*`_!gJ3F4w~4{{PyLZklDqWo|X}D zbZU_{2E6^VTCg#+6yJt{QUhu}uMITs@sRwH0z5OqM>taO^(_+w1c ztQ?gvVPj<_F_=(ISaB~qML59HT;#c9x(;0vkCi2#Zp`;_r@+8QOV1Ey2RWm6{*J&9 zG(Dt$zF^7qYpo9Ne}ce5re^j|rvDo*DQ&1Be#Fvo#?m4mfFrNZb1#D4f`Lf(t_Fib zwxL3lx(Zp(XVRjo_ocElY#yS$LHb6yl;9;Ycm1|5y_praEcGUZxLhS%7?b&es2skI z9l!O)b%D=cXBa@v9;64f^Q9IV$xOkl;%cG6WLQ`_a7I`woHbEX&?6NJ9Yn&z+#^#! zc8;5=jt~Unn7!cQa$=a7xSp}zuz#Lc#Q3-e7*i`Xk5tx_+^M~!DlyBOwVEq3c(?`@ zZ_3qlTN{eHOwvNTCLOHjwg0%niFYm({LEfAieI+k;U2&uTD4J;Zg#s`k?lxyJN<$mK6>j?J4eOM@T*o?&l@LFG$Gs5f4R*p*V1RkTdCfv9KUfa< z{k;#JfA3XA5NQJziGd%DchDR*Dkld&t;6i9e2t7{hQPIG_uDXN1q0T;IFCmCcua-e z`o#=uS2_en206(TuB4g-!#=rziBTs%(-b1N%(Bl}ea#xKK9zzZGCo@<*i1ZoETjeC zJ)ll{$mpX7Eldxnjb1&cB6S=7v@EDCsmIOBWc$p^W*;C0i^Hc{q(_iaWtE{0qbLjxWlqBe%Y|A z>I|4)(5mx3VtwRBrano|P))JWybOHUyOY67zRst259tx;l(hbY@%Z`v8Pz^0Sw$?= zwSd^HLyL+$l&R+TDnbV_u+h{Z>n$)PMf*YGQ}1Df@Nr{#Gr+@|gKlnv?`s1rm^$1+ zic`WeKSH?{+E}0^#T<&@P;dFf;P5zCbuCOijADb}n^{k=>mBehDD6PtCrn5ZBhh2L zjF$TbzvnwT#AzGEG_Rg>W1NS{PxmL9Mf69*?YDeB*pK!&2PQ7!u6eJEHk5e(H~cnG zZQ?X_rtws!;Tod88j=aMaylLNJbgDoyzlBv0g{2VYRXObL=pn!n8+s1s2uTwtZc

YH!Z*ZaR%>WTVy8-(^h5J^1%NZ$@&_ZQ)3AeHlhL~=X9=fKPzFbZ;~cS**=W-LF1 z5F82SZ zG8QZAet|10U*jK*GVOA(iULStsUDMjhT$g5MRIc4b8)5q_a?ma-G+@xyNDk{pR*YH zjCXynm-fV`*;}%3=+zMj**wlCo6a{}*?;`*j%fU`t+3Korws%dsCXAANKkmVby*eJ z6`2%GB{+&`g2;snG`LM9S~>#^G|nZ|JMnWLgSmJ4!kB->uAEF0sVn6km@s=#_=d)y zzld%;gJY>ypQuE z!wgqqTSPxaUPoG%FQ()1hz(VHN@5sfnE68of>9BgGsQP|9$7j zGqN{nxZx4CD6ICwmXSv6&RD<-etQmbyTHIXn!Q+0{18=!p))>To8df$nCjycnW07Q zsma_}$tY#Xc&?#OK}-N`wPm)+2|&)9=9>YOXQYfaCI*cV1=TUl5({a@1wn#V?y0Yn z(3;3-@(QF|0PA}|w4hBWQbTItc$(^snj$36kz{pOx*f`l7V8`rZK}82pPRuy zxwE=~MlCwOLRC`y%q8SMh>3BUCjxLa;v{pFSdAc7m*7!}dtH`MuMLB)QC4B^Uh2_? zApl6z_VHU}=MAA9*g4v-P=7~3?Lu#ig)cRe90>@B?>})@X*+v&yT6FvUsO=p#n8p{ zFA6xNarPy0qJDO1BPBYk4~~LP0ykPV ztoz$i+QC%Ch%t}|i^(Rb9?$(@ijUc@w=3F1AM}OgFo1b89KzF6qJO~W52U_;R_MsB zfAC29BNUXpl!w&!dT^Zq<__Hr#w6q%qS1CJ#5Wrb*)2P1%h*DmZ?br)*)~$^TExX1 zL&{>xnM*sh=@IY)i?u5@;;k6+MLjx%m(qwDF3?K3p>-4c2fe(cIpKq#Lc~;#I#Wwz zywZ!^&|9#G7PM6tpgwA@3ev@Ev_w`ZZRs#VS4}<^>tfP*(uqLL65uSi9H!Gqd59C&=LSDo{;#@Isg3caF1X+4T}sL2B+Q zK*kO0?4F7%8mx3di$B~b&*t7y|{x%2BUg4kLFXt`FK;Vi(FIJ+!H zW;mjBrfZdNT>&dDfc4m$^f@k)mum{DioeYYJ|XKQynXl-IDs~1c(`w{*ih0-y_=t$ zaMDwAz>^CC;p*Iw+Hm}%6$GN49<(rembdFvb!ZyayLoqR*KBLc^OIA*t8CXur+_e0 z3`|y|!T>7+jdny7x@JHtV0CP1jI^)9){!s#{C>BcNc5#*hioZ>OfDv)&PAM!PTjS+ zy1gRZirf>YoGpgprd?M1k<;=SShCMn406J>>iRVnw9QxsR|_j5U{Ixr;X5n$ih+-=X0fo(Oga zB=uer9jc=mYY=tV-tAe@_d-{aj`oYS%CP@V3m6Y{)mZ5}b1wV<9{~$`qR9 zEzXo|ok?1fS?zneLA@_C(BAjE_Bv7Dl2s?=_?E9zO5R^TBg8Be~fpG?$9I; zDWLH9R9##?>ISN8s2^wj3B?qJxrSSlC6YB}Yee{D3Ex8@QFLZ&zPx-?0>;Cafcb-! zlGLr)wisd=C(F#4-0@~P-C&s%C}GvBhb^tTiL4Y_dsv@O;S56@?@t<)AXpqHx9V;3 zgB!NXwp`=%h9!L9dBn6R0M<~;(g*nvI`A@&K!B`CU3^FpRWvRi@Iom>LK!hEh8VjX z_dSw5nh-f#zIUDkKMq|BL+IO}HYJjMo=#_srx8cRAbu9bvr&WxggWvxbS_Ix|B}DE zk!*;&k#1BcinaD-w#E+PR_k8I_YOYNkoxw5!g&3WKx4{_Y6T&EV>NrnN9W*@OH+niSC0nd z#x*dm=f2Zm?6qhY3}Kurxl@}d(~ z<}?Mw+>%y3T{!i3d1%ig*`oIYK|Vi@8Z~*vxY%Od-N0+xqtJ*KGrqo*9GQ14WluUn z+%c+og=f0s6Mcf%r1Be#e}&>1n!!ZxnWZ`7@F9ymfVkuFL;m6M5t%6OrnK#*lofS{ z=2;WPobvGCu{(gy8|Mn(9}NV99Feps6r*6s&bg(5aNw$eE ztbYsrm0yS`UIJ?Kv-EpZT#76g76*hVNg)L#Hr7Q@L4sqHI;+q5P&H{GBo1$PYkr@z zFeVdcS?N1klRoBt4>fMnygNrDL!3e)k3`TXoa3#F#0SFP(Xx^cc)#e2+&z9F=6{qk z%33-*f6=+W@baq){!d_;ouVthV1PREX^ykCjD|%WUMnNA2GbA#329aEihLk~0!!}k z)SIEXz(;0lemIO{|JdO{6d|-9LePs~$}6vZ>`xYCD(ODG;OuwOe3jeN;|G$~ml%r* z%{@<9qDf8Vsw581v9y+)I4&te!6ZDJMYrQ*g4_xj!~pUu#er`@_bJ34Ioez)^055M$)LfC|i*2*3E zLB<`5*H#&~R*VLYlNMCXl~=9%o0IYJ$bY+|m-0OJ-}6c@3m<~C;;S~#@j-p?DBdr<><3Y92rW-kc2C$zhqwyq09;dc5;BAR#PPpZxqo-@e_s9*O`?w5 zMnLUs(2c-zw9Pl!2c#+9lFpmTR>P;SA#Id;+fo|g{*n&gLi}7`K)(=tcK|?qR4qNT z%aEsSCL0j9DN$j8g(a+{Z-qPMG&O)H0Y9!c*d?aN0tC&GqC+`%(IFY$ll~!_%<2pX zuD`w_l)*LTG%Qq3ZSDE)#dt-xp<+n=3&lPPzo}r2u~>f8)mbcdN6*r)_AaTYq%Scv zEdwzZw&6Ls8S~RTvMEfX{t@L4PtDi{o;|LyG>rc~Um3;x)rOOGL^Bmp0$TbvPgnwE zJEmZ>ktIfiJzdW5i{OSWZuQWd13tz#czek~&*?iZkVlLkgxyiy^M~|JH(?IB-*o6% zZT8+svJzcVjcE0UEkL_5$kNmdrkOl3-`eO#TwpTnj?xB}AlV2`ks_Ua9(sJ+ok|%b z=2n2rgF}hvVRHJLA@9TK4h#pLzw?A8u31&qbr~KA9;CS7aRf$^f1BZ5fsH2W8z}FU zC}Yq76IR%%g|4aNF9BLx6!^RMhv|JYtoZW&!7uOskGSGL+}_>L$@Jg2Vzugq-NJW7 zzD$7QK7cftU1z*Fxd@}wcK$n6mje}=C|W)tm?*V<<{;?8V9hdoi2NRm#~v^#bhwlc z5J5{cSRAUztxc6NH>Nwm4yR{(T>0x9%%VeU&<&n6^vFvZ{>V3RYJ_kC9zN(M(` zp?1PHN>f!-aLgvsbIp*oTZv4yWsXM2Q=C}>t7V(iX*N8{aoWphUJ^(n3k`pncUt&` ze+sYjo)>>=I?>X}1B*ZrxYu`|WD0J&RIb~ zPA_~u)?&`}JPwc1tu=OlKlJ3f!9HXa)KMb|2%^~;)fL>ZtycHQg`j1Vd^nu^XexYkcae@su zOhxk8ws&Eid_KAm_<}65zbgGNzwshR#yv&rQ8Ae<9;S^S}Dsk zubzo?l{0koX8~q*{uA%)wqy*Vqh4>_Os7PPh-maB1|eT-4 zK>*v3q}TBk1QlOF!113XOn(Kzzb5o4Dz@?q3aEb9%X5m{xV6yT{;*rnLCoI~BO&SM zXf=CHLI>kaSsRP2B{z_MgbD;R_yLnd>^1g`l;uXBw7|)+Q_<_rO!!VaU-O+j`u%zO z1>-N8OlHDJlAqi2#z@2yM|Dsc$(nc>%ZpuR&>}r(i^+qO+sKfg(Ggj9vL%hB6 zJ$8an-DbmKBK6u6oG7&-c0&QD#?JuDYKvL5pWXG{ztpq3BWF)e|7aF-(91xvKt047 zvR{G@KVKz$0qPNXK*gt*%qL-boz-*E;7LJXSyj3f$7;%5wj)2p8gvX}9o_u}A*Q|7 z)hjs?k`8EOxv1zahjg2PQDz5pYF3*Cr{%iUW3J+JU3P+l?n%CwV;`noa#3l@vd#6N zc#KD2J;5(Wd1BP)`!IM;L|(d9m*L8QP|M7W#S7SUF3O$GFnWvSZOwC_Aq~5!=1X+s z6;_M++j0F|x;HU6kufX-Ciy|du;T%2@hASD9(Z)OSVMsJg+=7SNTAjV<8MYN-zX5U zVp~|N&{|#Z)c6p?BEBBexg4Q((kcFwE`_U>ZQotiVrS-BAHKQLr87lpmwMCF_Co1M z`tQI{{7xotiN%Q~q{=Mj5*$!{aE4vi6aE$cyHJC@VvmemE4l_v1`b{)H4v7=l5+lm^ ztGs>1gnN(Vl+%VuwB+|4{bvdhCBRxGj3ady^ zLxL@AIA>h@eP|H41@b}u4R`s4yf9a2K!wGcGkzUe?!21Dk)%N6l+#MP&}B0%1Ar*~ zE^88}(mff~iKMPaF+UEp5xn(gavK(^9pvsUQT8V;v!iJt|7@&w+_va`(s_57#t?i6 zh$p!4?BzS9fZm+ui`276|I307lA-rKW$-y^lK#=>N|<-#?WPPNs86Iugsa&n{x%*2 zzL_%$#TmshCw&Yo$Ol?^|hy{=LYEUb|bMMY`n@#(~oegs-nF){0ppwee|b{ca)OXzS~01a%cg&^ zp;}mI0ir3zapNB)5%nF>Sd~gR1dBI!tDL z&m24z9sE%CEv*SZh1PT6+O`%|SG>x74(!d!2xNOt#C5@I6MnY%ij6rK3Y+%d7tr3&<^4XU-Npx{^`_e z9$-|@$t`}A`UqS&T?cd@-+-#V7n7tiZU!)tD8cFo4Sz=u65?f#7Yj}MDFu#RH_GUQ z{_-pKVEMAQ7ljrJ5Wxg4*0;h~vPUI+Ce(?={CTI&(RyX&GVY4XHs>Asxcp%B+Y9rK z5L$q94t+r3=M*~seA3BO$<0%^iaEb2K=c7((dIW$ggxdvnC$_gq~UWy?wljgA0Dwd`ZsyqOC>)UCn-qU5@~!f znAWKSZeKRaq#L$3W21fDCMXS;$X(C*YgL7zi8E|grQg%Jq8>YTqC#2~ys%Wnxu&;ZG<`uZ1L<53jf2yxYR3f0>a;%=$SYI@zUE*g7f)a{QH^<3F?%({Gg)yx^zsdJ3^J2 z#(!C3qmwx77*3#3asBA(jsL`86|OLB)j?`0hQIh>v;c2A@|$Yg>*f+iMatg8w#SmM z<;Y?!$L--h9vH+DL|Wr3lnfggMk*kyGH^8P48or4m%K^H-v~`cBteWvnN9port02u zF;120HE2WUDi@8?&Oha6$sB20(XPd3LhaT~dRR2_+)INDTPUQ9(-370t6a!rLKHkIA`#d-#WUcqK%pMcTs6iS2nD?hln+F-cQPUtTz2bZ zq+K`wtc1;ex_iz9?S4)>Fkb~bj0^VV?|`qe7W02H)BiibE9=_N8=(5hQK7;(`v7E5Mi3o? z>J_)L`z(m(27_&+89P?DU|6f9J*~Ih#6FWawk`HU1bPWfdF?02aY!YSo_!v$`&W znzH~kY)ll^F07=UNo|h;ZG2aJ<5W~o7?*${(XZ9zP0tTCg5h-dNPIM=*x@KO>a|Bk zO13Cbnbn7+_Kj=EEMJh4{DW<))H!3)vcn?_%WgRy=FpIkVW>NuV`knP`VjT78dqzT z>~ay~f!F?`key$EWbp$+w$8gR1RHR}>wA8|l9rl7jsT+>sQLqs{aITUW{US&p{Y)O zRojdm|7yoA_U+`FkQkS?$4$uf&S52kOuUaJT9lP@LEqjKDM)iqp9aKNlkpMyJ76eb zAa%9G{YUTXa4c|UE>?CCv(x1X3ebjXuL&9Dun1WTlw@Wltn3zTareM)uOKs$5>0tR zDA~&tM~J~-YXA<)&H(ud)JyFm+d<97d8WBr+H?6Jn&^Ib0<{6ov- ze@q`#Y%KpD?(k{if5-M(fO3PpK{Wjqh)7h+ojH ztb=h&vmy0tn$eA8_368TlF^DKg>BeFtU%3|k~3lZAp(C$&Qjo9lR<#rK{nVn$)r*y z#58_+t=UJm7tp|@#7}6M*o;vn7wM?8Srtc z3ZFlKRDYc^HqI!O9Z*OZZ8yo-3ie9i8C%KDYCfE?`rjrf(b&xBXub!54yaZY2hFi2w2asEOiO8;Hru4~KsqQZMrs+OhO8WMX zFN0=EvME`WfQ85bmsnPFp|RU;GP^&Ik#HV(iR1B}8apb9W9)Nv#LwpED~%w67o;r! zVzm@zGjsl)loBy6p>F(G+#*b|7BzZbV#E0Pi`02uAC}D%6d12TzOD19-9bhZZT*GS zqY|zxCTWn+8*JlL3QH&eLZ}incJzgX>>i1dhff}DJ=qL{d?yv@k33UhC!}#hC#31H zOTNv5e*ozksj`4q5H+75O70w4PoA3B5Ea*iGSqA=v)}LifPOuD$ss*^W}=9kq4qqd z6dqHmy_IGzq?j;UzFJ*gI5)6qLqdUL;G&E*;lnAS+ZV1nO%OdoXqw(I+*2-nuWjwM-<|XD541^5&!u2 z1XflFJp(`^D|ZUECbaoqT5$#MJ=c23KYpBjGknPZ7boYRxpuaO`!D6C_Al?T$<47T zFd@QT%860pwLnUwer$BspTO9l1H`fknMR|GC?@1Wn`HscOe4mf{KbVio zahne0&hJd0UL#{Xyz=&h@oc>E4r*T|PHuNtK6D279q!2amh%r#@HjaN_LT4j>{&2I z?07K#*aaZ?lNT6<8o85cjZoT~?=J&Xd35I%JJom{P=jj?HQ5yfvIR8bd~#7P^m%B-szS{v<)7i?#at=WA+}?r zwMlc-iZv$GT};AP4k2nL70=Q-(+L_CYUN{V?dnvG-Av+%)JxfwF4-r^Z$BTwbT!Jh zG0YXK4e8t`3~){5Qf6U(Ha0WKCKl^zlqhqHj~F}DoPV#yHqLu+ZWlv2zH29J6}4amZ3+-WZkR7(m{qEG%%57G!Yf&!Gu~FDeSYmNEkhi5nw@#6=Bt& zOKT!UWVY-FFyq1u2c~BJ4F`39K7Vw!1U;aKZw)2U8hAb&7ho|FyEyP~D<31{_L>RrCU>eEk-0)TBt5sS5?;NwAdRzRj5qRSD?J6 ze9ueq%TA*pgwYflmo`=FnGj2r_u2!HkhE5ZbR_Xf=F2QW@QTLD5n4h(?xrbOwNp5` zXMEtm`m52{0^27@=9VLt&GI;nR9S)p(4e+bAO=e4E;qprIhhclMO&7^ThphY9HEko z#WfDFKKCcf%Bi^umN({q(avHrnTyPH{o=sXBOIltHE?Q65y_At<9DsN*xWP|Q=<|R z{JfV?B5dM9gsXTN%%j;xCp{UuHuYF;5=k|>Q=;q zU<3AEYawUG;=%!Igjp!FIAtJvoo!*J^+!oT%VI4{P=XlbYZl;Dc467Nr*3j zJtyn|g{onj!_vl)yv)Xv#}(r)@25OHW#|eN&q7_S4i2xPA<*uY9vU_R7f};uqRgVb zM%<_N3ys%M;#TU_tQa#6I1<+7Bc+f%mqHQ}A@(y^+Up5Q*W~bvS9(21FGQRCosvIX zhmsjD^OyOpae*TKs=O?(_YFjSkO`=CJIb*yJ)Pts1egl@dX6-YI1qb?AqGtIOir&u zyn>qxbJhhJi9SjK+$knTBy-A)$@EfzOj~@>s$M$|cT5V!#+|X`aLR_gGYmNuLMVH4 z(K_Tn;i+fR28M~qv4XWqRg~+18Xb?!sQ=Dy)oRa)Jkl{?pa?66h$YxD)C{F%EfZt| z^qWFB2S_M=Ryrj$a?D<|>-Qa5Y6RzJ$6Yp`FOy6p2lZSjk%$9guVsv$OOT*6V$%TH zMO}a=JR(1*u`MN8jTn|OD!84_h${A)_eFRoH7WTCCue9X73nbD282V`VzTH$ckVaC zalu%ek#pHxAx=0migDNXwcfbK3TwB7@T7wx2 zGV7rS+2g9eIT9>uWfao+lW2Qi9L^EBu#IZSYl0Q~A^KYbQKwNU(YO4Xa1XH_>ml1v z#qS;P!3Lt%2|U^=++T`A!;V-!I%upi?<#h~h!X`p7eP!{+2{7DM0$yxi9gBfm^W?M zD1c)%I7N>CG6250NW54T%HoCo^ud#`;flZg_4ciWuj4a884oWUYV(#VW`zO1T~m(_ zkayymAJI)NU9_0b6tX)GU+pQ3K9x=pZ-&{?07oeb1R7T4RjYYbfG^>3Y>=?dryJq& zw9VpqkvgVB?&aK}4@m78NQhTqZeF=zUtBkJoz8;6LO<4>wP7{UPEs1tP69;v919I5 zzCqXUhfi~FoK5niVU~hQqAksPsD@_|nwH4avOw67#fb@Z5_OS=$eP%*TrPU%HG<-A z`9)Y3*SAdfiqNTJ2eKj8B;ntdqa@U46)B+odlH)jW;U{A*0sg@z>-?;nN}I=z3nEE@Bf3kh1B zdqT{TWJvb#AT&01hNsBz8v(OwBJSu#9}A6Y!lv|`J#Z3uVK1G`0$J&OH{R?3YVfk% z9P3HGpo<1uy~VRCAe&|c4L!SR{~^0*TbVtqej3ARx(Okl5c>m~|H9ZwKVHc_tCe$hsqA`l&h7qPP5xBgtwu!; zzQyUD<6J!M5fsV-9P?C9P49qnXR+iXt#G_AS2N<6!HZ(eS`|-ndb|y!(0Y({2 z4aF~GO8bHM7s+wnhPz>sa!Z%|!qWk*DGr)azB}j6bLe#FQXV4aO>Eo7{v`0x=%5SY zy&{kY+VLXni6pPJYG_Sa*9hLy-s$79$zAhkF)r?9&?UaNGmY9F$uf>iJ~u@Q;sydU zQaN7B>4B*V;rtl^^pa3nFh$q*c&sx^Um}I)Z)R&oLEoWi3;Yv6za?;7m?fZe>#_mS z-EGInS^#UHdOzCaMRSLh7Mr0}&)WCuw$4&K^lx{;O+?Q1p5PD8znQ~srGrygJ?b~Q5hIPt?Wf2)N?&Dae4%GRcRKL(a-2koctrcvxSslXn-k9cYS|<-KJ#+$Wo>}yKKh*3Q zHsK(4-Jv!9R3*FKmN$Z#^aZcACGrlGjOe^#Z&DfPyS-1bT9OIX~-I-5lN6Y>M}dvivbs2BcbPcaNH%25-xMkT$>*soDJ) z27;};8oCYHSLF0VawZFn8^H;hIN=J457@eoI6s2P87QN6O`q8coa;PN$mRZ>2Vv+! zQj1}Tvp8?>yyd_U>dnhx%q~k*JR`HO=43mB?~xKAW9Z}Vh2b0<(T89%eZ z57kGs@{NUHM>|!+QtqI@vE8hp`IIGc`A9Y{p?c;@a!zJFmdaCJ;JmzOJ8)B1x{yZp zi!U{Wh-h+u6vj`2F+(F6gTv*cRX7MR z9@?>is`MSS1L#?PaW6BWEd#EX4+O1x6WdU~LZaQ^Quow~ybz*aAu{ZMrQ;yQ8g)-qh>x z^}@eFu1u7+3C0|hRMD1{MEn(JOmJ|wYHqGyn*xt-Y~J3j@nY56i)sgNjS4n@Q&p@@^>HQjzNaw#C9=TbwzDtiMr2a^}bX< zZE%HU^|CnS`WYVcs}D)+fP#bW0+Q#l#JC+!`OlhffKUCN8M-*CqS;VQX`If78$as0 z=$@^NFcDpTh~45heE63=x5nmP@4hBaFn(rmTY2Yj{S&k;{4W!0Nu9O5pK30}oxM7{ z>l4cKb~9D?N#u_AleD<~8XD@23sY^rt&fN%Q0L=Ti2bV#px`RhM$}h*Yg-iC4A+rI zV~@yY7!1}-@onsZ)@0tUM23cN-rXrZYWF#!V-&>vds8rP+w0t{?~Q zT^LN*lW==+_ifPb+-yMh9JhfcYiXo_zWa`ObRP9_En3P))Qyu0qPJ3*hiFSu>Vt-j z<*HWbiP2#BK@nt<g|pe3 zfBKS@i;ISkorx@cOIx9}p^d8Gis%$)))%ByVYU^KG#eE+j1p;^(Y1ndHnV&YuQZm~ zj;f+mf>0ru!N`)_p@Ls<& z`t+JDx7}R568Q|8`4A}G@t8Wc?SOXunyW5C-AWoB@P>r}uwFY*=?=!K@J(!t@#xOuPXhFS@FTf6-7|%k;nw2%Z+iHl219Ho1!bv(Ee0|ao!Rs%Jl0@3suGrOsb_@VM;(xzrf^Cbd;CK3b%a|ih-fG)`Rd00O74=sQYW~Ve z#fl!*(fo~SIQ5-Sl?1@o7-E*|SK|hoVEKzxeg!$KmQLSTN=5N`rYeh$AH&x}JMR+5dq|~FUy&Oj%QIy;HNr;V*7cQC+ka>LAwdU)?ubI@W z={eg%A&7D**SIj$cu=CN%vN^(_JeIHMUyejCrO%C3MhOcVL~Niu;8WYoN}YVhb+=- zR}M3p|H0`E2Id99y#03r`8$s0t*iD>`^7EPm1~guC)L~uW#O~>I85Q3Nj8(sG<@T| zL^e~XQt9O0AXQ^zkMdgzk5bdYttP~nf-<831zulL>>ghTFii$lg3^80t8Gb*x1w5| zN{kZuv`^8Fj=t(T*46M=S$6xY@0~AvWaGOYOBTl0?}KTkplmGn-*P(X=o-v^48OY} zi11-+Y}y)fdy_tI;*W(>#qzvgQZ52t!nrGsJEy!c86TKIN(n|!&ucCduG$XaIapI z{(Z9gZANsI={A=5Aorgq2H25Dd}H5@-5=j=s{f`%^>6b5qkm_2|3g>r-^amf=B_xV zXg*>aqxXZ6=VUI4$})ypDMy$IKkgJ;V>077T9o#OhpFhKtHP_4mnjS5QCgGe<;~Xe zt<2ZhL7?JL6Mi|U_w?;?@4OD@=4EB2op_s)N-ehm#7`zSU#7itU$#%^ncqjc`9HCG zfj;O1T+*oTkzRi-6NN`oS3w3$7ZB37L>PcN$C$L^qqHfiYO4_>0_qCw0r@FEMj=>}}%q_`d#pUT;c?=gI zqTGpiY4Z;Q(B~#hXIVBFbi#dO=cOdmOqD0|An?7nMdrm2^C>yw*dQ=#lf8)@DvXK; z$MXp}QZgnE!&L73x0LZX_bCdD4lRY$$^?9dt1RwCng{lIpbb%Ej%yOh{@76yEyb}K zXZy%^656Sk3BLKbalcc>Dt5iDzo^tj2!wnDL(X;urJfpkWrab!frFSC6Q7m zuoqN!(t=L&+Ov&~9mz(yEB`MK%RPXS>26Ww5(F;aZ zR@tPAw~=q2ioOiynxgBqE&3-R-@6yCo0*mE;#I^c!=g~HyyjGA6}|<(0EseKDTM4w z94YnCO^VYIUY@}x8kr;;El-cFHVO<$6;-UdmUB|J8R*Wf$a37gVgYT|w5^KkYe=(i zMkA$%7;^a*$V+}e%S~&*^^O;AX9NLt@cIPc*v!lKZ)(zahAsUj%PJot19ErFU=Uk( z9Hw;Lb`V+BzVpMu;TGB9}y~ff)^mbEmF?g{{7_0SR zPgp*n)l{?>7-Ji;eWG{ln$)Bro+UJAQo6W2-23d@SI=HiFV3hR2OUcAq_9q~ye)o@ zq8WZvhg`H(?1AUZ-NM%_Cuj}eb{4wOCnqs^E1G9U4HKjqaw@4dsXWP#$wx^}XPZ0F zywsJ0aJHA>AHc^q#nhQjD3!KDFT6FaDioJ#HsZU7Wo?8WH19TJ%OMDz$XH5J4Cjdt z@crE;#JNG`&1H8ekB(R4?QiiZ55kztsx}pQti}gG0&8`dP=d(8aCLOExd*Sw^WL`Q zHvZ(u`5A58h?+G&GVsA;pQNNPFI)U@O`#~RjaG(6Y<=gKT2?1 z*pCUGU)f??VlyP64P@uT`qh?L03ZQyLOBn?EKwH+IG{XvTh5|NldaSV_n~DK&F1aa znq~C_lCQHMfW6xib%a2m!h&%J)aXb{%-0!HCcW|kzaoSwPMhJ6$KL|F~Sx(tctbwfkgV;#KZlEmJN5&l5XF9eD;Kqb<| z>os)CqC^qF8$be|v;)LY{Gh@c0?a??k7M7&9CH+-B)t&T$xeSzCs30sf8O-+I#rq} z&kZj5&i>UyK9lDjI<*TLZ3USVwwpiE5x8<|{Db z3`HX3+Tt>1hg?+uY{^wC$|Tb7ud@3*Ub?=2xgztgv6OOz0G z-4VRyIChHfegUak^-)-P;VZY@FT64#xyo=+jG<48n2%wcx`ze6yd51(!NclmN=$*kY=#uu#>=yAU-u4I9Bt0n_6ta?&9jN+tM_5_3RH);I zxTN4n$EhvKH%TmOh5mq|?Cx$m>$Ed?H7hUEiRW^lnW+}ZoN#;}aAuy_n189qe1Juk z6;QeZ!gdMAEx4Na;{O*j$3F3e?FLAYuJ2iuMbWf8Ub6(nDo?zI5VNhN@ib6Yw_4P)GY^0M7TJwat z2S*2AcP}e0tibZ@k&htTD&yxT9QRG0CEq$;obfgV^&6YVX9B9|VJf`1aS_#Xk>DFo zwhk?~)>XlP5(u~UW0hP7dWZuCuN4QM24Td&j^7~)WQ6YeCg)njG*ri}tTcG-NxX}p zNB>kcxd5ipW@tN3=6r@Jgm#rgrK*dXA!gxy6fAvP7$)8)Vc~PPQ|`( zPy|bG1sUz958-!zW^j(8ILV%QC@x`~PDFczboZqWjvSU<9O3!TQ&xYi%?Y0AiVBLV z%R?#1L#G&xw*RZPsrwF?)B5+MSM(b$L;GLnRsSU!_$N;6pD97~H}`c>0F`&E_FCNE z_)Q*EA1%mOp`z>+h&aqlLKUD9*w?D>stDeBRdR*AS9)u;ABm7w1}eE|>YH>YtMyBR z^e%rPeZzBx_hj?zhJVNRM_PX(O9N#^ngmIJ0W@A)PRUV7#2D!#3vyd}ADuLry;jdn zSsTsHfQ@6`lH z^GWQf?ANJS>bBO-_obBL$Apvakhr1e5}l3axEgcNWRN$4S6ByH+viK#CnC1|6Xqj& z*_i7cullAJKy9GBAkIxUIzsmN=M|(4*WfBhePPHp?55xfF}yjeBld7+A7cQPX8PE-|Pe_xqboE;2AJb5ifrEfr86k&F0+y!r`-urW}OXSkfz2;E``UTrGSt^B)7&#RSLTQitk=mmPKUKP`uGQ4)vp_^$^U`2Jjq zeul!ptEpa%aJo0S(504oXPGdWM7dAA9=o9s4-{>z*pP zJ31L#|L?YR;^%+>YRJrLrFC=5vc;0{hcxDKF z!ntmgO>rVDaGmRpMI7-+mv(j~;s_LARvcpkXj|{GHu1c<1 zKI)#7RE~Dizu1lG>p-PcY2jX#)!oJlBA$LHnTUWX=lu``E)vhf9h4tYL-juZ`e|Kb z=F?C;Ou)h^cxB;M-8@$ZSH0jkVD>x-XS$ePV1vlU8&CG))4NgU(=XFH=Jb1IB7dBysS+94}Y>sjS(&YcJwhn zifzA|g$D5rW89vkJSv()I+Th4R&C$g-!CB30xkh%aw4po3$@DK2fW>}enE2YPt&{C~j}`>RYICK{ zYAPfZ&%`R}u6MYo<>d`^O#Q(dM{3>T^%J{Vu;lr#Utg4x9!Z9J%iXs(j+dn&SS1_2 zzxGtMnu^`d%K4Xq4Ms-ErG3_7n?c(3T!?rvyW=G<7_XKDv*ox`zN*^BVwUoqh{D7o zdEiq;Zp6}k_mCIAVTUcMdH|fo%L#qkN19X$%b1#Oko|u4!M*oRqdBa3z98{H#g=d%5X&D#NXhLh`nUjxi8@3oo(AgeItdJ zIrt9ieHI1GiwHiU4Cba-*nK@eHI4uj^LVmVIntU@Gwf^t6i3{;SfLMCs#L;s;P4s5oqd^}8Uil!NssP>?!K z07nAH>819U=^4H6l-Dhy`^Q6DV^}B9^aR0B%4AH=D&+dowt9N}zCK+xHnXb-tsKaV6kjf;Wdp#uIZ_QsI4ralE>MWP@%_5eN=MApv92( z09SSB#%eE|2atm9P~X2W2F-zJD+#{q9@1}L2fF|Lzu@1CAJq*d6gA8*Jjb;<+Asih zctE|7hdr5&b-hRhVe}PN z$0G{~;pz1yhkbwuLkfbvnX=<7?b(1PhxAmefKn$VS6Sv)t-UypwhEs3?*E=(pc%Dlul1V~OdWvdf z{WBX?lhfO_g$$X~hm^Bhl@U0t<|beYgT)2L_C(z@B^-63c9Ak2*Aa)iOMylfl|qyNQdO#yoJ?m2FOkhZ1ou@G%+^m z#!#(gTv8nx^34(HddDp|dcFl@&eh+&FFJc@^FL3fV2?u&9Wt|Yp3&MS)e+ez0g~Ys zY7d0n^)+ z0@K^GJTLN?XAV(0F6e>o>HCGJU5(8WsSFErs0FsO=O1u$=T~xx7HYK{7C>-IGB8U+ z&G^Vy>uY}Bq7HX-X`U^nNh+11GjG-)N1l_tG<^4Tu4+4X9KO9IrdH+eXGk|G6Tc(U zU~g7BoO!{elBk>;uN-`rGQP-7qIf9lQhj-=_~0Qyszu>s$s0FrJatSylv!ol&{29~ z7S4fv&-UBOF&cR@xpuW*{x9$R;c_ALt?{+dI&HoBKG-!EY{yE=>aWhlmNhHlCXc(B zuA-zI*?Z9ohO$i8s*SEIHzVvyEF$65b5m=H*fQ)hi*rX8 zKlPqjD*Ix1tPzfR_Z3bO^n32iQ#vhjWDwj6g@4S?_2GyjiGdZZRs3MLM zTfl0_Dsn=CvL`zRey?yi)&4TpF&skAi|)+`N-wrB_%I_Osi~)9`X+`Z^03whrnP7f z?T`*4Id`J@1x#T~L(h5^5z%Cok~U|&g&GpCF%E4sB#i3xAe>6>24%Kuu=)=HRS;Pu2wghgTFa zHqm#sa{7-~{w_039gH0vrOm&KPMiPmuPRpAQTm5fkPTZVT&9eKuu%Riu%-oMQl2X6 z{Bnx`3ro^Z$}rVzvUZsk9T)pX|4%sY+j0i)If_z-9;a^vr1YN>=D(I7PX){_JTJ&T zPS6~9iDT{TFPn}%H=QS!Tc$I9FPgI<0R7?Mu`{FTP~rRq(0ITmP1yrJdy|m;nWmDelF-V^y7*UEVvbxNv0sHR?Q=PVYRuZinR(;RjVAG zm&qlSYvaiIbVEqBwyDaJ8LVmiCi{6ESF4pO?U&7pk&CASm6vuB;n-RauPFzdr!C%1 z8pjdSUts7EbA4Kg(01zK!ZU<-|d zU&jWswHnSLIg&mTR;!=-=~z(#!UsXt%NJR|^teM8kG@8Qg_0^6Jqfn&(eENtP8D7K zvnll3Y%7yh1Ai~0+l6dAG|lEGe~Oa+3hO>K2}{ulO?Vf*R{o2feaRBolc;SJg)HXHn4qtzomq^EM zb)JygZ=_4@I_T=Xu$_;!Q`pv6l)4E%bV%37)RAba{sa4T*cs%C!zK?T8(cPTqE`bJ zrBWY`04q&+On`qH^KrAQT7SD2j@C>aH7E8=9U*VZPN-(x>2a++w7R$!sHH+wlze2X)<<=zC_JJvTdY7h&Jum?s?VRV)JU`T;vjdi7N-V)_QCBzI zcWqZT{RI4(lYU~W0N}tdOY@dYO8Rx5d7DF1Ba5*U7l$_Er$cO)R4dV zE#ss{Dl`s#!*MdLfGP>?q2@GSNboVP!9ZcHBZhQZ>TJ85(=-_i4jdX5A-|^UT}~W{CO^Lt4r;<1ps@s|K7A z90@6x1583&fobrg9-@p&`Gh+*&61N!$v2He2fi9pk9W2?6|)ng7Y~pJT3=g~DjTcYWjY9gtZ5hk*1Qf!y2$ot@0St$@r8|9^GMWEE>iB~etL zXYxn#Rvc`DV&y93@U$Z91md1qVtGY*M(=uCc}@STDOry@58JNx`bUH}EIb(n6I}i? zSYJOZ2>B6&Payu+@V!gxb;)_zh-{~qtgVwQ-V;vK7e0^Ag_$3+g+{xSVudVOY_p-R z$sXhpFSk7je2lk5)7Y2;Z847E1<;5?;z(I)55YFtgF!J;NT|eVi}q^*2sM}zyM{+s zD0phl+J>k1E7cZEGmP?1-3~RE;R$q(I5}m?MX8xi?6@0f#rD8Cjkpv1GmL5HVbTnM zAQ&4-rbkpdaoLp~?ZoW>^+t0t1t%GO2B;ZD4?{qeP+qsjOm{1%!oy1OfmX?_POQJ4 zGwvChl|uE;{zGoO?9B_m{c8p(-;_yq?b^jA({}iQG35?7H7`1cm`BGyfuq7z1s~T| zm88HpS{z54T{jxC=>kZ=Z#8G@uya3tt0$xST5V$-V<;6MA66VFg}`LLU8L=q3DmkU z)P^X8pg`ndMY*>gr{6~ur^Q@Z8LNQf*6wkP03K<|M*+cDc#XKZ`Z0$1FkI-IDRw#| za52W4MyHlDABs~AQu7Duebjgc}02W;1jgBx&I@TMDXU`LJutQ?@r%1z`W zlB8G-U$q37G1ob>Er8j0$q@OU3IwG#8HsvJM#)j=Y%~#zY`jaG%5;!(kY3*a^t>(qf6>I zpAJpF%;FQ?BhDSsVG27tQEG*CmWhl4)Ngp%}D?U0!nb1=)1M==^B)^$8Li$boCY$S4U;G^A!?24nSYHra{< zSNapX#G+0BTac|xh`w&}K!);$sA3ay%^a2f?+^*9Ev8ONilfwYUaDTMvhqz2Ue2<81uuB71 zAl|VEOy%GQ7zxAJ&;V^h6HOrAzF=q!s4x)Mdlmp{WWI=gZRk(;4)saI0cpWJw$2TJcyc2hWG=|v^1CAkKYp;s_QmU?A;Yj!VQ1m-ugzkaJA(wQ_ zah00eSuJg<5Nd#OWWE?|GrmWr+{-PpE_Dbqs&2`BI=<%ggbwK^8VcGiwC-6x`x|ZY z1&{Vj*XIF2$-2Lx?KC3UNRT z&=j7p1B(akO5G)SjxXOjEzujDS{s?%o*k{Ntu4*X z;2D|UsC@9Wwk5%)wzTrR`qJX!c1zDZXG>-Q<3Z)7@=8Y?HAlj_ZgbvOJ4hPlcH#Iw z!M-f`OSHF~R5U`p(3*JY=kgBZ{Gk;0;bqEu%A;P6uvlZ0;BAry`VUoN(*M9NJ z%CU2_w<0(mSOqG;LS4@`p(3*Z7jC|Khm5-i>FcYr87};_J9)XKlE}(|HSfnA(I3)I zfxNYZhs#E6k5W(z9TI2)qGY&++K@Z?bd;H%B@^!>e2Wi@gLk)wC)T93gTxdRPU7uh z)`$-m(G2I5AuK52aj!fMJR|d^H?0X~+4xSpw zqNRtq5r8hic*{eAwUT<=gI5uXLg)o5mg4XnO^T+Rd+{l)<$Aqp{+RxhNYuX^45W0k z5$t%+7R;dX$`s6CYQYcims>5bNt+k&l_t%C9D-6sYVm%Y8SRC#kgRh*%2kqMg2ewb zp_X*$NFU%#$PuQ@ULP>h9Xw`cJ>J-ma8lU`n*9PcWFpE%x0^}(DvOVe2jz@ z0^2QOi0~t!ov?jI{#bw~`Aj5ymQW@eruRg`ZNJ5IT5_5AHbQ?|C>_7rwREf2e2x&L zlV8xdOkp_*+wdaqE?6bmdrFfaGepcj=0AI<+c=Tg^WB9BhFx?SvwoVdTEm&zPy@Vs zPs2mVPiw1n_h?Xi6!+w)ypsFXXuM>gIY(J+1N6r!sJ{+r1%BzRF20!D;bN>L^?O8n z(5|x2p^Q6X`!pm3!MMFET5`nJXn>tK`fFAj5Eo&t6;F>TU_4G93YGyzvF2_fB& zfE8(dq?R@@&Wh8~%G~rDt1+e)96O5)by_%;G~Zv`TpmZ)vY@BkAan*zEy(s`*{-@U z;$WPjoNx~m?`6Z;^O=K3SBL3LrIxfU{&g)edERkPQZK!mVYU-zHuV0ENDq^e<-?^U zGyRcrPDZZw*wxK(1SPUR$0t0Wc^*u_gb*>qEOP102FX|`^U%n*7z=wM@pOmYa6Z=-)T%!{tAFELY2`dTl3$&w! z7sgKXCTU(h3+8)H#Qov19%85Xo+oQh?C-q0zaM_X2twSCz|j_u!te3J2zLV#Ut_q7 zl+5LGx#{I`(9FzE$0==km|?%m?g~HB#BSz2vHynf1x14mEX^~pej*dhzD|6gMgOJ_ z8F_<>&OIz;`NSqrel?HI-K(|ypxwz}NtX!CF3&T(CkuYOnKS&%lUSU44KsgS`L>!w zl{MoT4`t=+p8>@88)Ea%*hOIkxt#b4RfrwRMr91UF_Ic~kV;|+dRW0a8Vl725+gsvtHr5 z>?3fai&9NmU|3;-nAu8OB|<(-2Kfub4MX&1i}dDd=R~Dk=U-Vr=@&lfEIYU~xtHHO z4TKt=wze`qm=69lD)sOOkZ;$9=0B#*g@X6xPM-%zG*rCXkN%eRDEUp$gAaEd29t&T zRTAg##Sk+TAYaa(LyTD__zL3?Z+45^+1o}(&f<~lQ*-z7`Um^>v@PKqOunTE#OyKFY^q&L^fqZgplhXQ>P3?BMaq6%rO5hfsiln7TppJ z>nG9|2MmL|lShn4-yz0qH>+o;Fe`V!-e*R0M|q~31B=EC$(bQZTW^!PrHCPE4i|>e zyAFK!@P}u>@hqwf%<#uv*jen5xEL|v!VQEK!F`SIz_H8emZfn#Hg}}@SuqPv+gJ@- zf3a`DT_Q#)DnHv+XVXX`H}At zmQwW2K`t@(k%ULJrBe6ln9|W8+3B*pJ#-^9P?21%mOk(W1{t#h?|j0ZrRi_dwGh#*eBd?fy(UBXWqAt5I@L3=@QdaiK`B_NQ$ zLXzm{0#6zh2^M zfu>HFK^d`&v|x&xxa&M|pr))A4)gFw<_X@eN`B1X%C^a{$39fq`(mOG!~22h)DYut z(?MONP1>xp4@dIN^rxtMp&a^yeGc8gmcajyuXhgaB;3}vFCQFa!pTDht9ld9`&ql`2&(dwNl5FZqedD^BP zf5K1`(_&i7x-&rD=^zkFD87idQrk(Y?E;-j^DMCht`A8Qa5J-46@G_*Y3J+&l{$}*QCATEc9zuzaQGHR8B;y*>eWuv)E##?Ba3w= zZ|v(l{EB`XzD#|ncVm#Wy?#Nzm3bS1!FJ70e{DGe$EgNDg7<_ic^mJSh&Xc|aTwCrTv;XkW~UlS&G%KyLklCn}F^i(YP(f z{cqH%5q9ND_S;l$HRP$Q@`D=F*_1$CXIA5X@|V&Vir$NQ$vCx!b&LGCR<-2y)m%HI zxeeyQIjiWcf4uD9+FP+EJ`&$oJ%$R(#w~GjqP|aTQj#d(;l#rq$vcM&Y4ZQ_i{Kpx z?k2BtoKb?+1-EVmG^ne-W%8+y?i#J5N5g8f^qpH5(ZZp7$u+?I9GB+&MREX?TmVV$ zA}Ps=^CkD^sD9N;tNtN!a>@D^&940cTETu*DUZlJO*z7BBy`Rl;$-D@8$6PFq@tz0 z=_2JMmq-JRSvx`;!XM|kO!|DENI-5ke8WR*Zj#vy#Nf1;mW-{6>_sCO8?sVWOKDM| zR(iaZrBrzlRatUzp_Y|2nOXnY2G%WLGXCo9*)th_RnXvXV=q;WNAimI98!A54|$&OCCG%$4m{%E&o?S|Qx<4K~YGmM1CS!vZAzLN%d znbZsw6ql=XkiwSbNofNeA42q8#LH6Rk(u@z172O#6K>Sb{#`t#GUgpd{2;D(9@I_9 zwsY(6Go7RmOThs2rM3|Z#Vbs}CHPLgBK6gE8;XkJQDx~p5wJ?XkE(0<^hwnt6;$~R zXCAzMfK@`myzdkkpv*ZbarVwCi&{-O#rswrb-#x4zRkxfVCq;mJLic|*C92T?0CYv z)FCqY$xA(QZmggPocZqQj0Rc?=Afna`@fpSn)&nSqtI}?;cLphqEF3F9^OZfW9@HDunc^2{_H)1D9(O}4e zJMi_4(&$CD{Jf5&u|7#Iq*F~)l!8pAzNrX^<&wfEu~}Ipslzx=g^ff2?B9SnV=!$ zv&K0`hMN6BVIusHNX-lr`#K?OG1S*S4rCQaI3ea(!gCl7YjxJ3YQ)7-b&N*D8k><*x|47s3; z4f~WTWuk|Qd*d*DICV}Vb0YSzFZp5|%s4}@jvtTfm&`|(jNpajge zD}@CMaUBs+b?Yu6&c#18=TxzMCLE76#Dy=DLiq_a_knQX4Uxk$&@3ORoBFK_&a>`QKaWu^)Hzrqz{5)?h3B_`4AOn{fG9k zEwnjQb>8XRq!k?rmCd6E**1cY#b9yczN4mD%GLCeRk}{TmR1*!dTNzY;(f!B0yVuk zSjRyf;9i@2>bdGSZJ=FNrnxOExb075;gB z*7&YR|4ZraFO#45-4h%8z8U}jdt?83AmU3)Ln#m3GT!@hYdzqqDrkeHW zU#R`Z8RHq996HR=mC}SRGtsz07;-C-!n*ALpwwBe~loM)YqMH)Um$sH0RbTTzxFd)h1=-w5Yl3k|3nQ zZG>=_yZ7Lsn=b8_MZI+LSHLGYSSCc?ht~7cv#39>Moz6AS}5 zus?xge0PGdFd2FpXgIscWOyG}oxATgd$yl0Ugf_&J_vwt`)XWx!p*gE_cWU(tUTnz zQS}!bMxJyi3KWh^W9m zxLcy``V@EfJzYjK@$e7Yk=q!kL8cd3E-zpc*wwvGJ62O!V;N zFG7Y?sJ+^a%H1;rdDZRu2JmGn6<&ERKes=Pwx)GG-nt73&M78+>SOy!^#=gvLB)2H zjv!J0O`-zft|0Jv$3k5wScY)XB+9leZgR5%3~HtZA=bCg7=Dn+F}>2lf;!*1+vBtf z9jhmqlH=t5XW{0MC7Y~O7jaju&2`p!ZDLGlgnd~%+EJ%A#pIByi-+EOmoLVoK&ow8 zTDjB%0hxhiRv+O3c2*y00rMA=)s|3-ev7emcbT43#izku7dvaDXy1IMV0ahjB9yzi z9C9fN+I2Mzt1*{`a6B?+PdWHiJ5fH}rb2t>q)~3RfCxmyK^y5jN7Pn(9DFh61GO%p zuBErj=m|bDn_L8SINU)Z&@K*AgGz+SUYO_RUeJt=E0M+eh&kqK;%Y1psBNU<4-s9# ziHFr7QP6Ew=-2CdfA#Bf|EsctH;<&=Hsd>)Ma8NvHB$cpVY@}TV!UN}3?9o@CS5kw zx%nXo%y|r5`YOWoZi#hE(3+rNKLZ2g5^(%Z99nSVt$2TeU2zD%$Q(=$Y;%@QyT5Rq zRI#b><}zztscQaTiFbsu2+%O~sd`L+oKYy5nkF4Co6p88i0pmJN9In`zg*Q;&u#uK zj#>lsuWWH14-2iG z&4w{6QN8h$(MWPNu84w1m{Qg0I31ra?jdyea*I~Xk(+A5bz{x%7+IL}vFDUI-Rf{! zE^&Dau9QxA2~)M98b42(D6Q}2PUum0%g>B?JS?o~VrP+Go2&c-7hIf7(@o1*7k$zS zy@o5MEe8DoX$Ie(%SZByyf9Xf9n8xkoX}s6RiO1sg*kAV^6EAAz$>*x^OmIy!*?1k zG+UQ|aIWDEl%)#;k{>-(w9UE7oKM#2AvQud}sby=D7$l6{$}SE8O9WgHM_+ zJ?tHeu@Pi93{AuwVF^)N(B~0?#V*6z;zY)wtgqF7Nx7?YQdD^s+f8T0_;mFV9r<+C z4^NloIJIir%}ptEpDk!z`l+B z5h(k$0bO$VV(i$E@(ngVG^YAjdieHWwMrz6DvNGM*ydHGU#ZG{HG5YGTT&SIqub@) z=U)hR_)Q@#!jck+V`$X5itp9&PGiENo(yT5>4erS<|Rh#mbCA^aO2rw+~zR&2N6XP z5qAf^((HYO2QQQu2j9fSF)#rRAwpbp+o=X>au|J5^|S@(vqun`du;1_h-jxJU-%v| z_#Q!izX;$3%BBE8Exh3ojXC?$Rr6>dqXlxIGF?_uY^Z#INySnWam=5dV`v_un`=G*{f$51(G`PfGDBJNJfg1NRT2&6E^sG%z8wZyv|Yuj z%#)h~7jGEI^U&-1KvyxIbHt2%zb|fa(H0~Qwk7ED&KqA~VpFtQETD^AmmBo54RUhi z=^Xv>^3L^O8~HO`J_!mg4l1g?lLNL$*oc}}QDeh!w@;zex zHglJ-w>6cqx3_lvZ_R#`^19smw-*WwsavG~LZUP@suUGz;~@Cj9E@nbfdH{iqCg>! zD7hy1?>dr^ynOw|2(VHK-*e%fvU0AoKxsmReM7Uy{qqUVvrYc5Z#FK&Z*XwMNJ$TJ zW1T**U1Vfvq1411ol1R?nE)y%NpR?4lVjqZL`J}EWT0m7r>U{2BYRVVzAQamN#wiT zu*A`FGaD=fz|{ahqurK^jCapFS^2e>!6hSQTh87V=OjzVZ}ShM3vHX+5IY{f^_uFp zIpKBGq)ildb_?#fzJWy)MLn#ov|SvVOA&2|y;{s;Ym4#as?M^K}L_g zDkd`3GR+CuH0_$s*Lm6j)6@N;L7Vo@R=W3~a<#VxAmM&W33LiEioyyVpsrtMBbON+ zX^#%iKHM;ueExK@|t3fX`R+vO(C zucU#Xf>OjSH0Kd%521=Sz%5Y!O(ug(?gRH@K>IUayFU~ntx`Wdm27dB-2s@)J=jf_ zjI-o;hKnjQ|Lg~GKX!*OHB69xvuDU zuG-H48~inKa)^r539a{F)OS`*4GShX>%BR)LU~a-|6+sx&FYsrS1}_b)xSNOzH|Kv zq>+1-cSc0`99EsUz(XWcoRO)|shn>TqKoQBHE)w8i8K`*Xy6(ls%WN_#d}YC^)NJ; zzl8!Zduz^Gg8*f0tCWnLEzw6k5Fv!QWC1x4)3r}+x~@#O8_)0>lP-@3(kFwLl%%Mz(TpATVnL5Pl2Gahw45QXI~>Hrw))CcEs@PP?}4^zkM$ z@(?H6^`Jl?A=(&Ue;W0`*a8&fR7vde@^q^AzX^H#gd~96`Ay^_A%?;?@q@t7l7iGn zWms#2J|To4;o1?3g3L!K_chdtmbEg~>U>$5{WO@Ip~YE&H($(^X6y_OBuNHkd0wu= z4rXGy#-@vZ?>M<_gpE8+W-{#ZJeAfgE#yIDSS?M?K(oY@A|FaS3P;OjMNOG% zGWyZWS(}LJCPaGi9=5b%sq$i!6x@o(G}wwfpI5|yJe24d_V}cT1{^(Qe$KEMZ;>I@ zuE6ee%FLgem>CKEN8SeY)fpK#>*lGcH~71)T4p|9jWT;vwM@N!gL}nCW=Oi6+_>K2 zl4sWXeM1U}RETA~hp=o3tCk+?Zwl#*QA>Wwd|FlUF0)U;rEGPD1s0Syluo zfW9L(F>q9li8YKwKXZrp*t)N9E;?&Hdbm-AZp2BcDTHO6q=tzVkZsozEIXjIH`tm} zo2-UleNm*Lj7zgvhBph_|1IggkSuW~S(9ueZEfao8BuzqlF(a+pRivTv(Zb zXFaHwcuovdM#d+!rjV7F<^VW&@}=5|xj!OUF)s0zh|8yzC)7!9CZB+TLnycoGBsDF z$u&j={5c(4A$iik;x6_S96Krw8--+9pGY+*oSVTIuq;$z8*)W8B~rMX_(U6uM}!Gc`T;WfEKwI84%)-e7j}>NA(O_)3Vn9 zjXxY1Fnx3Fx%CFpUHVu0xjvxgZv}F9@!vC!lD|05#ew3eJ}@!V&urwRKH`1f{0e^o zWvM1S@NbI6pHdzm33pza_q;#?s%J*$4>10uYi4l%5qi|j5qh+D=oqSJR=7QwkQh>>c$|uJ#Z@lK6PMHs@ zyvnnoOSkGQkYz#g>||xN&1fV)aJb*y--Y`UQV~lt!u8yTUG59ns1l7u>CX2F>9fl; zB)zH3z^XHmSU{F_jlvESvaNL&nj^;j)29~1LcTYw>(6}>bt0hiRooqm0@qTj%A&P9 zKmexPwyXG@Rs1i+8>AJ;=?&7RHC7Mn%nO>@+l?Qj~+lD376O2rp)>tlVHn8MKq zwop1KRLhUjZ|+6ecGIAftSPT*3i94=QzYCi_ay+5J&O(%^IsqZ!$w-^bmd7ds$^!q z;AkC;5mTAU>l0S$6NSyG30Ej?KPq@#T)^x#x?@U~fl2m$Ffk)s6u|iPr!)-j0BlA7p3E*A|My8S#KH;8i-IQq7Q*F4*ZVPe<{^SWz_ zr?!6cS+@|C#-P~d#=W1n7acn8_pg#W-lcyf+41zwR+BU6`jUkP^`*wgX)FxEaXzoi z8)?FE*97Yqz|b@fR1(r{QD363t260rQ(F||dt9^xABi+{C*_HL9Zt5T;fq|#*b}=K zo5yj_cZB(oydMAL&X(W6yKf>ui?!%(HhiHJ83EA|#k0hQ!gpVd( zVSqRR&ado+v4BP9mzamKtSsV<|0U-Fe2HP5{{x&K>NxWLIT+D^7md{%>D1Z-5lwS~ z6Q<1`Hfc+0G{4-84o-6dr@)>5;oTt|P6jt9%a43^wGCslQtONH)7QXJEYa!c~39 zWJpTL@bMYhtem1de>svLvOUa*DL7+Ah0(_~2|ng`!Z!qiN}6xL;F}<%M8qWv&52-Y zG*1A&ZKlp~{UFV%Hb_*Re({93f7W*jJZMV-Yn|<+l3SPN+%GuPl=+tSZxxr%?6SEc zntb0~hcK691wwxlQz_jSY+V_h+0o`X!Vm{;qYK$n?6ib1G{q>a%UejzOfk6q<=8oM z6Izkn2%JA2E)aRZbel(M#gI45(Fo^O=F=W26RA8Qb0X;m(IPD{^Wd|Q;#jgBg}e( z+zY(c!4nxoIWAE4H*_ReTm|0crMv8#RLSDwAv<+|fsaqT)3}g=|0_CJgxKZo7MhUiYc8Dy7B~kohCQ$O6~l#1*#v4iWZ=7AoNuXkkVVrnARx?ZW^4-%1I8 zEdG1%?@|KmyQ}tploH>5@&8Cp{`)CxVQOss&x|Z7@gGL3=tCVNDG!N9`&;N$gu^MDk|`rRm=lhnXAJ5v1T)WTz)qvz|Dw zR?{}W4VB(O6#9%o9Z^kFZZV*PDTAWqkQ8TH!rti8QIcR&>zcg3qG}&A( zwH^K8=`1C1lRfhrX{IvNn9R9!$UMC%k(;;VH%`S0h_on|Gh6qDSH&#}*m-u{;p~WB zF$_I~xx!RxVrxNQdr@3T>{F#^D{@N9OYC9LsV62F_Z1KYQ5yk*C5WQ4&q}Kz(I{9UWWf?LIcCZicB1EO_FUH*a9QKS(4IR%#D5DTi_@M}Q_-4)J4d zz@!vR0}5MPAOK(#uL+$7XOcP$5SS#*EK9Rt6XN%}HB7@`8S^gNRk!HLv(CvCjX4o= z>9scPwWbE!F8T=@x9^;s-OF2!eO(!gL9$-AmzUiDnu&QS4If5ea2T070n1-IyNhck z9$J8b!he3@q5qB-cQ;5ymVIXXn46kK0sqKZV+3s3^mac=3~BrCW})WNrrRs1KtMmg zLzwXYC?@_H#s3W4D$W0rh%WL|G<1$$uYdptPbxy0ke!c%v#x9I=2?S)YVkg1X$W^cB!i>B{e9wXlm8AcCT8|verIZQngj>{%W%~W0J%N`Q($h z^u3}p|HyHk?(ls7?R`a&&-q@R<94fI30;ImG3jARzFz<(!K|o9@lqB@Va+on`X2G) zegCM8$vvJ$kUwXlM8df|r^GQXr~2q*Zepf&Mc%kgWGTf;=Wx%7e{&KId-{G}r22lI zmq%L6Y-M*T$xf8 z#kWOBg2TF1cwcd{<$B)AZmD%h-a6>j z%I=|#ir#iEkj3t4UhHy)cRB$3-K12y!qH^1Z%g*-t;RK z6%Mjb*?GGROZSHSRVY1Ip=U_V%(GNfjnUkhk>q%&h!xjFvh69W8Mzg)7?UM=8VHS* zx|)6Ew!>6-`!L+uS+f0xLQC^brt2b(8Y9|5j=2pxHHlbdSN*J1pz(#O%z*W-5WSf# z6EW5Nh&r<;$<3o1b013?U$#Y!jXY)*QiGFt|M58sO45TBGPiHl4PKqZhJ|VRX=AOO zsFz-=3$~g#t4Ji9c;GFS9L~}~bzgCqnYuJ-60AMDdN7HZt8_$~Of{oXaD3HVn9zkH z`>#xQNe=YpWTq_LcOoy}R`L<_4il7w4)QH4rl?AUk%?fH##I>`1_mnp&=$-%SutYT zs}sSNMWo;(a&D()U$~PG0MvZ#1lmsF&^P4l_oN#_NORD-GSmR{h_NbJ^ZdY#R9#qW zKAC%V*?y~}V1Zh#d|-z1Z8sy5A+}*cOq$xk@Pn&{QffzG-9ReyPeEhqF%~Z3@|r(s z3(wA&)dV~fELW*&*=!~l9M=7wq8xE(<@)BjjN8bUiS8@N9E{wi+Dd!V1AtT;Nl}9> zTz`2ge2Jn#Dlg1kC%oFlOe<>?jYC`Asr^%i4hH;S`*qZTPRan2a9Kjj=0aq{iVi2Z z87PZt$d(LAm_{92kl+2Z%k3KGV;~gsp;C>k?gMYZrVIzaI|0D+fka9G_4v>N96*8T zI(C8bj?A7l%V&U?H_IpSeCvf7@y1e?b>G7cN382GVO0qAMQ93(T*<*9c_;%P1}x2l zi8S$s<=e_8ww%DaBAf4oIQ7}U7_48$eYpo}Fb+F|K|43IAPR1y9xbqPPg6er{I7xj|=>-c%pGBRLn1~=5KbAb1mJAx=z(loN!w{49VkEthF>*OX z)=gqXyZB5%5lIWYPWh~{!5pSt43-)-@L@x=pmiuKP-3Cwq8qSxGNwaTT4->BWEjxk zUjr)z7WrBZB5u3iV>Y_>*i~*!vRYL)iAh5hMqNzVq1eeq=&d9Ye!26jks{f~6Ru&c zg$D;^4ui#kC`rSxx`fP!zZ^6&qSneQzZRq0F*V4QvKYKB<9FC%t#)Tik%Zq*G*IOW z3*`2!4d)!3oH>GxVcXlorJDt+JnH)p{~olYBPq|>_V@8=l#(f*diW=L+%>rfWCcPQ z#H^ksQt15Z5Uc4ODq8_JwD5^H&OGqyH6E@MabJQO>s`?bqgA6}J_QpytW{2jH#eCN z8k7y*TFZ2lj2B|1CB(@QZedFfPhX|IQbKMI;$YK>9Zla0fsU7}an6(kP;sXpBWLR` zJ#z_kk!`JJC7h(1J!+G)gL2WB2&0*~Q!%s??}GH?=`hU@03xOwU} z6s7?tGySLz!%(MwxQRiF)2(vR2wQX`YB}u&I-S+RR)LQcyH407#-{*pWLJJR?X|5 zsAl2k{&0N-?JArn@)9YTo-5+gl}R~XkbZM*5AOjPrcikpE3P?p0oN^?H+5+n)}Qxe z*RQ!-eu0RxPyF8B=}xnseNpQMXFU$d^=(G%kUd&|!BHSm7bXoGR$WA+%yjuA{|S>u z?9N6JDhS+ui~rd?wY_t7`p)|qKIMM>6jz%$jv4hc_YUDjF6-%5muq|SNuoji2)|qK zNY5+oWMe+5vu{I*grk6xlVk;(J)uuy13G`VDbj(~Vz9lA)_;$aj?=-cmd#h~N0mn{ z9EIS_d4C=L3H;Pl^;vcpb&-B+)8vt%#?gn5z>#;G{1L&8u8cXJYADMUsm9>%*%)&F zsi&I{Y=VUsV82+)hdNgDWh^M7^hMs|TA0M269^|RIGfdX1MetV2z`Ycb&_Mn4iRI! zeI6O}O9mOhN6pzfs5IfMz#Gxl`C{(111okA8M4gijgb~5s7QTyh84zUiZZ^sr1^ps z1GO`$eOS@k@XP^OVH|8)n}Wx)fKHoGwL&5;W?qEf5Jdsd!3hf7L`%QNwN0gGBm^2= z@WI+qJMJG1w2AS9d@Dt$sj_P$+S2kh7+M72^SfcdBjQEtWQ5?PT&a~G9hOo6CtS>h zoghqoR;sk{X)`ZK-M|lu{M}0>Mrs^ZW@ngC?c$26_vYKDBK^n7sFiod_xV#XcPL!^ zRPyqD{w^9u{oA3y73IW0 zH;%xop$r(Q=bq=JaLT%myEKD_2&?L@s6TzsUwE#g^OkiU6{lN)(7I?%a;_%r5_^@d zS-Z)Q-2o|~?F~f`sHlhNhiZk;!CW;3Ma6{xPlBjJx8PXc!Oq{uTo$p*tyH~ka`g<` z;3?wLhLg5pfL)2bYZTd)jP%f+N7|vIi?c491#Kv57sE3fQh(ScM?+ucH2M>9Rqj?H zY^d!KezBk6rQ|p{^RNn2dRt(9)VN_j#O!3TV`AGl-@jbbBAW$!3S$LXS0xNMr}S%f z%K9x%MRp(D2uO90(0||EOzFc6DaLm((mCe9Hy2 z-59y8V)5(K^{B0>YZUyNaQD5$3q41j-eX))x+REv|TIckJ+g#DstadNn_l~%*RBSss_jV3XS&>yNBc8H2jo(lwcLz-PuYp< z7>)~}zl$Ts0+RFxnYj7-UMpmFcw_H zYrsXM>8icD)@Iauiu_(Y#~Iyl)|pj@kHkWvg2N$kGG(W>Y)nfNn%z2xvTLwk1O2GQ zb^5KAW?c%5;VM4RWBy}`JVCBFOGQWoA9|+bgn7^fY3tSk1MSZccs9&Fy6{8F>_K@? zK(z=zgmq1R#jGE^eGV`<`>SP9SEBx!_-Ao|VZq6)-rUpd^<2GgVN&uHiM{0zA9kI( z<1^1%*uE$?4mXV@?W8}fvnBOpfwCo^?(a0E402!pZi&Kd5pp$oV%2Ofx<}YC-1mynB3X|BzWC_ufrmaH1F&VrU&Gs+5>uixj*OJ*f=gs9VR8k^7HRR$Ns|DYBc*Slz>hGK5B1}U+}#j0{ohGC zE80>WClD5FP+nUS?1qa}ENOPb2`P4ccI<9j;k?hqEe|^#jE4gguHYz-$_BCovNqIb zMUrsU;Fq%n$Ku_wB{Ny>%(B&x9$pr=Anti@#U%DgKX|HzC^=21<5Fn6EKc#~g!Mcj zJrI(gW+aK+3BWVFPWEF*ntHX5;aabHqRgU-Nr2t++%JRPP7-6$XS|M8o&YSgf3a9A zLW*tSJxoe1?#T4EocApa*+1kUIgy7oA%Ig9n@)AdY%)p_FWgF-Kxx{6vta)2X1O5y z#+%KQlxETmcIz@64y`mrSk2Z17~}k1n{=>d#$AVMbp>_60Jc&$ILCg-DTN~kM8)#o$M#Fk~<10{bQ>_@gU2uZE z*eN~mqqQC*wh{CI(!xvRQ^{jyUcvE~8N)S0bMA^SK@v;b7|xUOi63X~3Qc>2UNSD1) z7moi9K3QN_iW5KmKH>1ijU41PO>BvA6f1;kL)6io%^r>?YQ#+bB;)Rzad5;{XAJGeAT#FnDV0$w2>v|JeFIB zZ>8vmz?WVs78PuCDiHfb@D0Yi;2#%){*#?bY4dpta6dSjquGLcOw?Z{nxg98mN^4* zj&^!WMUQ_zFp+}B|G0vcNsk8(2u9(LAPk5ogKt%zgQ4^1#UCd;`-W#X8v{YyQ_m9g z8`jydw>>@1J{Q*q#5^cHVA~xR9LR3Hl@^bx)`IBKmj+Gmye36;xwL0>sS|mV+$~%b zC;2wEm&Ht3#6P|2Y0XQ+5t-aI)jn{o%&ZHWvjzEtSojFgXxNKO^e(RmM`gsJ4GrR8 zKhBtBoRjnH`mD$kT;-8ttq|iw?*`7iTF_AX<^Qe3=h8L^tqz$w$#Z@Z$`C579Jeeu ztr0z~HEazU&htfG@`HW!201!N(70hCd{%~@Wv)G*uKnJZ8>hFx`9LnYs;T>8p!`5T zx#aXXU?}B{QTV_Ux(EMzDhl-a^y^f5tRU;xnOQoN)pThr4M>-HU)As8nQ34-0*sab&z<2ye-D_3m&Q`KJJ|ZEZbaDrE%j>yQ(LM#N845j zNYrP)@)md;&r5|;JA?<~l^<=F1VRGFM93c=6@MJ`tDO_7E7Ru zW{ShCijJ?yHl63Go)-YlOW2n3W*x%w||iw(Cy>@dBJHdQl){bBVg{wmRt{#oXb9kaWqe{bJPmGE$$ z_0=cmD9dVzh<8&oyM8rK9F^bufW$Bj2cFhw&f*oKKyu$H{PI=Aqe^NL6B=dkMEAk& zE3y&F=x;e|!7kMn%(UX>G!OE$Y$@UyME#d;#d+WLmm@W@y!sboiIox^DZPB|EN<>7 z57xm5YWlFUGyF|{<*;b&Cqm+|DC8{rB9R@2EFHGL^NX*l#AcDpw6}bCmhY7!(Gv{s zm^eYNvzyJLQA#GhmL*oSt^Uulb5&ZYBuGJTC>Vm9yGaZ=Vd--pMUoDRaV_^3hE9b*Pby#Ubl65U!VBm7sV}coY)m zn1Ag^jPPLT93J{wpK%>8TnkNp;=a@;`sA7{Q}JmmS1bEK5=d@hQEWl;k$9M-PYX~S zayGm;P(Wwk23}JR7XM~kNqba`6!Z+Wt2|5K>g_j3ajhR>+;HF?88GBN!P; zr6sQ8YYpn%r^gbi8yYK7qx6U5^Tf<|VfcR$jCo`$VMVh_&(9w@O?|o3eRHq*e*#P z8-==G)D?vB3Zo~b-dkx8lg0^=gn`9FUy?ZzAfWQd>>@cyqF!sHQ_S&@$r&tTB~Lxq zAjAZTK~?J{A|L3)8K>S{`Qf%131B>?<~t=w!D{;olQ>#31R#{go`a9DOy+H*q5t+; z^*Ka!r@#8tk?~tQbylaG-$n#wP2VzIm3vjrZjcmTL zl`{6mhBhMKbSWoGqi;g3z1@G0q!ib`(Zz_o8HG_*vr8U5G|vhZn26h`f~bO&)RY0; zw(CWk*a_{ji_=O9U}66lI` zCm32)SEcAo5)5k>{<8DLI@Zz)*R29BB!^wF;WZRF9sAi39BGObmZzg?$lUn6w1rYPHSB^L4^AN zLObEaUh7TXpt6)hWck#6AZV(2`lze<`urGFre|>LUF+j5;9z%=K@&BPXCM)P$>;Xc z!tRA4j0grcS%E!urO^lsH-Ey*XY4m&9lK(;gJOyKk*#l!y7$BaBC)xHc|3i~e^bpR zz5E-=BX_5n8|<6hLj(W67{mWk@Bfc){NGAX z5-O3SP^38wjh6dCEDLB#0((3`g4rl}@I(&E8V2yDB=wYhSxlxB4&!sRy>NTh#cVvv z=HyRrf9dVK&3lyXel+#=R6^hf`;lF$COPUYG)Bq4`#>p z@u%=$28dn8+?|u94l6)-ay7Z!8l*6?m}*!>#KuZ1rF??R@Zd zrRXSfn3}tyD+Z0WOeFnKEZi^!az>x zDgDtgv>Hk-xS~pZRq`cTQD(f=kMx3Mfm2AVxtR(u^#Ndd6xli@n1(c6QUgznNTseV z_AV-qpfQ0#ZIFIccG-|a+&{gSAgtYJ{5g!ane(6mLAs5z?>ajC?=-`a5p8%b*r*mOk}?)zMfus$+W~k z{Tmz9p5$wsX1@q`aNMukq-jREu;;A6?LA(kpRut+jX?Tt?}4HGQr}7>+8z4miohO2 zU4fQ?Y8ggl%cj&>+M+)TTjn8(?^%`~!oAt#ri8gIbzIig$y#d7o##077fM9sCu%N9 zOIsq4vyox6`itu*j{eOD<$gTZd-$JuyM^cM>{?v<8# zS1yN%R0zRy&>+D*Gv-&S80?JF+Y|c^^IJWDnfy06MI2{NFO-x4JXsb@3Qp;EnL!a{ zJwKwV@mO zYVGvNmeJ!;+ce+@j@oo-+`DaPJX|h@7@4BD`QEdP?NKkYzdIa3KrZt%VUSsR+{b+| zk?dSd#9NnVl?&Y$A{-OtZ>wk%mWVF5)bf`)AA2{EFapIS4jil69Xan>*J^6Juou&`oJx|7-&|@8z?$ z2V#jm!UHstCE*qM{OGtqYY8q+x%SL6&aGY!a>@d=_G~^0;+7dY9P`oJ*)67*9Kx*O zKitC5V3g5;&L-fa37?eN=;V_c^L-ph_uKv5)Q`&!Z!RPlDWA2{J%a2q@_*?-cn@bH zIt)+mA@HaJj2RV+-MNc#y#Vji*N~m!ZyrYyg-7UK4PYK4F7Y$3Y%@Lk6iPp=I96N> z!;ih(KtZMB23*v{`5cJ}^4D*P!k1&OfU&1%borv_q|7jfaV7fL+wwx8Zp*b}B_O>NRSeJeM zpvw3M`=vSYjFYQ11kx1xqOnJ@degPh&SyXnWz-l719EiW17Yo?c~Bh~;R$MOl+jzV zM1yTq-1**x-=AVR;p0;IPi`#=E!G5qIT>EFE`Bn<7o*8!aVd7?(CZT=U9^Gi3rmWUQG z0|GaP9s$^4t_oLCs!fInyCoB(d?=tZ%%Bb2Y+X&7gvQ6~C4kU%e$W_H;-%XSM;&*HYYnLI z>%{5x_RtSUC~PI4C0H^>O%FixKYVubA>#72wexd}Cgwuw5ZYTvcN2ywVP(dO=5975 zCjo)mOa2Bo&ucEsaq8wi1{h*brT(H=XrTOy*P>?0%VV1QDr09X+Je!T)JT`02?gjX zT@B8}h|;4lH35Guq2gKZT?ags-~Ts~S=poPnQ_T1*?U|{$jaur_PjQ6WmF_(XLFG)d#|iiBC=&B zp}1eOQvQ!3UpL?K`=8hAzMkv#a^COr`J8i}d!BPX&*xp-LL#qse~mOtxI-}{yPRNV zJNTL1{7A55F~K>0e&Os%MwQ~?n1>QV=j!8o_`^-&*E|Q-L9DNr%#6sw8kQVE3E|*}$aAoO$@27ei1w=+zU%?AA!;mf#!%IV*w_D=u516!Kz1F0-WnyVB`I6F1Pc3r1=0iT<_(pCyk>@22z1$w$@M>7AIuk6+ zRG&MFVQ_7>5DLoR5HeOa$?2SA(v2u!#8;5I(ss%=x9U#R zU62n~&)22RTTsp${}6C&$+l&0skFVX%ACgc$(iQ#DVRRz!`Y+b>E?;ib(TH#6Wa=} zs(q_;SA|fhyEo7Ix%rAY9j=Ul^Rzd`3ABf+yO@~h@Rh=wo`?;8PdHE1AUo34r7izy znAr`;VavQueSu7bD5r^nXTERcW(P-{2SOSfF1x0cW1Nczvj0}@!!upORN1%_-b2bh zGt#zokJz&SveJRzlUK4DruxR(YuHEAmB%F}buU`*pAzJ7Mbgs4sg;H@&6x*wxvGm6 z>KH@ilsvvdl@CGfm4T+$agodrB=md8ygG!|O=r@FY>S_zX%*)mqf?XBX*chhQ9uPP z-(T(24)})vWD*{bQM5_hy3CD8C>anuNtCXMkG7T?Yew^>=PK!~Hlr0{-0h0cNAJ8> zRMzLFz7aJv)Yh)_s)^L&L*nDV@qfeg>_<`z1z(?s}}3tE4h|7_taB> zPfmmOCFZ8%>`gyf1@|7t3;e~mwBRCDDw(Rrt>@O}obs#1?!W((+9>d$b7t!{&wR!P ziQbn0@j=&sw={`s##Uc@uS^(tbShjtsk=qrU1LW0lu}BplIfzv{fwxNsSaG~b|ryo zTQ}YXfp6o?^sSHW>s~m;l@h6wFbIPw{Z(IqO1u){{hEZgrTdF0o$n;hYIm`h5ejym zWt^w~#8p1J)FtfY6LvGmNQ~#n>4#mN4B^ zjrQk)Zt%k}GBRD>l`<~og6N_{6HYKDtsAtd%y?KbXCQR(sW8O(v_)kwYMz|(OW zsFz6A1^abSklOl`wLC-KYI8x=oMD^qZBs}}JVW@YY|3&k&IZ_n2Ia@5WiK>buV!E- zOsYcS4dFPE7vzj%_?5i2!XY`TiPd*jy>#C`i^XG8h?f35`=)s`0EhQBN!+YrXbpt( z-bwg_Jen`w<+6&B`hldU%rr&Xdgtze>rKuJ61AI12ja-eDZZX-+u1H>Sa|7pCine9 z&MEhmT7nq`P!pPK>l?I8cjuPpN<7(hqH~beChC*YMR+p;;@6#0j2k$=onUM`IXW3> z`dtX8`|@P|Ep-_0>)@&7@aLeg$jOd4G`eIW=^dQQ*^cgKeWAsSHOY?WEOsrtnG|^yeQ3lSd`pKAR}kzgIiEk@OvQb>DS*pGidh`E=BHYepHXbV)SV6pE2dx6 zkND~nK}2qjDVX3Z`H;2~lUvar>zT7u%x8LZa&rp7YH@n@GqQ65Cv+pkxI1OU6(g`b z?>)NcE7>j@p>V0mFk-5Rpi`W}oQ!tUU&Yn8m0OWYFj|~`?aVFOx;e`M)Q!YSokY)3 zV6l-;hK6?j=mp2#1e5cCn7P6n_7)n^+MdRw@5pvkOA>|&B8`QZ32|ynqaf}Kcdro= zzQchCYM0^)7$;m2iZnMbE$!}hwk&AVvN`iX3A9mB&`*BDmLV-m`OMvd`sJ?;%U`p~ zmwow{y6sPbcZNQPZ#GQS0&mzy?s%>_p>ZM|sCXVAUlST;rQ-3#Iu!-bpFSV4g7?-l zGfX>Z#hR+i;9B};^CO@7<<#MGFeY)SC&;a{!` zf;yaQo%{bjSa8KT~@?O$cK z(DGnm7w>cG1hH#*J%X}%Y%~+nLT*{aP08@l&Nu}>!-j|!8lSqt_xUNF+Y}SQmupyb zPua2PI;@1YaIsRF*knA^rJv84Tc=7?J2}!1kMfHSO$d$+PK*u?OI%=P7;`PHxMB0k zau~T0Wk)rPEGJ$NiXW~kfPA#m%Sr|7=$tHelF9A6rFLa$^g{6)8GSW*6}#~Zb^qk% zg=pLwC!SkY+&Gne((9`TCy`i`a#eCS{A2yMi>J>p*NS*!V~aAgK;wnSOHPULqzyj- z-q4BPXqXn))iRnMF*WZj17wUYjC!h43tI7uScHLf1|WJfA7^5O9`%lH>ga`cmpiz( zs|I8nTUD4?d{CQ-vwD!2uwGU_Ts&{1_mvqY`@A{j^b?n&WbPhb418NY1*Otz19`1w zc9rn?0e_*En&8?OWii89x+jaqRVzlL!QUCg^qU&+WERycV&1+fcsJ%ExEPjiQWRTU zCJpu*1dXyvrJJcH`+OKn7;q`X#@Gmy3U?5ZAV~mXjQhBJOCMw>o@2kznF>*?qOW;D z6!GTcM)P-OY-R`Yd>FeX%UyL%dY%~#^Yl!c42;**WqdGtGwTfB9{2mf2h@#M8YyY+!Q(4}X^+V#r zcZXYE$-hJyYzq%>$)k8vSQU` zIpxU*yy~naYp=IocRp5no^PeFROluibl( zmaKkWgSWZHn(`V_&?hM{%xl3TBWCcr59WlX6Q{j45)`A^-kUv4!qM=OdcwpsGB)l} z&-_U+8S8bQ!RDc&Y3~?w5NwLNstoUYqPYs(y+lj!HFqIZ7FA>WsxAE7vB=20K zn_&y{2)Uaw4b^NCFNhJXd&XrhA4E~zD7Ue7X^f98=&5!wn_r=6qAwDkd>g#2+*ahd zaV|_P_8e%jiHh7W;cl(d=&-r-C}_Ov?bts8s^rKUWQ|XkuW!ToSwe}Z{4|kl+q&&W zn%iW48c5*ft#*m)+xSps+j(B5bPh&u0&m6=@WgwBf_QfJJzg2Qdz89HwcV`5kZ#5z zw;W&H8>5R(>KRwvd0gh30wJHA>|2N(im;~wy1HTv_}Ue%qb)>5qL^$hIyPvoT(nk_<`7F;#nS8;q!cqKspvBc<%xMsQj*h|>`Z)F6LDxue@to))OIbs2X+zY2L9#2UNrR^)?c8&PFc?j*&Q-r|C%7a$)ZRQ->#|?rEj&M4spQfNt;J^ntwf(d+q;tt)C`d{*|t)czD4x-qw{Chm0vuKp8axqy5`Yz z1756|;JX1q(lEieR=uT;%havqflgv+`5i!Z`R}(JNV~&`x}I9Lmm;aB7Bnc^UC?>W zu)(J7@fs}pL=Y-4aLq&Z*lO$e^0(bOW z3gWbcvb^gjEfhV=6Lgu2aX{(zjq|NH*fSgm&kBj?6dFqD2MWk5@eHt@_&^ZTX$b?o}S<9BGaCZIm6Hz)Qkruacn!qv*>La|#%j*XFp(*;&v3h4 zcjPbZWzv|cOypb@XDnd}g%(@f7A>w2Nseo|{KdeVQu)mN=W=Q`N?ID%J_SXUr0Rl# z3X;tO*^?41^%c!H;ia@hX``kWS3TR|CJ4_9j-?l6RjC=n?}r&sr>m%58&~?$JJV6{ zDq5h#m4S_BPiibQQaPGg6LIHVCc`9w3^3ZVWP$n>p7 z5dIEH-W9e;$Id8>9?wh%WnWf>4^1U<%vn=<4oNFhVl9zVk+jn;WtQUQ)ZeEjKYy8C z3g#tIb28thR1nZdKrN}(r zJdy-Y3Rvr5D3D|msZbmE;FLePbiM0ZjwTIQQHk)8G+sB$iwmEa2kQv&9Vs9m#$_8j zNKz}(x$Wc(M)a9H-Pn?5(Lk-CmOS(&+EVLOfsiq>e3ru6P?Lp>FOwPt>0o=j8UyF^ zO{(vf#MGx^y~WaOKnt%I78s}60(O#jFx0^47^Ikh$QTar(Dg$c=0KR|rRD|6s zz?tEX0_=(Hm0jWl;QOu!-k)mV?^i(Etl=Lg-{ z0G}CBprLX60zgAUz-fS^&m#o;erEC5TU+mn_Wj(zL$zqMo!e`D>s7X&;E zFz}}}puI+c%xq0uTpWS3RBlIS2jH0)W(9FU1>6PLcj|6O>=y)l`*%P`6K4}U2p}a0 zvInj%$AmqzkNLy%azH|_f7x$lYxSG=-;7BViUN(&0HPUobDixM1RVBzWhv8LokKI2 zjDwvWu=S~8We)+K{oMd-_cuXNO&+{eUaA8Ope3MxME0?PD+0a)99N>WZ66*;sn(N++hjPyz5z0RC{- z$pcSs{|)~a_h?w)y}42A6fg|nRnYUjMaBqg=68&_K%h3eboQ=%i083nfIVZZ04qOp%d*)*hNJA_foPjiW z$1r8ZZiRSvJT3zhK>iR@8_+TTJ!tlNLdL`e0=yjzv3Ie80h#wSfS3$>DB!!@JHxNd z0Mvd0Vqq!zfDy$?goY+|h!e(n3{J2;Ag=b)eLq{F0W*O?j&@|882U5?hUVIw_v3aV8tMn`8jPa5pSxzaZe{z}z|}$zM$o=3-mQ0Zgd?ZtaI> zQVHP1W3v1lbw>|?z@2MO(Ex!5KybKQ@+JRAg1>nzpP-!@3!th3rV=o?eiZ~fQRWy_ zfA!U9^bUL+z_$VJI=ic;{epla<&J@W-QMPZm^kTQ8a^2TX^TDpza*^tOu!WZ=T!PT z+0lJ*HuRnNGobNk0PbPT?i;^h{&0u+-fejISNv#9&j~Ep2;dYspntgzwR6<$@0dTQ z!qLe3Ztc=Ozy!btCcx!G$U7FlBRe}-L(E|RpH%_gt4m_LJllX3!iRYJEPvxcJ>C76 zfBy0_zKaYn{3yG6@;}S&+BeJk5X}$Kchp<Ea-=>VDg&zi*8xM0-ya!{ zcDN@>%H#vMwugU&1KN9pqA6-?Q8N@Dz?VlJ3IDfz#i#_RxgQS*>K+|Q@bek+s7#Qk z(5NZ-4xs&$j)X=@(1(hLn)vPj&pP>Nyu)emQ1MW6)g0hqXa5oJ_slh@(5MMS4xnG= z{0aK#F@_p=e}FdAa3tEl!|+j?h8h`t0CvCmNU%dOwEq<+jmm-=n|r|G^7QX4N4o(v zPU!%%w(Cet)Zev3QA?;TMm_aEK!5(~Nc6pJlp|sQP@z%JI}f0_`u+rc`1Df^j0G&s ScNgau(U?ep-K_E5zy1%ZQTdPn literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..20db9ad --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..65dcd68 --- /dev/null +++ b/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/powerbar0.png b/powerbar0.png new file mode 100644 index 0000000000000000000000000000000000000000..889a2384ee114a9bf4711ec30bef6d7c35d9f62d GIT binary patch literal 38786 zcmeFZbySsIw>GYz2uP_YEh*A$8fi8mARsLg%BH(pLb{QZmR33>1Sx3&0Rib2kW`SA z{wBWfd(L~tcgFaQGsf@x@9bxcN7%9UeXljwoY%arYZ0QP_z)MH6#LSpOSrN!k}B}; z=S!C^(_^B+PkHDvui&2!cQs8%6_g8=t-X!0nWYhxqnoV}m65BN@uf?y6IM#%c<9ua z^~a$i;+J(jBI_(-&ocTqYxF93)2?7paAIdRJ@4Nl&Y%B}D(NJQ|YsAzb1KDVfUW7N9e7fyT2Nij;0tI+f1Lzy`YpD0=)ZhDPxzSV(= zv?%KHeeN3~N{df@6GPXj;P(8@BqWq%B_#fJM{pmhp3%ZGtzzWu&$X*)ZZkR)*nL*g zt)yc5o~O=$3{YaOT+_2(CE_-dQPCm4I_m338K!=X$V8Vy=c@P?dfRxj?0}Tq$#WIc z8w<^LqBGMkrW(*s_Bd60Bkjb7S!m;fuP1F35O_#o>S7uYqC%36QW@yyA2j}&Us%@- zH*rfpcGzWl5PMm~$MyAUpj5rMP=ncO>Olx?5d&k}a+?8$Zq%RX_4hqCsn_w2-Hh90 z-u(!nZ9`^8Eb$skN!)uw6UkH{eRvk$gT2h!XI|T#e6Yxlvs4*xR5C=4L<`gO#k|Z} zz>tY^okNR9MLx$=^w&J4;|Wczp?&55EPmX-Kb50IzT#2-^A(D! z<~p}|^{J=jWW+71EgT&)R_|QAFCH<^EX)RIGi=CeYOKw+@7mU);|Q(BP(M(4`BpUj z+D!jS%6qYM)~^*m_D7~VSJ9*1mc;OVYNkf0WNbLSa&h@^u)mpP>@A9_x6jZKs%e49 zb2Wnq(^QZbFtD*=LmArW8?m`s*+S@Dx+Em(YKt?%eMHcs{iMpDj3){eCQK7^sce|+B7$=>qs?HC%c8(A7z!CM{R zTRHyAS3ZG{g-RIc;)Zy{QHH#$Nyv8|MKpC z-TU7+!@Cp|1SD+?oGva;R#KSe;`;>*Z4Ar|1^)hMWX!A2_rSo2m5+}@pOu>v#m)M_ z0L95_$iu5yREg!-xn?>TtHk&R+xs9 z4e_7PC|RN$jo|~rH1cNFPOks?f|{9?k*Xu=Vm3MWxVU%_d>VHyFUI6RuyOJK{rJVQ2*Az2#G)?Z6bAVFJluP^Z=3)q{i%SBRB*Q|Mq?xLo;Ky|F3snY#u71 ze=NC-nFD;k+ux`Dv7=Ot?EdlFKYq0|`@5B>sQzvW0hGZ%ZovWNY-ITNI$^ATykuaC zvNkb-?D5ZV{nztm|4k_H!SbPaIQUs%(TrKSQM|^i`o;$Qto+7C`Y3&UejXH`!G9gy z!N%Cp1!Zp}ZUXZNa|Pk~cdn=y{w@^be|@)$snNwMz=W}KaI*g26UP3}8)m=A8UMOt zA@=`kPK5rx;op)BeC{95LGprJ$o?P6@Sk&bk#_zcKK{8D{|~i|4!Hc zPS^iv2L4BH{@>{O-|6}v&A|WY&Ho!+|G!Na_J6ihM%I9WT%cJxe)R1sG+G$?j~+^1 zI=}cYqv2gFJcDH`^VH$eB{teim$;TMxAsy{!jsn=Wfi2Zt>9qXV5a_^oBRFJC8|rZ zlHzKv6C1iNnuMcwnz*!4t1|4oS1w01#E2c$P5 zuzhJVRB{fgds^O?_3U$UZNAz`{qQvOo&r`A`*V@hhM~UH7r$!XaVp&+<*_9{r+sHY z9Eciwk@~r4(~KAgBM{}@@P@9-JCuPqkb@Y9yi+!Y4%0U)FYp?l(A;xOoYpVBz36CY zS|6+CMG7u8ro`VaWOF}@an89bThmux=Ko71Z`w* z-g+MIU&AA>@jgHEyN192YkGZkb^KC4sXcdCd$N$5{c>L#S&gfVjEt%2%H$U=X68a3 zi;<~%H!dcowT=if<|ifGJUqoV9y>pJP5M&DKiJHQ@{5y^SXx>2r#?`9`jj!YYti1# z$!YKB2y27#X_x`FY)sj?H%DopxU?@khRJa}$2C zztJ8>bar-TqqjAX{qWtpcg*o}<(fKAp8~1!tkL6v>DLSlMISPj=Z!+Vyc)$Co8uMl z_KEM`f44gHZnoY{l__4t`-~iqcZ=@lL{**B`fFq+L0J3k+qYHnE8o8T@g<4t&Ye3> zk>|haHW%#=t1L$4<>f^d)kAugNE-!Dd=~h_+Br$T%-iylD|)J-z2{1jzxDTl;itS@ z1~*fvR`B`r=V;o8k(8omzZW{)8_wE7Zfy})&9ASgL`PF6^z^?G7W6#Yz4z#KTYI}1 zcQThr-&dr6U_d~7$gTUk?hP_@YZFx#5;ng!Hd0elSrU2-prxjF9V=7*l+K8j~*-Cnx93XHC)blM1ck zv%S&h4EP%zgB{-ZeTU<;7BWyz|eA%c4)UwP6TqMn*<1uAOiBs%3iR;~Tnl z&QfrFl9J)1JOzDqiOI>lHZvaUBgFxKA3X`|HbZZ5Q+j#HhZ_M-Mc5zTh7$ z*8XsEasoH3m?khRdk)vKzIQbA?lD>4R!a*qT4r%|)$Fr2W+u#0XuG~%k@fUP9?7`e zM+xTK$=V;Rn=M-Jhet%HGZ0o7_ZB>UMaE~XgF?;2Fs~>CrDF`OI?RU))XmM!EiE@@ z8eZh8n7O;Vw}uCxG^M2j)tD#*92q=^9yt6kt(tiEI9*Fyo6J7GuI`1QA>E4aIlsXJ z0f9FHP6atRlEoT90RaP>{1AxWzki1~hv5WSSy}1n-zuc=VrHrrYWzMtfi>NjsA7f( z4NXgXyHQunJ$ydb zW>s2$xGOmu;EgX|zASuF>bx;F(AQTI>6CufGc(f&mv=KHr>17icK#OT71&~KJ3oZ( zzRJprAmf{Xj0!8fOPs0nXLnUKUQRuoK&5b)gM$MSt`jyBPOHf2?obM!4Q%q}o|U~L zSd0?w4~oSat;C^OMa9K#LeHK)O;UX47p6qW191UktE;Q0K|H2Ue?og-QSnY8#d*1p zqLozzW(ppVa-0Mxq?943SQr_99~@9Vu+K?L(^XN4(JH2w-QHatf&n1IUB}0_nXLZV zo5D9*^z;@PnIMc#>3uRVK7JU1P2SrrMtSYpHJnyhX}0H$9{U^Ps_zta>s^1Z3}ly- zlvMuUvYDyB&8+d~=m-s8{mBy|LPAq+(jx(bj_}{RyYi18KbDofoJ{Kvq172lp{=Uw zurbEb@a!DJ!LOmA0U}BzKd#F#khY+ppi-+Cevgljm!aGK{TmAp&uee(wqG-q?Dnhc zSU9a(m8Ou-@xRJ^G8e1BQ+Nye{5!wbLI-Y|;zMnkAAM;SCMF-e&%L5$cB%801Mw|u zs7(;WR2Y{abw@@d5d?UbU4j*T5^4Z`Q*t@>!NEZn zPhtxT3-V65+?1pwH@IB#PAGK5q@>-(7t@Tf7Olo)R54CPXztzpnpK-kyE?pCFICVb z@@#l&$^)Vc4-aqhgN^srTyx4#O>(@TX1!0zR<8Jok8v>2?;LMzY%KSuFE1~jGwNJr zU}BP!m;dtROHLE+X&M4&!M=8~+G-sVkeV8y<>R?`5Z?IY{0LUopFxyf#KP{o*Xl?N z%QfZcRf{!-C|^-wj!~-+<_?(Rh%$XC2@MU6iHU)wWRCBKY749MUHI2^?Isw1yuzfj zy`9?sXm8!+&(=Kbafp-S?s(?I!^1}jY;Zrava(g8xqg1F@a2Ne8?Fl-5s+QcZK(W> z`%+2B$y4Lv9KW}PeBg}orMjveFrVCF$T@#MG|QI!d4qdZX8ozE@gbxb)P1ySCEAo_ zC^8VaGr^$kIn~J;>%lFa)RLxG%0%qo8 z(Njl=F)S>sn<0ktEdh`ag77HZE3R%I_^M_PC=td-MTzYgL2@!TU;E^P4v9U2U~tv( zldY5fXo)WRHN5cfaGm#tSXQb|&dzT{JO!kbui@Xl@?NzRWtiQ8n;_Kitbg7%oL2*i zI80*UFcTs6pS4Y^A2u(sD><#()We9_pOxzeNYXs5GFOL1V5K+dfAe#7^>DE(HaHkF zxd%nNb6;dK-FJ7_u}W(?OX_;7l|2eYz0z~{?p^LQNNwBO+hQRPJpLe3dVfLHGc;U; zbezDdya;~a_6})Z-YG07n3|dj507$ocGh8g!gA*k-Obk9 zYc_xA(!GvWVX3RMenNz{w6?A;KW*4=()Yv1qt-b zFZIgQh8s#*oV^EW~jhB6N!IS_h&PV$H;o}P}*^~H;WjqzJ;m#7ek zsCNAZk3$uedzd>k|;B>(BtuB$XO@4H;$X5fj z12Yc~F>(Kh^1{Nx+}tJ6CBBW}!qIB0Nq8PMNJluy5P(ql;-6EsI}loWJ1p$%_?Vc% z5fKgUdrU~v&6x(+)=dt}k#f1_Fl&;MZSl-cRtj$u68ii5*L?iw426%Hx_L{QGl>O? z$TMli(1QGYj!H}_|7Z2C98PQB02YA~^83)kUnzyx3W^fojrZ^0f3g)e=_9{>Jq+gC z#L)0%{n&e>9@s$e02rMT7iZ`yE|T8l`dc5KY4xjf*{rUrI^FJJZ#H}$)P}@N6Y+#% zHowsMs>$=%8Hq#-M8PGK@>(X!&+GTTw$B^G&380teE8KQNH@DjPM8H{J05&5Kwvg9g3%A*M0AhLb z=FP$8toP9_W8ShJOT?>J*9!M8HY1yE_mVyAE&9iAgsdjGk5JaLji+w;R6lam9xsjLh^{I%9$If4E8+ngLjV`K9wt$ej)fU+?$_NPZq zN+AG!Bx305S;<2pBJRnm(8uQH=3WHd63<-`kCpXxZEbESGxGGY(;uA*McBtg129rO zoya9u`iBwF3b-8n(hZTMN$4@+Oj2WN@I2-vKD~i__Uu`Ix+psv+g)Bu;-9jREG`}; zC4uKd2>Z7Kt|x!&;4SYI)54#Hn$;Wu>HuiE>iF^NSEZUHdHUnkcj*9e#PM&1wR?y( zef*gGMjMb8FE4LpFOZvFaO%NjKG?9K^G4->4IUvZ0Z}>%hU4(>$-yi||QUL%` zRaK2B;>5v_C>r!U z7<`#n-d*2k{OM1U^msMwPQ6)gw(7O2O!{jd2S?|XdTJ~@n+V^S31oX6xT?3fXyqT? zu7{ZTU}J+qp+0LuxdlAp<>eLlW^Qe5Ej%2@+uQs4_3NL}y1Tp0C#zX&_~%sUWMQ}Q zMrCi8qt8@I1mW>VLK{mq@e7jJM734n(CP~LRoeTZAtAEI`#+roboKSWhu&s}ZX+u@ zo9ri{qoZRz03oTr57-@&Gy|sGut9cz|L*$oMU5$b_c81MB&Keo$5WcV+I9*Y+1)DCX70Uil!{|;Gb_vfTb zi$9i!$a4llNWxV<;VB*H4h}nj0>dP;4tJJm{XINA9qjFK($>YE-ntbFSp0Qd9AFks zVw}&f8XQ+u#Kpw{+nuYgIXgOXBSyYvO0?_$_CDK5KXQCO>vjASE`s2@$KvN`=q#a0 z*?omyd&=l zV;^0XjZsuoyyyiOq9Gr(cXW*8f1vSCl>brJh?&y-_0&zd%A0IzdiuV6A^|b+%G%n; z7YEk<1d=t7%*H1tkKt|rHo-5Meofkyrt{ywqaC$wj8`<&*H_!jdd+?EfueWDMp$iK z-GWG!>=jB*nbgW(>V7|kOj8U)eI6XtVTw0cv{+{fV89_mET~R(Nk6`c+1kAms?v8Z z7k!SfJ3iQKvYM=h+k_-fBH+ft$_kJ%m;g<^!RK_K4r8XwRVSg(t9^hSGv*KG2`5I` z`}b>KGcO=NGV`TUeO6W$V0pj{L;d}wPfDLbOa9SzzGXSx8*c%1@GvGPJ$*JyDh!XD zUr9?#D@DTzap#sv<@#)^gA$^%S+1*HVK=c_`gL-YX-g^Zp1s?4`p&M5FcQaKj%PTo zma!ttW^Z9xMP>VyLws%RA)s791iz;1s9A!3#BXd^3N$zQr0q{ymPO3{oPD#h5TyT{ zh81o8w4CbRJtM%ln3+&70Y+~^le4t6G(0>E&AiXormd~5M$h9xNoF>-J7MkQcqYH5 zYN3aF7)ieRH4_~;i%<=H(r!j_YJbG}jnkBV^4H1Roaeh%NSfAh@}9`Mz3=uu7?)pn z*zOulM}HXXWBZmd=u07HnFY1jhH?CtZ!gB6clu2tI{e~W2)6*OIub9ifhQm3)j>s8J$utt)#*3BnTu3Awc5b z+*tAZfv~Vx2krq{D?kcbg~P}xLcivfk>bhir5)R8jA1ng4n0WU_0GIc1%H+4ErT%emBtZ*hk1Hc~Vt7W1Ii zLqyxuHz~ArG&O4gx8Hqb;)(!-pOd3lT*OFXY|Sl3 z-jAwlC#At?4`h{t#S$5%$5n9r8L*YFv@juJG6<0LY|iM;9$p9So{m(3R19d!Wp0*@ z)|~w@35~x9_8N<>4%dDnJv&HgHuX8@C8^~{>SFBK&7M4U=V~+L8WTXuu3;ZMe@$_O zJE}w(fAieCp`vg1YO9V;wqdD&Us0m;8nRYtrOhbC)$OyxO*2~{Te6Q^SI~TrnWn%(e(R3yG6W1v5I7F36n$(`Y;5-E zdXoHGsOrixZ=oQ|&;dOG#fc{RW%gSjlAtOV6m++?`gH+XG;WcH(pyng)!W+}5N8~k zHFpGf44|0T9$}>&v&P(S9ty?cD$Df_V@_L~R+7Y|ScTao)jFYx_SFGj-U)+|DeIt- znqR4Xh~*X@63m72T0gIex&2|o)YCU3r#|S{ek?8)J!_cg>tmy#LDI(pF{G}c@j4-4 zw#F_Sm?j*Ig?H&*-LN^wEABH$z-+LwvQmh6xI$?C@$iBx1kPgKe6;j=llQp@(iHeQ zf;wGw^?Nr%^bHI$kxF`cdhjMErz#n`n<0{rhVDOpBYDxa2+-39Dt^yzny!67Xz&5nE%P_?UTjS>U&fc?F_(^VEk8?kF&%Re0< zWgU}dpKm=AZfCcQ9$wI?ElciP;`~@y;>;~8=%l_=xpm%SQYEmwq1!pUz`7j4ChYu# zt;F7ZsAaQaUZ1&W@sEwX@Sc~dGxWhg{$2EP)z!uoHVdi1fn~4s;#HpA$~8o zr|m^7a`;~tl&iS~pSM+@(g5m;B;)%9G?M9@86)g+YP1`e(N|O!uk+0JGf)_17@TCb z6U@ZzH!BmiLuY2`tf@&XBqXH_c>|eg3j@Ofzlw}J`yR$_X=%x8Irfr3tHL-!@!fSS zEC6>4P|;0#li{NPOb}*+IRFiODlV!!u%NFEGr}cI`3>3GL3ZKfRG}g$(_~>w2wSMh z&Nk50OsuOr26-X@%05g8v{w*(WFu1sXXkqy{sdWw962`mXI1_7j*o-b&T?wWO75F; zI`{`s-ps#E9EczvPCQJ@NoOSQWn>zE`rcz07u>BWm9_hn@Sm{)M?zH;Ee)`F~)0z4upFKgkYEr_D}dY!`Iqd$K@mQp5M zT3O)-*214aNmNi!n<@Tvd_2T$&zCRZeZQ=t(3Qq345bvVwu`N>v%PK8LjZw1=QC`+ z2ca6FB7=>M9TOXS3}oct_7b36VXu=v@JeNgRbuY+79sS&nM#tN5m5*NsnSr%SO~?9 zKN3h&zxl5%Ei{abU3qVA?6~MtG@{8W6K5g(D=}|(-3Vat-=*5I=yAcJE>~22DnFn> zu_nxVRjDAZSx+Wc9IoK^^VV7G;ETECfB>9F%ex0@3aU z5|}+`@=I9zr6WkI-1pW1b3RT)%s{}844IEl?8Y`PE-*+KjF%89DQ;JXIqOJ|3+(B=POD8k(3+P zxy{5T8X{^q-`IMWAIiNO^1;SrFB~vki~A03*P?wbASdWmsi~;}W&od)FDzd=>bHhL zgG--+;y2aNnSzyi7*1>lu}Vdh-rtG93GLKr^f(0F6<95MKv^E)_{^Nl?Cg&-m4M?Xo`v$29R=wjDCH~Dk;759mCAt&5f9;|Vd`EYkdV{WBhK_TW_v{o=z>cJ(#za$j-7KwVxZ~jB0@_zU@Co0{ zoy^SgrLzat_x4DxQhQIscx`R|U4|G}u2A`hpLEZ99zby#hPR5%0H=mzxdWAT^CKFwbaETKe4=33^?;R)npkHe(|*p{NMTXVpNNx!<=U^)IiQz8f? zX;*jmnOcYY_wMBybVlwn+S%CwgAG6CKKg+ouJ$^;&~tb#M&utJdj87`Pz34mNr_HK zXsE9$sA9k*VW{o{+Yk8<*j(%3g5lWvk8!T+)<4xb9q;m?lhxAH^apjQfbi~JwuGJs zgQX7Kw*3p9Q@UkyRoq`KR+L0C{tIv%z6rxR^a`W>=Z&1nq z($^R0Y6K#1Y;5csVDpc5VMhVXm?>*p5cLJE1H{oXVk1LCLnEV*_V3VEZg1PW&Q(@c zhK6E;e<3eaQ%lPoNJmI9K+~$Js{>R>ht2{>KuF9pR8TcVyiPQk;#)+sv$H|bWMX2< zINF0)&A4(?HU?Hv$@?BFYcVjBuq){4rSsJ~+S+p7y@Op!bo=%NEe}Z@Q266?k<-qe zPa}n|kzLFTTSt$DJEEv1-oRIZu+H~hQ=9gw(HL&VKBATFn)K4f*;Mxn@7WZ=2M_k3 z1T<k`a5J0{Tw!mem91W#s{!bK2`T#i1&s|2T$chT==MBlsJXcRL? zS&MGEZb%;1=5^y+Sjk)W6=mHYoh)MpiW-d0ti?&XW)r7tzsW1SUvXI8Je4LSXMedQGt_S`*z$PpKBe$G}d;IzhVzxWv{CP&hj zh8G7HlC%}(4RUfJpn`#3Hz2Nt*oHuD?8IIHv0&UJ9hZc&4fx}!snmA;RY!pUWOQ`2 z9b|5ZVbW?Z(@Ox&XFYZlY;6(96(F_)rEo-Ty+}Fq+rUQvQ0s}hdKG-#;-X=8baQhv zd>>~e7tg0){c=|*(;ye@-nbLSV?D+Hr?EGg2QZP|V6`JeV{?07xea;*pP`Hhg<`>ZUqDNexTfTF4%;*s&x?CW2HU-U2!@DrRGxcse7&ydV3)GogUuFjOuK`eM z3Alc|ySnh}m-U!hUY}MBZfjrPuTDyDQ2&j~HAy4r!HiN0MFj=lZTX?PL$YS${Rz8rGZnm+h`VDs)%K&kHU>K6Ec`Zr!F%2#3ly>4NC{xah|9kvff zJ+Gn61o1N^$ybB=7)Ue@N!_RID&N#Kw(^ch3T6UKs-gfo+2l8Xcb()|?u0G<`Zbf~ zRcSW#1JV*z*RRRqo&# zsl2g=p9K7bv#cx@p_Zb8!s-5`O;2|>7+YY&irrYjtcU&|vH}0PZbA#M)db{l>y)C`}oeU?qkeqObVr<#$*#GgR_rV&Zz1Zrr#5GNdoQ z4y8fEjSDLX6B7+4vRK3W>~MKk&K{WbIVO>G$gO(83_ja;2p+m0?^|Wqy1NTZn;&^o zWX~S&!S;LhYzCSwxR=J0?Vb-|f!XjJcrhTzFmOpLT{fQyu$=2|{#shPnx*}2Xu8pJ zGOBQ{9XNZ)YoGd7K}ndKQ!*(5RJH?q=;zO$tFK8YMZgdQ2{$ZE8w7*k8?>M_{k}Go zv~n-Le>q+F#U0G0A3yGpljD?IK(_`vrsPI|6wLsXn}Wi^8%S9Ey8@1R^E5pkn=abr z`cjYtoSk{6#kL|$x(q>udJTwoacL=<&dk7INBVWa`;e-le% z{KAki_>2n)#qrvENC3Tw9MC0q8@@k6BM>7gwRr_zHW1B-STsM)+hY3GcpSd}@ZsQL zv*uU5lm3rd05ySl&T!E8@DTEx>g>GctadYm4w}GU8l=RpQ&J}DTx|TKK79B9Ma|0n zPsXD%pXaCG*1CH2Dp2>(c;!4POioS)O&Q>+klVKZv&Xmw--&SoKYZZ(aydj2`N068 zc22~qwYat>7h?#^3t@epCXy=dhmn+&G|&GGWR6?6B)FndQpilzfE9q6xyPZQsEEhX zmN9VNg)!JfSe7kbIutkC(fv?a4X9Db$5%YXp*Z;?GY1mw7CHj_{Sis>5z-F3D+8cj zdQ%%fbC}omQ284`pcSEK{sfEoH2&ZQkclZ8x`SzFk0=Mn3regz=o$B5UdGyFI=C6u z78WFwlBp@NF{kcgMTwVEfUGR$9<}}OOu16%oqiuQIC>NJ7m;Cc&Vpi1FM=Q*>GUd;>9iE_k~rBZErw8YE|M&6u@i zL@k7%hzaS7U%9vm-EA-((Pi2;2m*7;E73E4)30ES0MQPXpc>SiY!2x7F8qtHI%zS# z0}Pt=KKK0Tk0ybQBsEx2ZPJT?@<%L>FdehLk|%hL*%*D)&cOk_W6+d4ke9+Zd%oa8 z`~^=6NMvjYlwbn{1*0km>;&(C;=!cORUsiF;xpm%EgYUuD1l5sK<@U>#xfwCcdvtWf&z2=nEDR5|?@It%@#l+s!wf^9Z|l6+jBrpZ zNNOOR0;Nb%q*KLy5tgtSkL;C_n2$hqSbvxX?C#4KvC_>%pU~B6WLY|5s zmESIFpEC$G1{bljvy*8w0U!t}xUW|_F+2-Y+uHhi7=a1{Au!S>kKzWPb>{0ZAZebM zAZ@AmX1)ik{rd3?2re&=(7=nx>){Z*R|vZ9F(Bj#L{Xjdh)pZLfw3_ZW-i3!r5mDm zzNCvj&sAwq6&eAOCR1J}&0H{|wDCwTdqC{!n}F*?gLUKthch!X?9b|7Cf5J?^T%CI zs`0o(1cCVa)mze{5ws9|EG!@VEE>5NAsEsP*K>Qq}M)z&_cQU+)Oz4ujz=V`pv@C_jRVa#BfQ1(D=$ zY;NNBsUB&63ew|D0#$l<8`3y<)u;z9fvpC-E1&FivIoAA*hww`be9Ok!NSJ=ZeI&h zo1?RHBN!vZ#eMSg&1`MApk_gWmx)o!SA*j2sd~HoLu<^vM?md@eBNaU9mvg)D`uDUZ~ zW;Xj>OL+Ynd4(}&Nyg$b+r4->5CMI!UZ2TxZtLi1i7*Y>LnSXj|4tPzXGRJp16%Z4 zS5SYBfKh$!b!haH#~SdgeJ%M(Crlo0J#FLy6hwAb)~he_wTkaxUV%;mSbey{7a*NIZfYq@_?@ZE_py62}Mwi9o-(TJ`HMJVQFK*&&M8*JD6BlPJVuvovDe>X6P=X zw$#wLL)hs>d-K*UGYhiH$Xo_&d!^NDK(m2#>q?fXuQ}Er@_A_+iY8_NlDv~r)a!(r zSsn5#B!(9TiYbck3Wubl5)xc~f0t@_hVOeA5uy&Br$=&f$>0$HP?MUL_JABuHU^Zq z3v;ydh9|k*WWiF zVG?p;I8#`(XnF2K-(iltmHgG8o;wpu!SuiT5i=8m>*egqqI=55{J}4wp)0$u_%mTj zE=nXUm_*y{KoqFRWB{E|$*oXyA)0{@umbZ;v?jRwK9rS#^70U%a-zI3Yzy%9#LF$k zF{*~QjKf=jWxj9}QczG35d{%!Z*38S1PpiN;c)`KOu(YRlH%~Fz1Uk@+T8R82VwxS z*^m=7$kp}ro_Sj)W@hMNq2W23S+Y*vaxs8L3*fZl1Od_%S{(B#0X8s=mFRZR! z7#P89^5#vWK_?z4Ay7!cehmFE;EvlwM9*t%o7>x$z|IR87xLerc@=c%uu-Q0l7puU zEbhrX7IR1757S^EgqcThaY3g(w7%yUvkRr^k4GZ_nb@u=Fj~Qa!Vv-h*v`)TkO<)N z)t_%x(R1VcpiFSx6bPf97-PuQEgek1{l=a<(7~djO^|liM@uCh5JugTR=7pls4FKI3TiT}kWcx`3orV{&!3~k+Sk;% z(}mnP!72j|4!&zm23w-xS$XFQTwgMR*oWIRy=7iWgKjY#vv$x3Wl^h4@3NYFUVc6a zr(v*iyFa*q05bz!vj<*5{c?Um!DE1%+$Qz+jt9MUK02C#n?CS%j&`+W2!Su&*UZdJ z!1*n9IyBMXAAgiR!2PW`3dxV8%X%4|h`H*MzC|CRzK)JS6jhbFR8+G%RSOmCF!n4b z(B&Gq54L9;iM!v~bI;Ppj3!269y)HBj3qsp4f9IRy+N&c3@!$~&kKR}f27edeg6Q4 z0lsh(^lz{xKnTO>3P8am@$V7e-mfk=4iG1EmFU!R0w)0I={u|u0;A^I+5Xnn3KTX7 z{T!850RI+GZk{|RQpRYla53p@6sPCCbK5?jW;;IC->di+&HXI*Hy~Gp5eQb$Q>kqfTpEJ4;DJ7{org!ez>!?((BWN=UyD& zc_oU+TUxTfm<7f|A)(ZsrM^TCbgh!nMt(yK2^vxZTGKfaBR-70J1128+!*Q0KOb*)-6Xv|^ZjCYTbqfz z!<)_;y#rq72eYZCc?n3~lm=+5AeDe>i;?^}ATZE+{QVMS*N@OLmm74}H#Dq`n0vmBRL9+}b^cj!qDJ>tnh>cW;nBdy8nbJ4-y=y}|C~?xQ(KkID8~Ar zmPTr%YOt%|Ykkh7i_RWkP#_ArjEuYEV`E~h-u_BZDgPR*n-Sry^W5OWgljoJ?Dqy{ zzzH1WTwE1k08WUH2Nh)4tj>LZ11x3G@|s#(m&oP%5(RQ|x{twKUx+*aQLD5fP-DO= zz*!Q|2~3QPE{*T;#%^0x%R6Xu+Y_SGV<|}G-kOu&9UU=i7Vi5;I(+qYavAZ;uXnIz{ z_KPymaOy2B?Hs~HAFdUaj+E#Yj;;fp2_JxLt}S>Y02wS9+`>UZG}IGEh$IeShOKZ$K;9=rbC`x@3^&4 zms30@eecmr7oobt6x`qJIci$Pkt_)Xc%sN}7V6lo6T2H@XN6A#N-V1-`&3q)1ZZ5& zilcDo9zXSLUNGws&^lDB7ad>Jfxy=5xt6_ho zY&h$a+PMHEY^$Bb1PYUy+=A!+H+xf}`L_nQyB-j`vleq0_I=+!Hg?0H@6tKu%B2@w z%iV&M3p5g(Iw)6TlEU2E7Vmh-ZqHQ8Q66YE{h4=*k6G9v(tp$zKUJ z2e1qvDF9VtT2&O;hoV!r-PT~f=Fs2Yx$0fd;+2G3(L2%oada@hz1nc3hO0;AJWET5o9s=tEvsQr+oY@824<{d|z^idb;}!T~?8t|5viA;v=1V zz?T4F3+VF@N;FX2U&6SNSR53}lR^{;!fm9z`7a*$L1 z!IvOzvE6OzbEI(Y+X)*B)G9yAST_I!1ZbL8I=rl^%Jbw;IWkiQIzHIMaKoQJ6Z6|r zG}*H{@ku%2EhzTj1mq#=QxSLZ@*RgyG=9u;sEz;IB*fu7CC(1Z75 zW`biMY=UZPYIHzy-M%5f)?eY z%pO+x&f31~xW5Jz*kWwQEsI~Ne$1j-4su|4C`T>fKH#lvk1RZ5^@%P$_6yL1t~(Yy z#&Af6VeuXTrgS)Q=FlpbC+s1;!HhqYmiBdeqv5{NlsU~H8*{d1lRfZqDoOv81l>Wr{ktgpeg4JJ1^|*^{?Z&C zZ)-Cge{ba8&fHW*zbaaCU-j z+lxR^o6d4IWOLutrIS4a^B6ABB3ts5 zvomxq&PIUHA?R!g=QlvY9)R;KnMyJaSf9(l!Vg036$}j0nHFF|W@o)uzGlKS%t%L9~j3EkB=SrQ^6M%LkDvhO!?pw_4Ym= z98`&VX31Lz92j;04F|^nJcfpDxqkzTmFdf16mde&PjI;E-X;(K16>~AVSGG1I98zP znf4`RE83@L3A`wy0Clzx4$j}bL4juuT8DH_BRSR77Y2UW*$bk>ofxfPf)oVNL2V~sn$~RM15YdHBGB$ZPX&y;RxukRqucNASN%^$?~;>~ zTYeiU;akF!MHd=L%Iy9L&|F;Nn^xW1#|7f4bb@A=oFl zH_+K~uoRTl;P^Y3(m?kjB{6`t1as8m?14+3fBh(<=2c=0N%GFXhMSr{9x8zT7ZeJD z_-~isW$Nh5ly;9-fU*YmxXN-oh6=M>6N>gQ!~$?u3%@_QY~Cd$H3vr%9BmtZ^1QvX zlZc3j77n|T@>x#-qXm|3#!v`A0f!&*pa|`%q#{thpo>7c0(>$wGz47Xn5p6Ipw_2# z&Q`!c*pY*`77&H!?n*Q$fge7=iBm&(9ynjXZ-*XdP%GzHLbKqH4rHb!A~S1THs1i< zuPO_t2&!o7MKx^sQ^95NGMtfx#h=hzg5~LZNxGZje67%>Vfewh`d6J7ICbn3u%f$Q zG}?-TrWp>QweWxga5%9|9dJ~;K8Is0P!WYF6eSs13WPI=(Y{mw3~~Cgad89w&}2*c zbcBNnL3sPNxL*e}s-qeqAb;CT)m$z#^zf)pOQY~>{sUPLgkVrl^7DQEXwiO26C~R9 zfMX}Pb%|aV8JUkE19k}H%&&{l)x%D|rk+v}0M!O~2@cO36+u6YMi>YNU$q{Cv9k3o z16ITwsJ+(Kkp#f6z#lEBx(25%R#r@19mwE_k+ybd7W90uL&XU$WKrIGF!=$$URd&y z`L>c?GpI5hK%2=0&rBqHmYWn6ftY)0NC*};bLAm_bfX4n$SyY%F|y;OtGg zja3kQseg_0F?303X$^2h@zbYIu>D~_SpbDe6D?CZ`Y2cBqceu-F2R_tuCC|dwo!;A z+Od%YoT{p+sfmh;^1fl<3BDY?(}kTwI7;FaQ}?{d3$houVL6k+d0ztsHaIj?@q3tJ zZ+ExeVHs})Tq&Xb%Wzjfnnp-V#N?>tpZxBm1f@tJ73&r~10goSq3vtPa?H$+6cl=U zdSZK)GLoX{K#N^lULO5?h^2{I9n6I@d@DwY_fY;fXr;yasBq)uZr`|ZS+(r9n-iSZ zd!nUffT3TA**gOw?HzMf^ z45^`}cIhc0c7O~W6PR?1iogL~R@?RYb0WVTjb}G3CCFY>WO^{Y(jsi+o#4m?iQZ=i zz?(K0#1ij~Krx3Srl>pM#UZ|PYE2BjKA>1HT(9ygP&_ZAV{ntcXVI?4iKA6h;Eb*Mb59`otL8w_H!5 zYZ!96eUVmPFMp5(Cn$rqV}5o=hbE9l|EI1mkEXH>`;~D=Y7;^klaM(gWD22_WRA=; zg^)^RO2&j_YA|OeV@QZdA!A9(JT_3sP&mK+e(U?=th3Hu?|N6M*!y{&`@XL0H{F^i zPg0nGF_MQCYj9BJ(Xd(Ze)85^|9+iF{DfV#q`cgfvN=i4Tj={~kN^cHWs&hm&OLz9NLp&?DvE;TyI?Ful2WvOWY~k z4X_J8J(Wa4>el&T1VF)rLZ;DDR#ukPkZRL+bYh};)E&EBQ4w`1>n5yxr=LdLy-RI? zgod7$mMJ&k+fuJbjP}odWtCb3=8KR5Dr#zLRzp3#QUI@5Xdh=M*4Cz<0B-^;f)=eZ|50Teq;!i0{ZRD1hzkGZ>0*HdF!|mhh`EnK=74VjXUK z2EFp$xpuz=GCAD3KyLSaRpsTG`St8+=&mirpmQ7HT?8;WT)zdcg+qJd*()ZVJ1)Ds z<62W%r~|MVw-QEY0=@$8Vnp@=^hm&ckkP_gQ7%r&B%LKN7k5SxwknnSGmEcCa%`yU z_VLRlZrdB6CMGC&7EU-GIN-1;_ELLYBSTlWeLFH>2x+7yHcv=ko^CP=f?fzc^ry#U zL9>SX=M)v)gc*1L*#RJkosW;v9U&DEbdevA?xB~sw&WP2sTP~5k#Y3qKUt1bYg;K4n<8{|>8HiY+fpfn_YE9lvj>-OsCSacUgn6KTbKQmDARr(hd-b<1ShrLB z7_^}(Pm;6?2fLtt7Mmm*T9OpnCe#Zl2vW_i4flJ#E!V84>E%8UHP=2fjLy7QixLwS zE;nYjedX?af`Z$HrjM{6lnSu|ae;>|_)6cbmt+#kqd>fNiR3-L?VHp?WPo6>!KtR* z^VtKOF;`zG;oYo;3!q0Nc0{$hOM`8CW?XPx9{)zbl+r#0`_ufF+C6gg-Ly3BPmP74 zeD#E_k-{!kNe@vcB!UX9b((IMpjP>vX^hzv)H}dxmV3|%G}xCN)Jb0Yw{|&7gTkTv zqEnXM8oDX$=6!5O7oRb9HZ|FNA9!{tDN~);43PDlp5BgH7I>+xaGgPfcJVRj$?WIl z#V&S-eZS=iYiDOUh$0~>Kx74fTyD2xu&R}p*Agh*xx;3SCJIm`Tm(QLrQ*)!lJj%Se8sy4RUo zlaaTR7cN-OyJ?K+G&{fgJpRMMX19&>|BpTUUrx<$VKw8lW9V)fT2q7kez50#efNFV zou$}kQfNnQ+|3FNkL#t3R`Y2A*3XI4;0m5fz+cK4&V@%%PiTRRXij-x4JIU*M5w5| z;YVZ}`XlCGx`hHLa!s>K8ZBZ);;EnoEiEuzfq^ zdDUh`7m9c7+ErCqiAyabNiYd`7zz^nah*aYavn)WBGWw{*_cr>8jk1RUIp~kRCKab7#5g1C{+yRRhT*y<`+Fkr(({f6&kU8 zqpR|VKbZJxC(q)`VXmiNr);#`z8$>3xVjoVQ72P9{rGz4)%U9$KVi&7G1-b%T-Ov} z;ths~yB_NH`Imo1`S>RAM4|GZvakX__T=jyKMI9%Yl&MnyKImT5cDF38n_5ZTNkFZNVdZ@-rur6%VC9s_ml=RVqfVGg8t4OIGCtZ z-*j~7kY7@46+TSRF2yeMsqyjsac#;S+`)h5 zhsENx!J6&k;J~o9?Wa)!KF)rYh#P)>Bkw_$CX_e^RG)x)!`1_u4WmW%yqM!N&B$*xth{lopGYJWHygSy@SXvH`v&H5YK+_ ze)_tvFL$uBi%V}$kL9);c$uSHDRenk&z(8*9v(Pu!hbPz`lhCGwr}p?Jw1OeD?1I+ z9sh!co_)zVLttc&&7(aXNB8h)u=2!mi?`?&Y~MfhYwOZf9gusyTxf8!5%~e??p-wx@Be$sCm zasmZyWPW{Zjf#e*-pr;ktQ{#e!Id?dkqqo($39s0G_>cBGOHgbeBlqW3)de$6_j=C zUIDi@oL~44XXp#bxDF8a?4i-gYu}GrZD3+@6b3LP9f4bv$dN?fbjYy4Uuj!`8QhOa zNfPU^9rkg2+fxkjVQlGSMKs;$>ccfc`EskCMpf+{GrW{};%&Tv)0#x1jI^ourIl@3 zRlMb)8U*iI`;DLE79L`|p(50bePU=h{8=^1z;&k)bKI}ht^>?B3%^7(v?IeHkeih4 zf!YY}TAPoNOh05pzUj{3;2?@I2ZLMEE8ABiMZ3RtDsdQd#kF3p{IT3N^fE8^ z%&k@C`im8}N!EnTzw?+nS|J9Zhie*Qmg?%O@NfJSW%W9b8C64rTJ_DBFXk&pRA`Lj zZZGH%Snf2jJ-=3&SG;y+TYbOT+o@T$KgP$NEO_p|upB}(fRD}t&3(qP-^{P3kh2rNhVqupg%?DmyEeK;Gb4{Q@%qAR}n{%OLl?(?kk+ z>g~?@+|snKf7M4Smm!&0Ao}z4{j%kajT50WjQi<&8}py)e|!@>Z1!E!M&Eq?@9)Sl zez)Ui&vt`{=9bkW2CMM`PDgUeZ9*%$HdqA^3o?j}6{a1;a^S~BvmNF?a^wM@R<+sV z#6&{2w$V{g^C+njRh1}h5)#i~%e!KNuL0avumvuqw7F`7^5^F23V}IlV_n^`_Vz|r z_@GeBkWfUDE@5Z`i7cpo7EL~!Jl8k>9aSOXm4~2UGKNiHZvOf6=f0gM_!yD3wA+s#j92`lM|i*OYKjLKajDPv ze}?glJ~iUPSkz!A`wy?19FiIuei^^EOuAQQS~JT8Z{NG#%(>Y1lTuwuaC3bfj%Y4F zrdYmDu9eE%mSvy(wckv70`%g3KyTR6-oE42H{}JVpkCx3+Su6GN4EhH)6wyE6Y#15 zLT3I%i<{Um!3dDy97o`&+JZNn^T0;1!=YEBT5ucaDK#zt+L)A>I3s$|Ir@$!IlY-g z@9a-SL$3Whd5sASgrtEK+Lo1x(?4H7>IvGYJfOm(#!Jp~d8@56z=A-%%xl85jW(Lk zgmPA@(WQO4&Wy`wY%Abg%k&~TJ-P)AFwR<*Go>GaD>XM$t`kQqRi7SGA)@=CXXL5r zqio^t&&W?p!9gBUX(~qtfA`#Tm(1uKYU!ETsM6*gH(<-sd90byE#BnN&}tpaL#cug zzI)gF>57Ys?_9O3F-dK?C^_NaCC|5)&zN<`4{8@~+hTp8Z{CCj_C!0RBfz5jej4m0 z0`kO_&S&Ytk7e(1IZ)lI`LcK42|2>KjRdP;CWGZ=lSwb1EP6Zb@NeIo=SHmJ zpE9$0mCYQv5v)+ADJXj9`Ui)%nkiJ{*2j|Xv!D*4Bt^mLLW4*=PcdD83Er(Pdj@$Dm5 z*#0M>(bV~K{j5CuE5Dw9(#}$yqIiB;#5`~9T*$+=#fHZxjjnBW|2Z4Whol-A`*v1- z&Jc;OkTc%6QCDAIj}8ajIQ$cW;p-q~D9IZ^%)sVBrXr@1ospi7A^fxN!IQ*LZsP3d zO!*b{$-3ZIh0~u15-sg^-#^>C9CUcNYT&iTaM|EKXYESm?MGCP;&yGB#XKCB91}@d zv$5gSh&Lx3WG3_`h6PtVWvns9_L!ZWy@eIcKt*VXNpW`hs*n?K^uy!rJmU< zF&%S{?VV0gcqC1ovD-81l6c`e^_84wmsVHgo`S-VbISl{WXYuVB4tw3q^-|H$sb|+ezSsv#U&TLO9drM?HvgJmBVofc zA*WR;fGuYITx88z$L%dA1QIU}dws~pUNDey@HpU-6+?<@Y z+jk;X6#*@9Qz9z?CHUk6VdP-a(6qdJ=Ynzi-dqv_2>eYDul09rjfBk-IhHY1czOcv zhQd`C{}&U3;r%N(KY$>k#u_FiUSE8}n>ZC5l4Fd9bM{u*dAxtCaIAwvnE2}Bxs3cv zCm2nZS$EHzp;e)H*Z(`P-n^2D_BC!MyoE_J*m0~Lw?pLzjE|r}4BkX0&%!lu>zKzQ z5qSiRvR7x4HJ3qyHQqdoZ)xC*#xBl<*StpyyE9^FU95LopFB+y*KeAvb&g2buXfV8 zEP5+_Xgw`|c;YETOe~k`*<-H=JnPIh^Prlp!IR|doCoE#Y7XF#%7#mI%O3!&w?^$H zsci2ZY$-U5ov9mAocG9r#BPUdkQ!flN);g8a=h5PmcR;$Ag}M=>MzEyVD3=R3W%yQ z=O3=WRiBy2U?#9!uCzr}juE+7QIX#>e5; zCONJ~ioo(g_R5_BpI>FAA#V(PPjFX*vd9FYlxAratW6g_Q%vU=$X(9Lllhv^Z==SW zsZOv`8&TR9a70x@Ljy!PS=v=dD=-cEcl(FId*lfhG5-R!V1!uxzn(8&ZU7uY!7cox zw%fFzP`|66_kM_GaOj>nns0mz+k=f+b4Okp2yFX4|9J4yNjJ=}+wr<{AIz<5wDTBHJFgyBF8w$k(5!(V^5U-tO zCMqK->1yyt(#E)ROCWtIz#t^Oj<@+$msFBgH(sUAmKGB%qn>MZoms~ zZIQ=@YK&bHVGsl8`%Ud;*lu>U-@4_SW;}hHoo9@S!pXetxk$bpQOx7m=VAB( z1z0hAs`E+iwT2EY-d{cHVh5A6k@Vu2d<2YG6f-Gm3eqr`EWJEE$petCf=NhxD!9Y` z^WY%%E{$T#$gL~;Yo`whVMi^C3UUsf9s*5T>cNk=*`Q!LbZ$&3(Ni;&}^U1I8! z{@K!7v?Z}=^m%o)_iPWu z(tJ2h9or{hvHUSe(8L76K5rTuRaW}gqo%-U)dQu#fI`Ys0e1yVnu?BPb#2YW)b#h- zKlIg8)6@9KpbZaK|3SlmVZNrO1~%qIt4Fo9K#8w{uRwAH3F?CgL=K!pBt!?r#bS;H zaGDPc7(?FX=0^HsB+w-o$&{O4wKhHn5d7S^GQ<^G)|nP|wzmg6-Nh(Z@*P_rwoout zQaWXyT*K55IAGSb#iymAu6_&zMt@dbTm9Bub8($scq{O5qs6Z*DFLagn?m-!0dPI0 zT-jTj|K1}`4$}b1AB52Z^-!8!2T|34^kHjDN;2{Akcgz*9j1m=w2Ej09(5oY!K$Nx zMtJxhzzB=xbZ*XB;M0%pj8?31<)kkNlRt6<{C5D9ns`Y6J>fp!T;Dvs=q*B}O0YM> z^}-(@f7<_+rIS;b1k?Z$GBVSi)iv8zaKV&fc3%G>1#A_J7NTQZhn_P?inLem5e?U> z2NJ}(cdtvuApGTTruCT6Tw|t1B>jjAbT8;wFw|LCaGg3xU`gd~;z61WxY{Ax7^TD-YZ+)9{ZF`_7H|v?6S7@rPLV|&7B6Uv)_&$_eHMO-ViHWc=RhWvzXkzL; zgB10l@;67cyWV$9FP=YlQV-e8*t^oxd5w%nK9IxDR;QdFj@$@SD3`hZn9ta?LEg~;W%5OC)XO^Y#xcs1Vebl&~@5wUT3=bhdmDcx8; zuwDaC&u|6nf?56>b{9Jdr;r>NT@hhn0S?}+1b;C~m4&r`&CP1QL<|~$aJ}XEHDe#b zIPGv^f(y#Jrk!-C9Wze0!1#JhsYhMI*mE>ugO$O#cihqAMpvGPAH?!a8#Cs8fEeD%x1EPQk>H zhpy3!Mar9FeSnjvH#+ z9&~kh?`b#bZOlwes*y>;GSIAxaR7Q<9u^=mH;x}~@)0wJwg#TK|Ag7YC^j;wU3{%0 zj}Y&JQIW7TV{KDKV_NCTrmXHCP0C`x7W>;*0WpW8?kLQ7x?#s7r-Q}Ig7$#3y}i$D z&w&vm5078y6b9?`J*tPGd;$4um=C#hn#W6(lDub@5V%8PN*>yTqNV$dvEMBOsOTo@ zANEH?%_vu;{=7-7iFvv4=X_`@G?W zbm$ZNfI?MNJuP7~t@gy!Ng2P3$usJU!Fc4LyBQTApiL; zW3-jqqL$Ii%g8p-aQOk$CpU1#VK2b!Qn%7%({H#4gR;TKs4BMxVxol0Z}u!|Dij1r z&L}h_Vc!P7%`YjQgJ>+rFyAQ|VibtmNo1k0m{glHVBPH=m;d0$FKa^sXCJptq2T`>Jf;IhW281ML$`l3LG{8 zb2_W@$I=r$otbanyb%D?K9*im=0Xo22}(q-6ygNE88(tLvLCI;a6K!Avk!0%Dn1f; zgLA!_Lg*u+qY?Lo$OK$aK)^-Mo=LRG%E+uBy(8GGG$P_1mKm6|*P-u7ZfMtmt_dT7 z__v@BULF4OSm6qePe`0HFgNF5X6}DWf%MdXOE`t*hQ4c6c?BD?&VfYpyx18ap!~qT zv>PP@Pow=^(kf(1rl)^dF6DkmnIv^+{1jjjv3+*`jqcH$$7dtFY$G|dx${FfqJlqKS#p6tG zDuBT~H6T5{^fT+8dX9ThQBmOeG%}$7bDivGptN#vLCla-a_9T^mu}oRf4w9!CrIx9 z`tQcM-r9?$K@uEGA9G9?<_7G%yOem1Ir>!o-~YBuoriTSclg-H&2NdQdB3?Q8pDVB ze+E&%=upUh-HdyBtFBZZ#1H~!ReQ-^K<4V?;PABD5n}fSRuE)IWo6+p7tn^~6*km? zfy5*qoCk_*0!Y}-<9LJl12=ALU_0eIcrXDf(LH;VuKvcaTR(o>Q&F3|k0k;-go(L1 zy)Qk12R#|i07BKmc?b7R{$NK$Ck_|@{n?1JySqESFWAiOfyiRRV#FdH{pGtwJ=A1$ z5I*=YHL#jgz=y%jfyKiM#A!wSA-iYBsKd+4%b4WRu@lmu!+;LD+U(`UFLK6Z?QB_9>4e*$uhVYp7 zMX_EkP$ANzZQp@{T8H7DWy&_D@cK>$72^6M-ynyppX-mMK5AoWd5$$9u3L?_NczB- z+97ytVRc_RZ@+WNl5wA5LStv54x=UwGi!Z!Df7O4r(!2CzraOF>)&KLq_v8Z^GT z)}gxFO#A-WpF2rBjA3AW1jCczi^T~S(Bk7Lh5^?~W8sTzvPr6%Ts-7y7f&Bs(x`Df z8vH<&z{9wov3@oW(fW&sQ33{m+qv+s;Ss43jBbTmj&!0CxBzsaUvK_(6E}nnjSc%I zv4kHQ%93oYvAZW_4@k{M4_{GZ0Q1r?~J-qH0`rG-5GP)tAJP`FU*3W z0=pXw3@G-PNFgBs$~ZSWYhHh|Zj!<&n2GRA@WH!(ZAsL$OKLF4rF&A>LHy* zi;lAEFj26*kufo4*;MAx@pF%FE*vz|x9hKxarm+$mm%FiisSsi1@l$x*M)}27(&3# zNzsJQU@{gK-2GcFwMFu(@lJ^M=^QJ#uJiV=UK)>hy0_XK{e2Ph=e)W4*QVOpT4Wh1 zB>=%8k`B-QKBb%ccyM+S2@9$EdM$#R0Qn$i^a_9q$YO6o-30rKDcrd@1Og5dbbQPl z96!d#o0`j$3HOrgdo6~`rsKBuO-;OUGy6+#CVfZ*uzA?=rM;#e3wat^E*_s>{^NI0DK!=j zzW0;qjp3RxAFuP=^Q6gHgs1fnXOUT8o`{>l&8C5Y0h|c2LSq$) zqj_Rt7$_bWbvt5nEH@QVAwp!0$J(6@TNQpupK61yzTa8;u-}8DPyfrGuZdf|uWbkP z;K}>x#kKZ5xIe1z#1h_7g`N$$f}WtFqC$sO_t1(!R*tIYdZyVEaUYM#=zYQ>Ob@7s zlxf#5F(A6>lB=sQ6K&El%IMZ_Jy{W=dRC}WP_ZK(c-1*iD&w@)HgZO6U|cUd$>sLn-2ojBMkJqL%9-Qxkbm&ei70FPj>@7R@zQD3`qf! z2qwe0A;84K%nZPm#6Ke20#X4qA&5$02~$IuC4zzg`aXlV1TsBQ(U4`*L|X22PD=}l zlfW%#=W*T^P`? zU=ERPT$Gmws5JqGGr*X?M(=QOD){PVbPI#d9*pWH18tNjV_37b z2S)m9*J@CS(9>Z~!m)DM-Hsq=F5;k)gm*G-gOukjs?8uRg*L<0(Qy^n>>;Lb=uLs` z6`~-59K$X3Q`|z!94ukPI*zGev%fZ);Z-O%VW)Nf%kg&W9Xhju0X7di4chd=ohL{A>Ck$c=KikXbO_hHgQ}bY-BL0f`CBeA9~G(Nl%Co zrEvZU!5fg`apiz#eCY82X8Duha3LIhSP6A67AG1c#V5mAC-;P>gEGUWkIwxT-Ys@4 zXvz!BYYqA18WjSzn1#uC$h{?xu>WZrqWyb1to2r3_Jh#E!ezHe@u=MqLIzh=^>ft; z466q`Z%ZJm4X=vQQq=3>!om%xa~zYAgG}}ZJL#k3WM>TKWdHW9c5*h< zJP4lv*Q3+x1vtnuhcZ<{h2<5-S%ky%^+CP$%9b|xo|)(_diuir{Gf7$88;;SpPwPku@PnkrC{~*>v1^fHJI@K-KhRh;>tHuCf6`RuNGsWZ{(su=f|Q*| zvV?XKFUVFvS_7ZJ&xI!@5(z&bRnEQ?o$H5&q0$BD?&;&$%$D zzKz{CIX*S8dT{8%s`LyMzwC$+4i3VZP`6dP$%xb+zFo)@l`1ZhZ~J%2(vqxfk!)Q8 zbES&@7Yr)kt&TRM@A&+AFOR;3#TJy}NvHl8{Y%@U8hqeaTPZCMHUCE3MU-NQcS**i z>1osl`hSjy+DuA<3-=9DPKGgtV1+}()}bX*a{nkr+(3ZDIBEti1vVS1Yv))`D2pmKk?Iwo`!e0!AI>FSiZzZ~xe^7|H*2?5=TvW0adLV$=wB3WY! z8uTgFFK^wOxB_$|7b3ooDuq`-sf+%XBAeKt-*{8vK(TnIFLFM}0~+wOAk`3J#iJf$ zYH-%XkyAF=j9f$djeAILS`?NdWYNe^K`JZt3RO6l)g+EEv6K7+(JBG~y+^-mn(taV zuw|+vE>}|Bg(0~QqcCF9 zu&Q7!zejL1w&bg`;{K1<`f#WX)Z@^y0)2x<9rYNelv!BRx48tI$VU-#_l0bShqmea z@&8e&p}&`(e?c*iR9HhJBY@QL={aZ((Z&JhOPHp$*k%6Qoh0tW#U8=~iVg_sT9_*l zwFz#z;X#G2=T~++Y8TvGsDVgq9KK9)CoaG*k%0$cr?WJa=DfUPAU1FfV3_oU_LubJ zAi#@sZW{K}eLGvRbpDkka@6Z*dxbgp4NY$+UiF6X6f&Ye~utIyfyXTj`T> z@O+RoaqH`y$_Plfxgm8A#O0$?ia;T5J3uOa|3!!RHH zm21*24!PzTPpp4{{0KIV*B(8O2vD?dQ1T$aA}s6^qW5>G%nnw3!zTmY6e@B0%o!RV zm^2Z2_7n0XygOYNFAT8ggrPacUD>f;jAyO`DP(0J-eLgXnJ(-Xz}I0TbHX$ z$wcg}cSjYM-FScc8hv2Df1Jp|V)2>0Yh{D=$)8XAbPbE1-zsmh_9k@I-??z`y?l+A z+zc0w;q@9;661FGaJ)9oHQ?48WS=g8XqibJi68vqcQ}^jp;pPqbc9?bwALzvd&!A_ zjL|_}6qS{-dwc(X^vwMzQy)G6Lcy$vTZ}%aKI*43dLDd|D|oE&wJOg9o!AM;93b?^ z*+|}(6?IlpV@Xy@q^Yst>LG|1LfAjwqyC5I{?OmA@|C7bWtHu z>pus(EgoyPySuQ4;o}QD=I!X{c!~Z`E8WsmM zl5w-Kjw8KQ)1sUi2IX4MNm~5_6&FfKo>K+}tREh`B~%3|L1Qdnc->FnpeTfdr0JGB zG?H{Vco!|tfu&)hMtOog{I&Hm4yyz#to!8L`SZ1o-MscskKr6=ObxoHNx;Iwg1D3v zj>W`&jem4VSeTNOk6%Rp%L>pip1{b^a*YzAYQAA1rfUl6;fJJ?h>->bxurOHN$DfH z2f4X|?f-&J#%jhNZV!ad9;=7k2bdum>&COBsJ*MVQRYBWshrw^6KIF=zcDgxeXH`Q29V@Vc9&bMx>4=Xz~Fg&FHqZvm?D5jCIn1{UJ^C^K~na5quiy zM{3Fv2Ux{V^TwcX>lGg~*eI;$pX2prJp z{TJnucA?r1iJS{7E12x0bZ}@i3J+XtQ!LPpqV81@gB&kqcQrO{dwe=M8#OD{`qj|T z3m`oh3$UJ`da#}o^0vuDM;tKr62fn`y?ei1VTC2tQ?$jJ+R{& zwWdT1_ViQr2gV;l2Vx=2(zHk;5)KNHo5L4#W`ZJJUjJp$N=7 zK_EryOqyF^kO~Y6veLnA!>q-i3NYW_&GWK{usH}{O3{kX?oA*RM`zQV*sar?D{268 zK@Wf@DKC#UF{|GhHYL`QaS>Ubv5{z6-3dZDVZMeXq?HdrL?Le!d*#w_RwFiQ){lCxuyH_HV+|qX;<5SXo*5 z#*Jewh{e7W9L&nfD&7i?RZ&usv6*3~LuW?6Gm;oVFq|I{*ci^mrhsk(C)wrdV+V*^ zd(^R=#nl&`0$A=*NuIsi6law9jNQDAa?W>|p&fxW1W&kfFJp@=^b+#&DXrshw>?hJ zfp9}sUjF!rWfXjLbR#n}p+ux-BioRGv!aTMd^|mq#jQwAWzbHzjyOJ?ATU$2;Zr(Yw#lschno$!TwgsMLJAGfyPtqY3UDarZ zM;I`Yw_pV@s6r8nu*QF|bb5b;DjiD++E50{#{W|PT`VmZG}xN4zaX{@$C@zmkPL0v zb+t#G$o6AXeGaW6(vl)Q5NC+LG!o!iy16kwci!oGHqkn*gkDX|dZvSUD*~iwGg!b# zB05d-a*TY*kh<`H#NAb1%!B6_9(OXAy6rWzHl#B;L4}Yt?%ci|2YQjz8Y937IShu#WEe&9i}Y1^_-#GN32p-RaXK#~LL+~t$>lYkn4 zBUy2gGO?#POR>iMN9AvADyYujK9?lmoa>~EUit}e<%6AbN`9c7b*aym7Jd(uwShM0 zia|8uvs;WKKgb@O!@=D8LL0bNq`*U6T{0oKd*BrG4Hc z(EH}`zgNDdrEpSL6DY}J`BHZ5!k*tq=fBr7yOQJ0oTsECQGhQ6OZZ(wYBy7F&NLM zg+L;fh<@V|sLIJaPW#`WpvdcXl-+k108Dwge+h}W&<7I#?vQ(Ln1 zW)T|3?)P@oz4M7uF>-;~bxxnYi)t6~8Z832BUT#-(&&_0?;+S8FuUwNl8Az$xpS*F z1&T>DNh)u76ck=8KZUD~|N8+X<^1cJpXrhd)(a|Kd5l?jR-varE*NUp z*OxbH)6)afb8tI5P-{WpW6a3a2g)q6e?LX+8VIQ;7#o2*mskcE<{v|Fw2I0$?rF$k zNXJQh{fZBX_eYu}`@1e}9?e?raqBqbC4Rg>WzP#OqZg3J0qsciOMm%NF>Vm?o~#Ig zrzjGJ_}#PQm_Q){h$jG{m}Wy630etKwa~kFA)>tOi4M9Bb@GYAHM36 ztqD_#Erk9dAt7!TSx8~tqv5z%{p%S3>$b^HVw_6V=&-_ju$vp&yE~4)i4}47WF^-I zUkC=fJogw6(G_@zY_LQL8#t!YX0nQkL;>ZAi;MH|sR^@u%e$hieWBF04Ko%T>2sh& zY;BRb%S5XVqa<*6(9LLIKYPaaq>vK0{M&c-KQ7D!!bM)Qo1&@UT|NdWpqVly(K?S0 zN=qAD+3G7Q3BZp6D~K8Nl+tmLmKdIwLPP?{U&xp~oXfg0< zNChm=wbJ#vovln}4-UAwi_3=5Dw4pyo3)$ceEmmN;p6)`wHQs0+}0xBQgnz`cH{b& ztQ@Lddi5Ihy4j6nUKeO>@}1*L{ow7pZL{SD%y+2d=*Teijn`)z(+f3!Z30}qATt5fBBY(5Vz-98&S zagQnCwS=WdxxsJKsPxlk560gYJmexz3DN$8kds2PnkOxjmHX&yqkJrd1%f5Q1jDCv zrN;E0@4hqPDR6A3icfQ}1x?Hk?}MQ!0~=#^fBgK`Ykcay%9TKoFMpmms~R7-{1tzLIL;Q)P8>I@McVX(QS9jj3R$ znQ6CZ&%Mx029+&NJ~x{02PJwAe$v=?<7nGiqYv>~+IFRbhP<0TT^3Kb$i>sMe4g)L RWhBE(OZ~K3k*a0j{{bg2XFdP` literal 0 HcmV?d00001 diff --git a/powerbar1.png b/powerbar1.png new file mode 100644 index 0000000000000000000000000000000000000000..340257dceac5cdba123579279d0eff769706a6b8 GIT binary patch literal 23396 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%0A*7Q9-1;T-mUm} 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 literal 0 HcmV?d00001 diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..70a1513 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,38 @@ +fun getLocalProperty(key: String, file: String = "local.properties"): String? { + val properties = java.util.Properties() + val localProperties = File(file) + if (localProperties.isFile) { + java.io.InputStreamReader(java.io.FileInputStream(localProperties), Charsets.UTF_8).use { reader -> + properties.load(reader) + } + } else error("File from not found") + + return properties.getProperty(key) +} +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} +val gprUser = getLocalProperty("gpr.user") +val gprKey = getLocalProperty("gpr.key") +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + // karoo-ext from Github Packages + maven { + url = uri("https://maven.pkg.github.com/hammerheadnav/karoo-ext") + credentials { + username = gprUser + password = gprKey + } + } + } +} + +rootProject.name = "Karoo Powerbar" +include("app")