From ee4096918e838a59622767e0d65316ff35a4afab Mon Sep 17 00:00:00 2001 From: iorgamgabriel Date: Fri, 5 Aug 2022 15:13:31 +0300 Subject: [PATCH] For #7249 Create a search widget --- app/metrics.yaml | 54 ++++++++++++++ app/src/main/AndroidManifest.xml | 16 ++++ .../focus/activity/IntentReceiverActivity.kt | 19 ++++- .../mozilla/focus/activity/MainActivity.kt | 53 +++++++++++-- .../searchwidget/SearchWidgetProvider.kt | 63 ++++++++++++++++ .../focus/searchwidget/VoiceSearchActivity.kt | 32 ++++++++ .../focus/telemetry/GleanMetricsService.kt | 7 +- .../java/org/mozilla/focus/utils/Settings.kt | 14 ++++ .../res/drawable-hdpi/focus_search_widget.png | Bin 0 -> 17294 bytes .../focus_search_widget.png | Bin 0 -> 16899 bytes app/src/main/res/values/preference_keys.xml | 2 + app/src/main/res/values/styles.xml | 9 +++ app/src/main/res/xml/search_widget_info.xml | 15 ++++ .../searchwidget/SearchWidgetProviderTest.kt | 70 ++++++++++++++++++ 14 files changed, 342 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/mozilla/focus/searchwidget/SearchWidgetProvider.kt create mode 100644 app/src/main/java/org/mozilla/focus/searchwidget/VoiceSearchActivity.kt create mode 100644 app/src/main/res/drawable-hdpi/focus_search_widget.png create mode 100644 app/src/main/res/drawable-night-hdpi/focus_search_widget.png create mode 100644 app/src/main/res/xml/search_widget_info.xml create mode 100644 app/src/test/java/org/mozilla/focus/searchwidget/SearchWidgetProviderTest.kt diff --git a/app/metrics.yaml b/app/metrics.yaml index 2ccba8ad4cc..77c7ae22414 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -1900,3 +1900,57 @@ metrics: metadata: tags: - Performance + search_widget_installed: + type: boolean + lifetime: application + description: | + Whether or not the search widget is installed + send_in_pings: + - metrics + bugs: + - https://github.com/mozilla-mobile/focus-android/issues/ + data_reviews: + - https://github.com/mozilla-mobile/focus-android/pull/7474 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 119 + metadata: + tags: + - Search + +search_widget: + new_tab_button: + type: event + description: | + A user pressed anywhere from the Focus logo until the start of the + microphone icon, opening a new tab search screen. + bugs: + - https://github.com/mozilla-mobile/focus-android/issues/ + data_reviews: + - https://github.com/mozilla-mobile/focus-android/pull/7474 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 119 + metadata: + tags: + - Search + voice_button: + type: event + description: | + A user pressed the microphone icon, opening a new voice search screen. + bugs: + - https://github.com/mozilla-mobile/focus-android/issues/ + data_reviews: + - https://github.com/mozilla-mobile/focus-android/pull/7474 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 119 + metadata: + tags: + - Search diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1fdc53df28f..a195687dac0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -131,6 +131,10 @@ + + + + + + + + + + diff --git a/app/src/main/java/org/mozilla/focus/activity/IntentReceiverActivity.kt b/app/src/main/java/org/mozilla/focus/activity/IntentReceiverActivity.kt index a919bc93499..7011cd40b67 100644 --- a/app/src/main/java/org/mozilla/focus/activity/IntentReceiverActivity.kt +++ b/app/src/main/java/org/mozilla/focus/activity/IntentReceiverActivity.kt @@ -8,7 +8,10 @@ import android.app.Activity import android.content.Intent import android.os.Bundle import mozilla.components.feature.intent.ext.sanitize +import mozilla.components.feature.search.widget.BaseVoiceSearchActivity +import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.utils.toSafeIntent +import org.mozilla.focus.GleanMetrics.SearchWidget import org.mozilla.focus.ext.components import org.mozilla.focus.session.IntentProcessor import org.mozilla.focus.utils.SupportUtils @@ -25,14 +28,15 @@ class IntentReceiverActivity : Activity() { super.onCreate(savedInstanceState) val intent = intent.sanitize().toSafeIntent() - + if (intent.getBooleanExtra(SEARCH_WIDGET, false)) { + SearchWidget.newTabButton.record(NoExtras()) + } if (intent.dataString.equals(SupportUtils.OPEN_WITH_DEFAULT_BROWSER_URL)) { dispatchNormalIntent() return } val result = intentProcessor.handleIntent(this, intent, savedInstanceState) - if (result is IntentProcessor.Result.CustomTab) { dispatchCustomTabsIntent(result.id) } else { @@ -43,6 +47,7 @@ class IntentReceiverActivity : Activity() { } private fun dispatchCustomTabsIntent(tabId: String) { + val intent = Intent(intent) intent.setClassName(applicationContext, CustomTabActivity::class.java.name) @@ -58,7 +63,15 @@ class IntentReceiverActivity : Activity() { val intent = Intent(intent) intent.setClassName(applicationContext, MainActivity::class.java.name) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP - + intent.putExtra(SEARCH_WIDGET, intent.getBooleanExtra(SEARCH_WIDGET, false)) + intent.putExtra( + BaseVoiceSearchActivity.SPEECH_PROCESSING, + intent.getStringExtra(BaseVoiceSearchActivity.SPEECH_PROCESSING) + ) startActivity(intent) } + + companion object { + const val SEARCH_WIDGET = "search_widget" + } } diff --git a/app/src/main/java/org/mozilla/focus/activity/MainActivity.kt b/app/src/main/java/org/mozilla/focus/activity/MainActivity.kt index 00d257d6784..4fba7475322 100644 --- a/app/src/main/java/org/mozilla/focus/activity/MainActivity.kt +++ b/app/src/main/java/org/mozilla/focus/activity/MainActivity.kt @@ -21,7 +21,9 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.isVisible import androidx.preference.PreferenceManager import mozilla.components.browser.state.selector.privateTabs +import mozilla.components.browser.state.state.SessionState import mozilla.components.concept.engine.EngineView +import mozilla.components.feature.search.widget.BaseVoiceSearchActivity import mozilla.components.lib.auth.canUseBiometricFeature import mozilla.components.lib.crash.Crash import mozilla.components.service.glean.private.NoExtras @@ -51,6 +53,7 @@ import org.mozilla.focus.state.Screen import org.mozilla.focus.telemetry.TelemetryWrapper import org.mozilla.focus.telemetry.startuptelemetry.StartupPathProvider import org.mozilla.focus.telemetry.startuptelemetry.StartupTypeTelemetry +import org.mozilla.focus.utils.SearchUtils import org.mozilla.focus.utils.StatusBarUtils import org.mozilla.focus.utils.SupportUtils @@ -78,7 +81,6 @@ open class MainActivity : LocaleAwareAppCompatActivity() { updateSecureWindowFlags() super.onCreate(savedInstanceState) - _binding = ActivityMainBinding.inflate(layoutInflater) // Checks if Activity is currently in PiP mode if launched from external intents, then exits it @@ -113,12 +115,8 @@ open class MainActivity : LocaleAwareAppCompatActivity() { } val safeIntent = SafeIntent(intent) - val isTheFirstLaunch = settings.getAppLaunchCount() == 0 - if (isTheFirstLaunch) { - setSplashScreenPreDrawListener(safeIntent) - } else { - showFirstScreen(safeIntent) - } + + handleSearchWidgetNavigation(safeIntent) if (intent.hasExtra(HomeScreen.ADD_TO_HOMESCREEN_TAG)) { intentProcessor.handleNewIntent(this, safeIntent) @@ -139,6 +137,27 @@ open class MainActivity : LocaleAwareAppCompatActivity() { AppReviewUtils.showAppReview(this) } + private fun handleSearchWidgetNavigation(safeIntent: SafeIntent) { + val voiceSearchText = safeIntent.getStringExtra(BaseVoiceSearchActivity.SPEECH_PROCESSING) + if (!voiceSearchText.isNullOrEmpty()) { + openVoiceSearchBrowser(voiceSearchText) + return + } + + val searchWidgetIntent = safeIntent.getBooleanExtra(IntentReceiverActivity.SEARCH_WIDGET, false) + if (searchWidgetIntent) { + showHomeScreen() + return + } + + val isTheFirstLaunch = settings.getAppLaunchCount() == 0 + if (isTheFirstLaunch) { + setSplashScreenPreDrawListener(safeIntent) + } else { + showFirstScreen(safeIntent) + } + } + private fun setSplashScreenPreDrawListener(safeIntent: SafeIntent) { val endTime = System.currentTimeMillis() + REQUEST_TIME_OUT binding.container.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { @@ -155,6 +174,26 @@ open class MainActivity : LocaleAwareAppCompatActivity() { ) } + private fun openVoiceSearchBrowser(voiceSearchText: String) { + val tabId = this.components.tabsUseCases.addTab( + url = SearchUtils.createSearchUrl( + this, + voiceSearchText + ), + source = SessionState.Source.External.ActionSend(null), + searchTerms = voiceSearchText, + selectTab = true, + private = true + ) + components.appStore.dispatch(AppAction.OpenTab(tabId)) + lifecycle.addObserver(navigator) + } + + private fun showHomeScreen() { + components.appStore.dispatch(AppAction.ShowHomeScreen) + lifecycle.addObserver(navigator) + } + private fun showFirstScreen(safeIntent: SafeIntent) { // The performance check was added after the shouldShowFirstRun to take as much of the // code path as possible diff --git a/app/src/main/java/org/mozilla/focus/searchwidget/SearchWidgetProvider.kt b/app/src/main/java/org/mozilla/focus/searchwidget/SearchWidgetProvider.kt new file mode 100644 index 00000000000..f33c1b9052f --- /dev/null +++ b/app/src/main/java/org/mozilla/focus/searchwidget/SearchWidgetProvider.kt @@ -0,0 +1,63 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.focus.searchwidget + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import androidx.annotation.VisibleForTesting +import mozilla.components.feature.search.widget.AppSearchWidgetProvider +import mozilla.components.feature.search.widget.BaseVoiceSearchActivity +import mozilla.components.feature.search.widget.SearchWidgetConfig +import mozilla.components.support.utils.PendingIntentUtils +import org.mozilla.focus.R +import org.mozilla.focus.activity.IntentReceiverActivity +import org.mozilla.focus.ext.components + +class SearchWidgetProvider : AppSearchWidgetProvider() { + + override fun onEnabled(context: Context) { + context.components.settings.addSearchWidgetInstalled(1) + } + + override fun onDeleted(context: Context, appWidgetIds: IntArray) { + context.components.settings.addSearchWidgetInstalled(-appWidgetIds.size) + } + + override val config: SearchWidgetConfig = + SearchWidgetConfig( + searchWidgetIconResource = R.drawable.ic_splash_screen, + searchWidgetMicrophoneResource = R.drawable.mozac_ic_microphone, + appName = R.string.app_name + ) + + override fun createTextSearchIntent(context: Context): PendingIntent { + val textSearchIntent = Intent(context, IntentReceiverActivity::class.java) + .apply { + this.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + this.putExtra(IntentReceiverActivity.SEARCH_WIDGET, true) + } + return PendingIntent.getActivity( + context, + REQUEST_CODE_NEW_TAB, + textSearchIntent, + PendingIntentUtils.defaultFlags or + PendingIntent.FLAG_UPDATE_CURRENT + ) + } + + override fun shouldShowVoiceSearch(context: Context): Boolean { + return true + } + + override fun voiceSearchActivity(): Class { + return VoiceSearchActivity::class.java + } + + companion object { + @VisibleForTesting + const val REQUEST_CODE_NEW_TAB = 0 + } +} diff --git a/app/src/main/java/org/mozilla/focus/searchwidget/VoiceSearchActivity.kt b/app/src/main/java/org/mozilla/focus/searchwidget/VoiceSearchActivity.kt new file mode 100644 index 00000000000..20d0ff61244 --- /dev/null +++ b/app/src/main/java/org/mozilla/focus/searchwidget/VoiceSearchActivity.kt @@ -0,0 +1,32 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.focus.searchwidget + +import android.content.Intent +import mozilla.components.feature.search.widget.BaseVoiceSearchActivity +import mozilla.components.support.locale.LocaleManager +import mozilla.components.support.locale.LocaleManager.getCurrentLocale +import mozilla.telemetry.glean.private.NoExtras +import org.mozilla.focus.GleanMetrics.SearchWidget +import org.mozilla.focus.activity.IntentReceiverActivity +import java.util.Locale + +class VoiceSearchActivity : BaseVoiceSearchActivity() { + + override fun getCurrentLocale(): Locale { + return getCurrentLocale(this) + ?: LocaleManager.getSystemDefault() + } + + override fun onSpeechRecognitionEnded(spokenText: String) { + val intent = Intent(this, IntentReceiverActivity::class.java) + intent.putExtra(SPEECH_PROCESSING, spokenText) + startActivity(intent) + } + + override fun onSpeechRecognitionStarted() { + SearchWidget.voiceButton.record(NoExtras()) + } +} diff --git a/app/src/main/java/org/mozilla/focus/telemetry/GleanMetricsService.kt b/app/src/main/java/org/mozilla/focus/telemetry/GleanMetricsService.kt index 6167217c31c..4c109452ce0 100644 --- a/app/src/main/java/org/mozilla/focus/telemetry/GleanMetricsService.kt +++ b/app/src/main/java/org/mozilla/focus/telemetry/GleanMetricsService.kt @@ -24,6 +24,7 @@ import org.mozilla.focus.Components import org.mozilla.focus.GleanMetrics.Browser import org.mozilla.focus.GleanMetrics.GleanBuildInfo import org.mozilla.focus.GleanMetrics.LegacyIds +import org.mozilla.focus.GleanMetrics.Metrics import org.mozilla.focus.GleanMetrics.MozillaProducts import org.mozilla.focus.GleanMetrics.Pings import org.mozilla.focus.GleanMetrics.Preferences @@ -75,7 +76,7 @@ class GleanMetricsService(context: Context) : MetricsService { GlobalScope.launch(IO) { // Wait for preferences to be collected before we send the activation ping. - collectPrefMetrics(components, settings, context).await() + collectPrefMetricsAsync(components, settings, context).await() // Set the client ID in Glean as part of the deletion-request. LegacyIds.clientId.set(UUID.fromString(TelemetryWrapper.clientId)) @@ -90,7 +91,7 @@ class GleanMetricsService(context: Context) : MetricsService { } } - private fun collectPrefMetrics( + private fun collectPrefMetricsAsync( components: Components, settings: Settings, context: Context @@ -100,6 +101,8 @@ class GleanMetricsService(context: Context) : MetricsService { val isFenixDefaultBrowser = FenixProductDetector.isFenixDefaultBrowser(installedBrowsers.defaultBrowser) val isFocusDefaultBrowser = installedBrowsers.isDefaultBrowser + Metrics.searchWidgetInstalled.set(settings.searchWidgetInstalled) + Browser.isDefault.set(isFocusDefaultBrowser) Browser.localeOverride.set(components.store.state.locale?.displayName ?: "none") val shortcutsOnHomeNumber = components.topSitesStorage.getTopSites( diff --git a/app/src/main/java/org/mozilla/focus/utils/Settings.kt b/app/src/main/java/org/mozilla/focus/utils/Settings.kt index 6062cae2b80..386fe271220 100644 --- a/app/src/main/java/org/mozilla/focus/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/focus/utils/Settings.kt @@ -374,6 +374,20 @@ class Settings( .commit() } + fun addSearchWidgetInstalled(count: Int) { + val key = getPreferenceKey(R.string.pref_key_search_widget_installed) + val newValue = preferences.getInt(key, 0) + count + preferences.edit() + .putInt(key, newValue) + .apply() + } + + val searchWidgetInstalled: Boolean + get() = 0 < preferences.getInt( + getPreferenceKey(R.string.pref_key_search_widget_installed), + 0 + ) + fun getHttpsOnlyMode(): Engine.HttpsOnlyMode { return if (preferences.getBoolean(getPreferenceKey(R.string.pref_key_https_only), true)) { Engine.HttpsOnlyMode.ENABLED diff --git a/app/src/main/res/drawable-hdpi/focus_search_widget.png b/app/src/main/res/drawable-hdpi/focus_search_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..2f967151f4e128658bd1e63bca5c78f5701068e4 GIT binary patch literal 17294 zcmYgY1ymE>_s0Mf1XMtzLAsG{klN^wkOt}Q9$~;FN2lcIZlu48NY`ja2#gpbq$LLb zDgMs+zjKJa`|7^?;=X(DXAzp}00KM;JS;3M0wtilHWt?XIL!ZP4{$KQ+lGksF@GMq z0S!E{usBuz{M;#&Oew`=-tp81$YNEEP$4lN?%TdndxeEn3&Fp#z{bLoV^ETRrQ>&J zck$t8s`aep8#CRrg{O~X?^?<{#qs=oU&V(Le)rK**l*V^r?rpX?KL$c%QiEjoOE+) zaUB&MivHG?_m&ui?0lVho$4HIzdo-6_Io@WvhXB-v^vc-CJD2vk}5mA$}TQzYi$iI z3KZbqPCsui)b`bQR|1E+QGtbJc+NwfS%%_==fYpB=u$l3pIs!j7 z0K?s%1m1pDzhM2oAg7-(vjK~(Ob9k+7xtLq&R?Qx3W3dekpT^#1xzvhJ~0j56RKMR z)icUrkEn<7oovKTviBH?X-r%Qt4ISV|53S{Ui9BrY96?s9`~oqsNt`W?Hp3wYb zC{PUyB)|oJ1pF<6#jp69UR&OB1_Eyj%W*8E*+`rLy(L>;6kIC)}FCGLaWF_T;atZ%O9N zaN883NfcOM{;?2stD@hn9C?qZty5^H#p`WCNeE0XEB+O35}C1*O`Q^hZafz9w8;A5 zT>Fn8G_JaJ4{0!0#vZ5Y=T-UmA9F*BEa}z?0oDrG+LI!ecj#qqCn&A5A@5W?K^KU` zEAR~aH`V4s6XElufASauXm97nJZIDYXqC9|4?D;T$Ebe`q~4^uKXN2SgArU4q<1?2 zEMbS;Wo8Y#6RqkmI7+v9q3nVau^e$Dq_-b)Rqy!!auhT?dd4O8Duq*Y zf*b!C6<6A0`a3ZC0V43Ben`7oQ&+s_N_=X3w5u$GMpT>eCz6a1aWVcwo-Q~CfI9Vd z6^}^}MCny`_TT_w-gJV}jlIT;A0`k|-+|>_^yhRjbp@9!hXW{{H(J-NI!?t)R+0jl z9quOy#{$n4}v13NN5N{Wfh)UVTgK{kMn`n}mA zoJB)=mgUuR;N$!G&h=`BRzz#e^Yge$H(Ljl)v*mNJ@l%?fv(oG)GFQ|feWPJ@YySq7c^K7p8s)lL(-hl3_&uEP86uU) ziQhuY?&)as!}p*AD7{m*sOcm4ccR5O!AjXkaM>KaQ|r>iiHphe03pGt2}s6e@FZN~ z{8#bj?QXBndS+!O4HZ~~bpHCL0feecqXmv!y@~f0+s^PZ_$xW$4!hqi9QS4-;&be= zHAr9r<~Muo617F=RVa<>K$UPnID1*FaxyTFX2aQAOEV*=()b+-b9g|7eox=HY z`B@)6gz&bv$K+HMjgX!Gd<7ODbVOt=OK@gpJLcoK8XU{sFPC-sa-Q-KR*eJw*%t-~ zVx}r%k$&2@7}8-_E2I!|+2|9EEvv6-*UV?`f2ZgQ-|k&T0t*-Psp8zPD>ofagwk``jK}sr zWi-9B1aFQA&QD1pgPBGbyS)4auFt5J>4#^p2Bbu1LwE(PxXKhGV<99s!}c9$c}7Y>(v-lZw z`D;iU`1&ho2lh2iWZ1z#i@FzV6s^xbVz+%+b6G6X$3bLIiSPKNUQf`FZ}If)hSULk zTsdy1`ahjaz4{vTMs0`3K4e*-R6jFwZD>Q$=PKiTrnz?+G#thmCQBD`4LBPhCUQy? z>UzCOqqLgoi1SK7#c*wDp=mT+J~-_q{DkQjp9@aYSaY#AbJKqd;14Z}u=L%S={D34 zqr?34xg9ZL#$=Cb`3E+ZwPT593-w0o!6B*bXO@70z*OIX>V4XTE_A)*AYMoK=OdXr}PXSzZuJvHee*3Ll8d=Wsq|tQzAk;uk#xJ`M zR{SP=FY+#X_3oxWW@E*%bg3T;k+B+m_V8>cE)i^+!ovl(_)vzHGeA;q$8iOUTX~ul zlSGnJ(#@HdYQ}wCFh#nEi{X{7+Oamgj0ZND1WtwlvpdY*62Ih;5(o*tATzQ)2n;}= zH&6Qb+#J``)U#vDBSvQeCf1XsF9WcG;hC0a0qepIUCt%JzgD=1C8#LJEalUbD z_`5bjBZM*Rbe->&!@4xU+14g<4#bG9JiQCxf;{|cvAKhF`2t3K_|5YJU-O!?P}6vx z#kt#?Z~5VXs=SlaVO+#yeL#8B>)CphZ)CK@t`nXKqQ8qMw{21ivtFo-MmG`v0B1ki ztULUcxp){w02r{$+#CRYP3?@YgvE<$gQOYOfA$?H*J^t`S5^>AB14bMAb(!xUsY2I z5ANR}#jW;08W+A~h(=p5A|mi&JqP4aHH70hygZ>5+Iy7qjB+;o@2R9X%VQbBE>5qTw;*>7WB>R>)`@h7I*!P?Uvpg!X zv~fHHjs4Q?3mm?c`^lXv!!URw(3p`#U%W?4Ybz4cE@F(Qk_jZVnUEfpY|=NqS|2~G zvNk!K9lhK&X}xj1KpYeK_QxL;Pd)fvRAF{gw*We-B$WgGsI#BYGw8U`6Tgob;OKI= z$MjcDZd*kPcMqCF4k9UAQ}AMxi{%LH79Q6PJXYKpa-x|0y^(j?Fq$YzeZ-iSn5s5P z^yLT~URZPL(%*Si;73kOWqq7MG4WjvAppc%)uv~Q0Z-rnDEPw0*N0X+0 z>mo}|SHQa=c_Qhn5(3B%6}jSMj+^LgzBC;}@@D&q6d3aS2vT(M=MnH<^wi-U*xJn( zHKDEmO%Ts(iY7gp&W)A{A*TbC58YQ|9Kuzxi4>#00M)1Km(F}O9s0pnER^dxCkyn8 zEsJ~UpKN?QNfos|P3n0?(dyHZD|ni|j4W9VRT^jxv9dMQ)w{%~)li8ezJUjJxV|%Kxrz)tSpm~>WKD+t%c=IMK0X{JfUX(J(`AY_00g3y`V zVPNqRi^-DPdU*XS|9*KDD!RGIf@q*rCM#X!`+_m&As(E=@i1IO+LGD8HdvZft|b>2UU&efT3!gLxY}A@7P_NR+|s&V7In8; z!fBXeS&!{(+@U~~gd6GY6_MePT4kA{`nYd(>CX9~sD={YGS_*-q=jU`LbF67OJX@& zKTc8{XT8$-!uZRPY`w(U*d6j6o&nXon7RpFd1x5Gp5jGeF^HCms^PWey+3;)^uQ5` zh5VZ1>VdiA38RfQNpO{uQ73ioX(TB&qMl!4Pi5;obLJlR`%X#ap;8;1%{#At6)vY- zuh5X;B#V1w%CMCQ3}kk{7v;2Cuy!gh_>ar|lhym;cu?CTgt!WS9T>eO!nSd&=swno%+=N!}US- zX~~nxYHM?I&A%J>zuyfzkDFG$woAA#PnW!B#Vq*b3tD7NHSFLEtk1K1cD1H2irX@f z3F&X~W{-zNc#Uvztag`K{=#)M#84^_X6f<6y}C`NFI+)OA$~vglJ0ywPRN?lKCsCI zHu9mvqxWbKk-XSDJ9y&rXdvG|5RtUz(U@J zdtRJE5SJaaqt+ioq8geIQx+)!e;~dWf?x`uPySX=LZtm%u$ypg#bF~Lc*{m-0`*(S zDpIas?DRQokY>ntaJTw1%l=Ye0_bqEx1jk_#vhoGlNQ4Tol-m)avC2KA{L>ZnBocf zm3PAcaS>D710CF}^DQwtb=plRZpx<18r@j`Q0$Tv)_dIlgW5A+N;R3kCd}PzPek^x zT^l>u^;?zfV@cdsQrlNa@i9EdgPI{)ts6F0MdYr_`G#K;PxT#A^tkLFH~JqvgO>!F zoA)iTIB!+L-_#+79-=B6g3*IbY)5;Gfx~ry-OMG>4MZ)T>__i!3oQr1) zHL8vD4HQyAoteoXjjhY-;^Ok-H>uo`p5L;KI-G@}#_OIGXJq0@y<@Yd%^B97NH1Ss z{qAbZ3-9rq#O&<7@T$z<%8Zt(jDb<`tWF2ZpABGWC?pfGF}~{q%pe=C)6)$j(Whkk z##s4uAcJYGIUU+b@X1&~+pc=^ExE9fk-d+Q@oz z*Pqtcghlkv8n4GYR_v;y7})0JmQUT;b?K0TQF-mxpsw~!27V|W8&Weo3ptXhN7LiQ zQl7rMo1G_us+o>QOw!L#?L4RO~lFAK30{UW`(m!PKV)ZBym(< zb-PPX*Ji&a?E-kQmUfP^$X&Ed`TbwYSrtolx6DWk%9kTcuilw@RgD8C7x?-D5pI{5FpL1aL)O=8P*q4G)hvB1fA%~|Y zbywdvt<*2gbs`YS<#9R-AaT67<6y3gdX3J2X|eOAMB70(`ZYaA{GGRYt@VI@a|;Mb zy#f8Si&v*GW0(bHR=Kb3yq0J*&e(vIZjer0~(e<1_Qy0Mx)_|*-8XI0yj z-F@3iEJ)J|_30*9u6Eckf$X(!kHC}lgBw={s0+pSg_nK@wRI@A>>69jMaYrIHakrD zX3o1LjCd8VC|3Sg{w#>5x^1rwOd?~~6SlV_T&MO&4$DpS+Wggk@)E&Bb4kPV{Lx*% zyY)6^fQ|~BvcxAN_Fqc!v_NLZn#-t|kFiJ@g%6pEcMFbB1pMp~?rKw;a_i0#>==82 zqg?9L*>|ttn|oNHbM)sXIw1!k{Y+%d3q1cNbU96-b#@!Y4Z1Y5)D7z*d_tCMc4mWX zCZ8KUjj7#Lb=11Ii&2cMg3sQjI}*aLMzlkqHA#3q;I|wJVsJ4l7kx;JX|WYrwNyWW zGJJ!=u~$Fhl6_tE=h3f}vp(PKFK_k&ElW{R1u9anrK(iMs}0q6r0BW=fAF6Qt>G-c z638?L6wQ2;?sSf&4oCi&$7V~(u+|rv^wCN%6Qj-;boTd_vAIkAJ|1DC*#;uw4+S*d=HC_*1QPpU@PNqAXB=Mi!X*t z&cuW+q;j@4r<|Mlc7Q}=6$(6w*9KE(J`86(L6^3l4@O>A^XujiA)Sl5p^8g4CsJmZ zMNHTXrU|H6Z7aFH>(;Pe-`IJyb?wD}DQ6gDs?wpw9&mXP#J&_Boa5Q08Kh&=mQo=z ze>~sGD&QeERaPEn{3Y?AP7AujS1rInR1I1aqCQv1;P14@W|fYzRSt!;qCxr$o;j?P!#`o_7K9$jE3wdLuxziWTOTGL>4 z6Rpvc_sB4@`VJ4?W`+!dDlgmJAd(37c-ff=CGh^aDRY1u1>Ji77fyyuvvhL)S`)Xg z=R!Y$u)G%+D|}D7WfY;}z7%2wAMh$|zWjWD#9o$rT<7vY<-BwIq#=K+71jB2qsd|S zxLlX&^h!%`$K}p5;yh}mUC<6Y;U1Z2!>o6i{5@i;E?BRR_Y)K}t9fR~?K>o*2Z9|x4{ z-<0HyGGMNb(&IjcDf%H5o{qP0ilH3ouD2a~WGE@~%57J4m^t*4RBW;Yae2O>@sD(V8Ym=Y?LBW0QDL5B!^rZqC$Cuguy((Nxc6J+{}`UJK= zlncFWdC(RG%}{YfWB7ItTp5?%-Hz8ZAQN*>m^WRDH?1m>Eh=_c@LXK6Adfs3z0Io6 zuUI=IgRWs+FUQ8LC5}a5aFrXDJa}w#@-=}h-|sYafuT~;t*yXUW>CX!{v6O@`b*cD zu+U^(^MlLw>5$G=$wj@3j^cM4@;6itp-Bb%yS3~QiYTxk1zI+a@coaA!}x2^7%KYo zJQvkyW{_YS(%#irc6P0Qac$PPjnbXchynfaOQ;HF@iM8M&7p$8}z!aE@^3GCk$d1BkJeh#BU&0-sSFoBws>VISFi!piH6_ z!}q0Z(lfdGa5ek}^+a2K7K73b#Gsvu$jAMhuU=9tZA@FEPg(sAcgGrG>qB+6y~jjx zNqc@%WfbFCJZiCxxN+g+t(F2>;HCuw3a82#|P~Sf!ZBJ#fMGozQ^9UrmnV} z0qI^cFrb~LN~Mg0K%-o>MvTFeqD{xg2?fm)PQMDpM=d1*tz3)o>KUK#D> zk#VTDmYaYwsdn8{rTiaoQ;^|;m}HaHb<|;4;*2s_|5F)+uk;ryitxk0&pvK{{X&wA zBdOz4ll9)mVSv-I&n|;r`X664t+MWg=@^>v-qB7K^&(<_Ovc-j47~Iu8dTLPZ)H*P z#cC|A3s>UMzn-JlXD$STk+@3G!U*IbGAOE8wpsx!+e0c{^#ne<67Qk=G&#s{n`sR? zPCah}_O|~OS0KI+BPHGVE!O6Jwc@=dKO?1!oB_LPg>w6iMx`6u8Q|;9<2arm0!s2{ z6hu?XFq|`DuEl%K4QEPX_hETywO=0kqEULM(uQ>iG+)N?rX2tNjbZYK;dYi2wAsGO z>x{sxk@9((KTio64$*_}#Ew-V7sySAs(mD~^b%hhO;~aHQEY&IZnJOL0n`jaqh_Yi z*;lm?uJUt}H~1P}Pjd{t%v_or`)Pn}OJbUM5dw&Z&}_iz7iSRltoH%3{b9V%X%{`f zYa~^4_lR-L7CHz%0NIRNFLF8_I5|G0J`MQb@wV5;V5}1m>#)pYGDlCm9Szj)jq^ed zIVyBix!Ouh&?vdryJ*ai1-UyX<{PXu@FY09BW$ekLCbpdTw65p&_LB$?;5TEV|STn z%0EywXD_P?>LlZ2Blg;oC~SSLHWjJq>J&7K;9}`GKIAr=&plWUc9a z-dC^N+SEye!XnBFLG*Fy%rtksy9vs7)Qvj0&uhQ%+4n>`Qd9w9_SF*^_J_u(!;=A? zVyGeiGl9%@N8Vht`D)=D*0$!*r29bQk61|2bWNqr-EzN;>T#DNP5Zw1EAp9~VZ)%f zV_Wg_&dIY>sT9PhMF(D~*A28b8*B)vH7)g&oEq+Dsb;UzlP)&QamVOY;6Xc5g_8?m z8qcAtZ~&9Q+Xf%1llQD>>k}*WZ2^-8%q`p3_h}2Ou13clp+E`PPWe1-whR#DYX2$ek+Z{aNeZF&stlm()A!AuWY4LN{0vlxz!Qvunv;4E zEG3{E!k+^AOexIw5o1tnNI8BGHp>8!(DOZYu56&8qAJTEDKZGSJSqDMaQw1pXY?+; zis>F>mcj6mn6ZR5USz`?_L4`j-)$the~mvcBw?J3l3#g^nGxGe2K@RnwbV}A-&UTSpPeBA8`trIn?}PC0ix_mH3A> zk<6NS#|;Lt+nn;=0Qd| zgwoOA%VE%k1@S)bHaNCu^5k2AA8W52y|!4=`0})wM?a|tYes3n_zDxnCnRsW;>E0L z(Fsha1P3?I$$DQ$bqk{4Q9sNkl}iMI55Z<=)n|1j9_0I=x%mU+s)Vu5zrG{ zT)754hj@8Y)Q4eiH9aVr!`qAtEveueqmS`!s~>AeWxgpX-|+5T4X+GxnAE%LyX3Di ze9}6qcEeE21g^o(7Wy6wt_mwmpB<2!iA*jg?)~svLXx{jTLu~eIk>d8w`qGAP$wiY z0NzdDSIL{@wonHbG)5p6#~OI0qQjxcng(8%Sd&i_wq$&JS0HBhd9E;CjxZT;wYAzO zM0joEd2s2uuf!E6&HK%BF_J2Ydq$w(@%sjz^N>aht>@SZJ#-Xzi|ZTaP+#(b>tpt) z9IRn6!c}#0P?(%kQt+2(p~(%mFrik=+*lYsgS6noIH=pxT8hWO=Cs z!}{|iSn^sn>=?0IiFc_tJ<;k2hu3SV=+Q-_@_z+N=v1<53nrRxE9 zKFyPT$ug%3Zb;9yvESgLM36Z7C%C5a8j8t!wtUv3Al=~=;IaIc9xYm_3*7ipDF(A} z%EotSFA48+`SFaY1&^^(ianqcq0qdhGOqW`9y?(+&pD5TI8R?EjM3%M=ZL5sw=Y(g zJJG4h3}VkBIiw=l{SIkl5KhKdNczldDRXMk`Hv@!W3o)O(ror9|Q% zj4cLv0M{tK%m%B_Nx_-Kt6+Um1p6lk0+S>5@Txg)EonvqBPaW0gDm{;LjKPj`20bq zUpG{fNaoF%<0>8&&#OL9#D}Z?OiYgb@5-nzs(MBB=d;}qD{zgqQz8Q#zaLvPqH4iH zz)2lkmcF~m&n?0Ju{BMmpU{<3h(S z0bQV>zfPb0*LVX*j=1k9(y+*~AUXFVl*iEyCXk2MEP(J>NSq%qzYX;WVK|e)U#X#P zdM3%><7c%0Ui}@ER=yugX)1GCoceTYB##iB$vJ<_MNWepK_u&6TTJkGsU;s13dqeD zu>?^k-bn~&0Uy%tTEQ+;9>pcpe_{gXPFrfHuRGf+^Mcd!=^o zv)-nSi%vUv!(xNG^1I^2qc7-{z7ncTFg3(9Da0cEb1GHw@`Kf1O-h$)Qk8w7?igve z%*dQ>OSWUJecK~Q8YPrM!?W10vM)eDFhvuYP*sz@LmmaAjivBubnq*Hp>>|a_$3RM zHxosZuks@0a^FZesol%9dQe0f*to^ply=>Y+zH?Fv;I8^^ftNRJFx*eF(EH!C-{SI zTroNZ|8i;<$Y9aT&%UPKV?8Hkp4h(qSV+IJwbR9~APmRsa$X-h8S`2ZLuR=OyAQ}H zROfoRS$#iMJuyqztw6tpFV+09}hG) zrtgw#LKw23{UDq;PxI9?uP&AOA+!fX`aop(+@D}(6&2Yw@&ur^jK{e6)xAS~K&90% z*8n+?9suihYnZ2BTKR0(YMFW+>Tu$6jchRU{Yn0UAI)j}=3I=qJ4r9eDYkN7lzO7m z#l-)2QE-0=S$h$UD#0_$Yh!t|m3yvL$FgsHDe^EP7Jv9_> zGo{P#uOFksKN&@CIZvaA%kHH#97g0hPGM%t(Ce_4`8oN^uS$6i(~We3s0Nz51PM1oZJh@!6W^u0cw35El&zm5G^}mOozLJtb26r zH<~^_>5ua zVOZ;D@BPf$Sk{stei$?6WmYT&Aw&Q7V^SG6nIb7xNPK0b$x6xE(}^G{@yxeB;cTYE zrS-kiay7Dd-p)-tIftn6(IWx<17T`82h1hV6Qz-~j9!cabVL(+w;c{RI+@KLkWg-U z3w(sZpQ8e6nmFxF&<)*%O!o?Wv-5aTA|T(c2WnUay|{oCMA~vQ@8xroI0y&6#xEY) zbiO`h78nTRMvT|6uu!~cS#jb9Za2{zNBc>a=|*J zI0fiLO^|SD>y9+j>clo+5qa%N^J{W}9Gj3Hs$n{!ODyC(cF!7j; zfYELr?ENePx3Ut*I+W`6=hoj5FtW~7I`w;cpjhsId`(qFeSPdW;S`!gqb;ZKeR6`1 zk@~)abd`b51>29ZlR!IwvQbGg-e{=OZfQh#(R zj}g&9C)e593*qgvR#a8nQj;V`=7EdbzLSVEe#xp!1Jtx6`ycDnXB4enkl&zRp7x_6zZG!%nojcA_f4=fVywj5tcKtGej8#Ou{>dbdHKM_Q@@Rd zLtep|vp#BCHku>`RlnmVQCkH_bJ{ivkpglLdGW>ra*%Y!8HZHQOe~b<{PDV|g!b7V zoBPzocrboWc8XSaalnMg^wZQ=+kEqAwKHPvv!%eUXa(8{j2mW}I!AmCCXNb_c4@1u z-2`;E9}l@>;xV++BQh$Vr7K_5d#{9T>Q+pc=chkLVjSkl$sAqIy?Giw{3l*+iG&|} zw<%LVqpkFAMiiYchLxkZXn!Z2!y|gh_KGJLJtgt~l}(Rk1fS;}Q(%l>WEa$X@MTlc z?TYD_i!9^&Qo>7qiRjpX9#Z`jMTxBgQVzZOeJ976rRA~UB$wB=K@;Tfw9Hg+fDZj& z4Z%5;C3(&dq}@}pN;+h^k4*5NzSF9G@g@@dX_vy!q$$R)X&WfVV8lj3y#ZaDr&Z#J z#zCv=C+lp-BV-v(q^(k(RCj+=+%3#=Y}(ga;1#E6dd36UAL@^#rw-67e&-XHDC+FW zzcQWx+i@x!tH`e#xUcrgj7=mGjO@6)=bDOC_kG@&=asNmf&{;Us!e#|D)Z!Ahdy^? zQTAn>5Kq3am;{CuYkvl1{CKlKb|3xD-&x7bzUAa_ke@7NkrK6D!aAX`S@5zclY1Lt48R`qYzRJ*To(t$r6Y zmnP%4novJYeDuf^bU;eUSJ+&7=G;I;L(mVKQVTF_E~GU++8nJPeaC%5^SZ)xqPgF# zhcvZca7O1;fBe@ga6QrzHp7&?t5n=QSs)#>Oc}&ggs(s4qk;6I@-y}5mu|iT-uuP# zhPTVwW^O`eJ(7dFdi#~`zV~FPwwWAyP6b>ic5mKFzo{T+`3-{^^Kq?1PJx#~Y}?|7 z86@Hg^nCPm&CQUuO{z*nX5#Ek8&0I!LOZn#-<;;5$&x}ObsXC7;^k4Yl&gM)N3xVdRL}iY zgiibu4m46)sHqD-{ZLS%ptjE-nT50Y?K$kxvMGoOwLe^3=g)KL#Wpl8-HdPRX&1dZ zKwVnVJev~jntPo@lD6jBRcop>EAB;vRW9A z>?2Cvi<=1yrXU}I&g9thlYiIc?x)kpA>x9@ATL{zujOEu`4)YDe83g1$KE;^w@g8q zp&Q@#;hJ)Awcs>~pqg_yBqMi8;;EY!*spSZqR?(4p=X%(|{PXYoP;Pqp<(T6iaZ<^nf= zZffD_a!%}yvB8*k_(O=-X~Xv+5A6!7GJT40;TH@&lBC05z0ZI3YQ(22`l`ErvCx&X zG((LO-RF{XVy^k*`xKD5V*jG4cz7j)tv~uh4LSpoWjDqib+qX(3 zXP1d$5mYZ_c%5 zt2R6&UP~LiXlm9nmn(=4SF#X&Gw@>yu$sI#>qeghZ{CX|J8d&SFlzZD&J9G%JoCJ) zA?yT}QDA78McE;1SujlcLzuAhFC7X8TcMdi`DW18=R|8}7&R9B4eNlk_zh*9uSOSv{=D_OhhQ;zORCY2qS>~D z!)&_`5y{i%J|-a3bFXd9o3yn6qoWNf7W~bQ*RAuds&5e6k*kJKr#CfG&WX;1@a}f6 zS*Fcr{So__=DpnSoSsXuhO`A`?$FRgWSF-_vMx@4KD8_?-c4h5Vm}itqoh*+=gsXc zT^)_{igz80NQWQ+>u35PV;g+x&ccb8+i|geZ=yz=iX@F1dCG(OgxiBzKpi9a93^5#!uJd-Q zZs)B5G(jFIzJmz$x+GRPReRY$5>AIc+ld(R36x1Y4HNn&eo6LWJ?Gk{`qc0!~l+dQwA-UC#H<=6@A!5oA~u4lf*tmOfT;0urCSI^3pd{ndx9 z9Q;Dl!y>`d&D=@`2M}(R=#=u7_XW9UaOVD8p7Z%?+#`~3Mlyto+)vQxeMM(x&cn7s zF7aODPC4Z%`8@pOZ>*e=az&B!4u#v$;|rNnNIONC^0$$s)V7erlAWc-<#1l?IahFv(k!Vib)n))a)#|pnfxJBl_DOoF0jekhlH`^bS{r8 zaPY$9^r-^e6izirMeoVK9zNG}?&IIB6{{Pq-aB0L!9#}xXI%8v@KK`N3?X7E4kTg) z-t2*>+!!CX(I#6$_HQ9pp`||u1;(Zp>CMp4QAG=gtsE5eW#*$8gHT*;h*w!4TS`%L z^_%>YfX=qhZ6Hv#30W35b?SF9wwz5u{5_!_YNDrbyl;Lc?MsVYUsw{NLI)%hzHME9 zj2N`b70{WrPodV1EncW_0*p$_cK*7_!Cd2i(rar>pz`)rNUKgt@bPiUYHz*V_~FVP zt2}#(EIAqBlvo8}%6oYr$+V~`HH|Jb3(1 zQ)AKf@D()b=C=Vd9Zvth_UAF}L%L2B(mmyyGh;X@B2(~vF(I@fc;@UJvEL%cSb@6q z$uqd6|Jfb?Vtw*7`7Tse*N)_4KNDVD`xY-@;*Ry=fgfdD{W$8958SAyZAvO>{b~jo2V!F#MD_nvHFX8(~V4%}4ZO7k+aTKj7kCI^BO9_}4 za*>dOpH4-YkTQ{3IbM81GT^lHW5n7!#D_a`;)m}$+8J@G(-BIs(iZPPyQrL71XgIN zP~}}l?^BkMq$nP7;q5R)s%$~~P9kWQEKFe?^E96VMnpob%t^vj1i`gak05y5ZV43K zGx^&E$J(8{9@q);@Zm6AE3-XepDY%4kqsInTm3fB(T~A`HgKNf-$w5nrzbo08P>Ct)|KX}-cKc#bGo%(P9YZL)hNlo~&0Ftsz}aG>hw5<`YYU67o+ z#Dojy*>0NPLwQ-EZET~eEpEb17qUuLm))W-_bKdgeZoZ~skrwNuCH)>cjZ|(@G3zq zHd9Oayu`Qn==J!EL>Vc!*beIytrTxht`U2^9c!+3Kbm^xsXp2dz zA1TkTQzXprlI3Q%1z=SjUr>?MvZ=yf$59@+zrurzPha|J)8yM;UuE9>^8X{FKbJZt zfd?BN#U&ACvf;YV%xEct_z*c^cQgTpOZ%~weMht;Mw5MpSh}GdwVVhe^7rIjq$x! z7$#g!`_9i(CkQnC&nmd8EXrr>!W3mh=jgquJV!)V5d?{1s&NI$N+zp;)azvhWf&7R`EdCYD*uSS z64o%c|2T2g>?U2ONfaFJD{_B0T;$3m-Z%0n1Fenn#QWoK{KI%f?A4pO_vpUX^G}+d zm|(!X_B(Q`csclo=DNI#+EGDK)>DGbgA*F<+7#T(TIN=^4)tL7nxtleX74AIw2hf` zrCjc5f_F52d`_(049vq($#ZUX&UAOQbn>Kp7Y%$#^%5+~hO4RlQngB_IjKZ!+s-v{ z@Mel-eRXi8Ht05@7|U=tx?D!tFmQ(0W8y?QH7Ky*DJ#WT3dQ_J(zJXCWuWqETnPp` zhDPZU`l{dn`cG($Pr1*9Zw@>?zOA1B6Iu}(viD_;MwE*C%TLe+U5v{HfrSd?76$Iq zb`pGk38zWGc+Hh?lwKrTXz^*X-xyVvt;MGrzg{$N6991;-o(C+O|3RQw?7{{oVZ01 zi_GKNFShm;HAI|-k!8CE(pl*6OUp!3Z&4=YES-j4U9muB*9z0;SMetwB<1rn&XI^q zP8jm>K8-JPU|>5DKSV6ZXPadTMm+ z+1Qm+45Y*b2ef;ICjAyRiLkn+dD#pYY5B={j@V4?x8IjCy{%t_!2~(;0-gI}^eFj&Rfd^~0w)>)VV3k$maVL!$Xc>Tg8MHn>D& z)und*M0+@kJ5loKAv;h0&N>#aoCF3{d~c)gf52j$!2g7AoSxoxmD?0UK_~f-aT(`K z0hxK$TZ)XJ^Fwspsm!(@;Pfw`6$?vK>0W_<=ca#MCRbqfQ+`fQXxR3h+EE$9}k ziS-9Ry{`M2IQ;UXh0|@N`bC`4qopS~zh2vFhy4SPw_&iOIn4S69C3C<7_A+Xc-!oS zys|g_Dc49zNr76HjQ_CAST-z`QmumIG;Gz|+EsW+@_No&jRtFonY07)7D)qiCxr=P z|LaRhcOROje@0>PJ5*HU->7*h7m)r-3XLPrxnvAEU05jz8gEB$(-dTLF4KCZHB{|e zxrO)08WWO%NojLlTl0|tEAfYbwx*WVm~R#TIN?tY2Q2fGk3j%!aV(aLk(tSAm-Ja| zw_T?xWeZ_UQnlO&i1#}ToOd+c8hT4HFPb$^85Q>U`jR8=t=4PjN_j)he|1I#B*a`B zIsr-;jDO_gTTz+MJF-h?t6~4Y3F$!0mL4rFElM*&x=|6Pbf|k5}W*-;F|<)KXmK4NpB)1-z1s;y z27WiTQU2+ynBcWjHzhkGBST|vLrgbJ#K4zjkg1PW=&m#I3rbVuz1PHya`eBe9@JUJ zuidB*QRzI7t^rdVNIRzo^Dbu)9L2fh`QNEL_Q#7c@>5mGeDW*fzg~jghalE7yvzcc z^|FnP*8Pv^^T$+sQPI(n75x?En|>W&Mq!q?-Zo)b3^q74=d)5*S65iL!a|wg{gHj? zT?GrC2dkUw3-jI10a{n>UY$69x`SJA0er!QI82!!*2d<^tL+y&;`bxA72HU*bPuJ zIyNNip8IANeSkyHmTM({=Wa#_mU^^Xm|cf%Y<3uA!Eibhvw&;K`c9OuDicY8eA5c7aL&U z@2+Wl&kN6y3EUAWoy^TDSo=d_Trt8=LVUJQ)p0}Cu52eHBrpsx^ETh)+VMVQ`xHQT zJ;_VV+1M=tl8Zdv(f2o5>1ypBR=8!YDExz$%;7h@{#8Jn98<-nL^J)o zk*JjGna~0(?YbEr4T=s;ruMepcXv)lFZf^OYj;1t6K-E-!ua=$C*W%k@qE5yrWr6H z*{9icsSkrgm9DGb0^pi6MvN3h;pP82J3JB@ND26H2XNo&*55YIBG%3?4Fi5)p0(n3 z{-5&JuA}m5Z$0$7$6Lxy#=DIt-LLlk5g%{g0-Z&U=DubHJdYD-#|&wg`-^{_k`MD153ipYRUh2$GJPk)`NG5g(289gawV{Qcp3F?+g0vMyEQwIfbcbnex)qeX8ZQy z&xEQCi$g;V`UO}!0sW60^lsq$KUg@+u9fE|iuem}jI|Y-U-$crsJV8zeR{d+H z+Xa28c9^1_Fh70nW@9#Tx@z$9CfEVC)X}&ZcfFjKmE1&>m2FQMjdw5Q3OnkBNn)hU zf^9BeU+!i-M@#!(9nGiYLJ!uicQIvgM~9Vb%L--7R_%bz+HkhV&&T#tn4UO>v^2{A zHRu&~cYsVsn#rwwFXE-6U*OReA^tt1!?u-;h3dZN$CfVKZ1~lT`19gD4b20>R|i@j zm(^s_6Wp#YLX($-tMC1Vd;Rkr<>R@)YU0@Gyl%{0BA8!)kb?)H7^oLIjtk@kqlOxH^KNDe6DE&I#>B8dLM5w z(?M5}M6ATIv#n1})D^(n5Qg{!w6P6v)$p28JjeQ3h~p?VK#-WYIQ>uc&jvdipE1l{ zc6?+=1y|Ko;=j9XZ6U&2TUU)A@Q9%aGo2tGlnOMB`5!0E=3NX3c|0S0c@ZulZzD%g<$Y2b1 z{6VA)sadYAee|oy2In;Ci{D)>6Dp>79x!DpBp#8=J%k~C;x2{OGyV7#kr%S6XHi}3 zhou>X^nCI%WrFbO0!9FLLSk8g-@0kKX)(yGbtENj>*Dn_I)|#DXB)GaRyP@AKd@ye z);lnxJsxmR_7Ahl+fQn}^)ek<*@tD5I`BA~Xt#-BTgN*i$KOX1#%5B{(2L@$@&jta zrU&77`N4|ZKuuHQn3 zWqY_1O~g9CnP`PP>k*p0ien{ooPN%Kzpn~vm8R{oefdnpi_g$I*?>7b;Dr{oJ?PDA z7vp#2MG?s#(|WUy!wIjEAy7y2lFj!wNkUM@uLNf8@b5gIbv< zrZvfF*@Wu~6$@%4UZ_XZO}K=z%IwyTT>%=sa<9caUU^^U{rLL*b;TJdr=rDLBprJZ zQuoo2m(hNpXLVgmy)pm%B}Z-BZqn*LTSf(xEqg=2@c>9gTc`+j$SBoOq5wQBQYa8a z`!AQpZlS*!GH3km6M@MJ+KH|P=)5UMS@!KFlneelq^0r=VG8evnpIBp0>85p3@wkOVtK)=h#)z*hExx zPXPAzGN!>2l}))sk)4|E$@k5o%Hn1N+R_1`_h;6&lJa(B zuF2>wRMCRx=yp}SoSb8oQnJ=U8aL0b(&;)<2YreZC-NJhTU$_-v#7O< zZ}!s>vH>qhi?{P4B(pjFg5Lm=opR`m>_o?9b^XPw*ooF$!E~f%_Y{mjEmM-QXB_yD zhA8+PS@4fxo*?D+aq=3NSbjXqv7*p{w>i-S#qc3JLPKk319u^{mNJ-eeXTf5tkli} zAn=SH(7|zd@CUdGN@Wukb@p!(p}&lVB3Tbb1mSqSae?+(SAM!5y_`mD_mdI`Y*o?R z=p${>ykP^c1i`a7V(*L5%Ji{DEr`cuY=}hQ=3C(IPRe#x?9@vqU>RqDzO6s@g^4B2 zcB(0aF{c=k9z^IQno&Vp7aXO~Mr_PLF`ceqzLF$Et>SC3_)OESi!SrZqIs!qe`h>u zKkD^-5`_Kvw1K2ymGq{@{*QN|{4_B>^Brd!U6P>glnYwJD)uBAErN_tt9TW6^1Z|tT(bAsWLJmdE{osk!FHc8!7KN- z%#Qm%^_#&F-esRBkC`Mw&oTRpQgQt%zcWUHe%?_{v+zN-r%gOS|2bP!8BmW#u60!& zTdmuGFpIU`*d2`}PIkdhQS)~b+P@j$w?wN5yfL~`b%|otDNkH$VuSf8K)&F4Uu?Xmb)r28ruIwCw}n0Jvjl(I*5`P$ zBK7^NE8uhJ0sKp}b_aWyjJ+B;VatLCKQ~dqBFjj)hIQ>H71d%+fTZmhTW!Ibg1`5c zqlDWGvCrT_c=3h4zxQFaZGM2kBoA@4*GZxgZNuip!AKJVX3f}y^2w^yyxx3KP3$+p zs4Q9AgG``9^5;fubUu^K5L5J222!MCZ%7d}-k^NeZ^pV_u5Jxfx6C@Zhu-BL=xE-0 z)v_>~y-1%^*I1$3u~5BmJ4(fLbVgZ)MQhO2;r{?bdEzXy{S%#eAq7 zmz+$kS^$xvn!~b4k4ouAf!~R#*TEaU#Fi^6;CX$!-xiaE@1|U1T=OsQzV2cy^aA62 zr8ilyS=|w$3vm>TxDT2in4&Jo#n#bd>FW23`&8|?$;RvKO9e-(ehw8q zPLmmc2A=~Bbz5s4aN1$xJ^<8;-V>=*k_+&d&Dh^kvz*efjb%A77z%q=2~}_tSh?(9x9ZnEv*rzc+kz1DALKI)(K{m6)3w| z3uH^AB6ajMRJJVmuTkQ1`h;sgCO3HY0{|8C8=%M}4jgixHPV{|GwCvsq`iOY<#8jW zE!Kocp0O*8Z2#Q&GCR4AUH^tIL;}!%FEx>|)Q)r@T%K#1eG&6iscgU`t6FgL+!k{3 z8zd)PzNX93H7Wu)>!gB?)@$1X+YW}Mu5T2)vt=ZIm?lP{pvbA9x!=KvLa$7ci!eRk z`lT2^ojc)>>0Fm8UvMMs@aGRP=h@v*X3s6dq9H&rRNJ_P=kWkW3yl6 zN>TR`G=GceZzq0o@)a7(bW;Ee-{DvpGj3;u8aw_+S;!r`_>D6-LKjVBuLy%vC%+d)kauG?kHKp zuK-yzY&{l*2~?tEKGq3TRzHu_;Rl^HFsokCC6a>FNw>@gXsfGb)6?Z0hJOFz?YNsv zG?d*G%Fy}su;rev=`A|qr92?Bs?PoX*K#f9A(uNOfi2(n!JiveWF*e(S!(UqbWeY< z5iDPw!*&ehSSiv({ohQn!PCR}CN$gVf6An8-FNlQy1-w(X-{mT=WZ-*PAiqwTtI>0^`IZz^A3iDI!ys zWjnhlP-Dh7N7a$$SsygnzLgc0?er*$YT#?BrT?yb+y!bu7<_(OcF`{ZS{|e;@K^^} z%|2`MztcF1S@HQVagB|_07}^AB!5ABd*Z1PPw!;T0l2(IjT=K~;#S`SQ*f{XS8RvuPG* ziS@?X8}^M&sZbw;g|Ed}>)`>a^e|9?p&Cjx`+B0M#bBfo8se(ba_G4c5RGE;uBz)VN2T$(hb=j zTq~@Wo-hvwFC@6}o84uj*F`wAyTo2?3>(|573uo_-mQxNq)z@`%P4YxS!Y;G{K;#6 zF(=pj#LRF$O|74lhV-A(egKXV5Ziff=TF%v0DCP`0dkz6o>0!sn4NgOUnhR z!kX-{L|a$}gp~gyJo~B3Xyt^q!IJg4of*xL2le;>NZ7f7+fb0W; zQLy&&oi=;o$6iu}2l#;2v5@)T;~^r0Sr<;H zDp?)$@z*@p)48d3i2!B}C^B>wB6s z$i$yTcE!x8@CDN2H>wvGms>>yG!0B@75Bf~6+_O-yi~{yL2vFPUG8WJjm~h~l97R< zCfM*Rf2m=VJcg<*bXdi2S5cC$$aP%aI5i%*AUh@PXg1f@#3%>H&+0{;Gf&)$S)D0e zset}>8Wxq4TBRULQj>pfQB76Y^wj1(c(KA#RX4O?yaFgc&fB&Vz=SXAxl1%8ldM@^ z->{ZuBhza{i$lCZAXV^DU2Y2Q4$5Ux|J_H*OLcp%hr#Xfh7CISVzLQ3VIU79LHS?p z_;&F4&c0EdkX<4(my2S2(yG2^jZ&HT} ziJnu%(hdI5OfY=RNYUSkbfP`wps>-Ud`z zad_XUb*#|pA#%ah_2Wm96<8PV@d|v0D%Vn5pjs->B;ee%;me3}IsJ2-iN|e5YRcry zHXEn4t!vjA87^->ZCg`KYv(3`>?l}j1iLZ>{r+w;VbfYS?*y_EC`Xt$$Bc<`j;@Kj zKzpXOZ4Hdd5noZqr+RYLrf-r_mSVs93Uc3V*&E7rZO?XuADWq!?t-?&Fb6rPxuD&v z?g%3szYZvy;ekV=HW={gI(*@#*j2PmXvxGbGnOt>HOhcK_5T@D!ZA+?~QJt*3-uC-fBf=F#;z@=dPlQt?f+`>9*&ppgwPA2&DbEqyM}DjXA_3hmUcV^Ka@f>@1K$ zedSUxor)6eHn9awnv1>6ab7#Fwlq2}-mjlNhJE95%VId6>aiO-fxs&IiNHIZjVcYg z=HcY*hJY9%Fbv(Kb)p{w%3&*1goSoJ?IFx^lafRuH*((-+O%q>kLz!wYPEV{)UAx; zB<65t4|=lSUK%aWQxmNch0kL9ChTR&@B#1KNV{5T;6~Bq@r&xLW+~(#b-U9_NJsp8 zD~%oB2MilnPO7s^?l@`?>=jS^dj}XE*T-rqV$Z0u`1-FtZg0vfywAcD5cb`~w_w@G z6>hijOJ=kHAvPZ_$S5!lJ1>NokmQiBs~G0Y&FXueuV_rK?dS;omc`lFGbWUGY7z%g5TpFKUB1T>v)y@2)l(Qkm z6J3}#Y+5YwtXzFhC-iL01Rm8^w655=V&)`*dvq!)I)NV1Yxaxq&W$Cryyq^qLBi1tSSFwF#dukV_{ zb|b?$=1D9x`0Z13;9@4EUaDNxRtX^=y?YD;@mlC*H5$murRI@z?!=(|hyt5kXR&uV zZXmukI@CM2Vu`P=JT&q3WYo)!O|Y6IssMCwPPKh>PIU^OV}Mll9jk2-_emE=QNw9d z+RlRNp`g%--YisAHj@<+0Si|>fW)3%*oS=sD$l-JA@0j`F0nnTRzQ#Z49bn#@)Wi5 zTeg$c7(+NhcL|J@Qyb%-6=xrJTs|1Mr%Q-)OMY|8KVSCmknz51n{exJ3pvPY+4MgA zKq8#woclafV8hlFmBw)Ki=gFLnI~qyUdjv;(8zrY%FTx39}xhr9~D} z8*+uOwrl8w7VkY;{M}2RIaa9PrvJ!>C)Qj5Y!i&LjL57C20WjZminm33d!E-jIW^b zpOA5ERV+^7rDk_z+2}T6xAlz>{p8vt@+7dO9m?z2TDRfDi@LA1JxccjcqWVRF@?GK zNLKK)k!{c`O6_;XYQL}cxh2+ADT2NCT_L9+sW1t_evU}=nY%(Fbej;`OAf)iwu-2g zyX>`bj#bBMVz<>npaao`;T-Y#-wj*GiX6LFTbmN|$BL=YtC?)PXI30^dTA(n$X|5A zxj#5kOb;6JL7fr&Z8|0A5$JhoSEJV`V<2Y6xoW=Czk^NG-E?aZzWKfEete{*o84*y zvI_w(E@xMglni`|kcel3;(ORiOB#F%9L-v(hD1zmJtSckesiWNGP)UqjuN>-> z?$kbzK4E_9vPrKbko|5X^=r`H15p}kLrp($7vjAGgbr>L^}fI%LTtOvhSIYc;;Yi= znyF4~T|U$G&4?*wJ6JQKN^Q=)u{AjgyXP*eX7|#QxVcTk%ti**(dyh0f9f+XQaWtJ z?ycb4UT5_nJKA|dAYqG2$MUqWKq}1jVQJ`$ZRTjw@aWo3s`{@D9=VVT;U#VsLs zn{(71v!&fk3zLH@O|eh=3lJ`btJxd^Z_Njv<6P!%3sa3T1*S0uquBYjomL*-eEOat z({kY=bpCm`=TK&ONA=~_$R+P_d&}i7ReU%%aePoU2jM3hBlqM=bti-MXsr$wx47Lj zU-rScol;-hd?CA=g^W!^YFT=@n-G3+$}4r*u>+aY7ss9+)`%Mt<$eY}%_22lab_&#^DaIVAklb!EmZzgnEq&+48P-CY< zQFTMc7Vd(4D=~R}V=p=yG0^}X zXGrbPpE-Vugn{$$-2o$ck0Y_QK>GcVAL~bw35d@@Ez8(&SD9dj8+dOUstuKO%kRu= zU=UVrfd&dvrVUH!o3iU}6WUjgI_N9=O{S!!I$nq@nLbhx&JMSH&EELaQGlO0($045 z@n}7_eUTVb%5<`eqy_&`y0bEcEX-B`xe+&D*qz(QCB(k+<&{FNUi*;4qpZ1DRIGN# z>iOaXrnv>`wyUd$T<&gqtTW4=Gu&@io{*0m+gNSIypK?Y-p1F_Mpys1@%+JjE@O_1 z_AORo(9gvX&6u_CsA{dkO0nPuAcY=EMzQuXzrcEMZc0XVJ57CukL)@F2sv|4l{o*5*^Is~l+!-5cWb+nZQ* zkeI)4nJv%9S*x!iC*BC}6wd=pWTpVGWh74J3k+=m8QSG4-ekqYtI1rKb@91lsd{xc z9TBRJ29Thv`iD7Zxgc007Zy{|*~#;EgF2~d?{cAM>fF(p@0s~hi88}jzMANepEyJ( z-c~zeeshu>Z6KVd&1p}my1c)515H@2N35QCPpy=CK7KBi@LhZUkz`qv@#wE!;22`; zU5h{2?9|STt^*kg=+IQKkN~M7PVh<T!4PDXs8K;{@o=gYVH<1CO{)TuH4~ucx#SZ(?eK$ zh=SSHchw7|J3voWkVNN<_#*E15#|(MiI)fTbmTP_~^C5x(iN}SF z3pf*y_qW#dv9M&DG}k^l?ozM`gEojnli}e3@1LD(hke=FB}W}k{KqDF4x|_V`h3oN ztpIU8jet%H-G#f@+w*D{TGK6GvO{tgKLg@6@GG2cUZXRTM2+W@K|!8lo>Vlb09{i*D%w-k9aHBb0M6g` z9e+y4*HFXR@C;Nw!tX}l|I2sVhf%N zlJR^|ZVYsZ{q#oD@34{B!^xUOI+Jifh|VYLnVKT_DL@GHigc-vT700YD6W{qx%;U> zBxT^aUSg)JXf%x@fwELRU#nG>uWr0ZSEDtoVil>Y3}4;PcsTVFnP<^i<20gk92yzX z?P7kGH_6E5_LEubt1%fB{R+NWX7pxS(#|9MwD!069ePYl75Yeg$MJ;eUfC(;0e>Z5 zGUZJupf~N#85+hmfsmt7oYnj(5_&r1)(9kaKi_T|kw^lz8dnYfs_fW=H?15Md$IN_ zQ(3Tf90zuY+v9-^cO~n5%Uv3rnj!yH_A>zuC75i*<4hlsVlqX&hMcKe?GWAAcoE>& zzH}1{!lFW{tu*0#1xMeFG;0bFTz>D!A+5=pkMzI3)6wmJcj{Kj4JEX>U^K12N}%gB zs?mxC3b6jy^s!ACrbbt0*J#C;9^XG3W?B-(;VsoZbo;gUr}8Ls&)+pLQm$xfF8ntS zY_eWuUAb)|ok2CoO+Q^WLz&N?0vVO#grn`{Ax0C6d0Ar41xciVp zcetv*@GG6z~w>Q~21m%#EeW)l@ylE}!PjV>McJEf> zS;-S=zJMI}dTV&6&tW;Hdo1+J*p0+t)<#pB8+NzAUS#WDcay1>*Vj1dQvX;wbm;9H7pt=w zInOTD)~q zv#d4=u$i4_+>3ANy#)RlhG^p)_DF2)NHt9sh09esJ+rvd(-_X#G=w2?!>|Le4aBJ^i?@ekB`35sIGV-R*RuNMNNKogzF<{V`4*JtEm8y zQAL;3pe|SQC&FPY5zzs*IFldQ5ow@~Ohn0>?>vsGwThkYbrBV}87SJmk2c9lbt?Ln z@=JlSCzxv8o`ddv1NHGGF3N?qXAGeR(m}e^CkD^0au-_i?b~VN+zc;bysVC^+IE~y z+cXuyJq)2iu%wP<*v$CbvWeYSC{p-uqM<(r&%GY4&q4_s{^X6Q1J1iyS}3m!Oj?xqluvBsQ3!~l{z$H)>)!s%!cn?LwGMWL=BBlCI|scip7oqoOkBOBdvNLHxW zHUjSxlaRB{k@q0UnyCwXLjEjgY(zWYq$tF`{%mVmba6POs^Mli9def-c(?i}L=PFy zbN&ct!ZAuhScO7XDx70UJjc}Y3Lg>Yb*$AFew?!_my30-DO~tZ5n*SRazjt_k@)xC zXhLnLIy;MdwK4VGLyeRoWpRnmxLW7-GFTd^U^DVfgt6+d#Z7D7B8W%9L$xqg9n!$< zeECE(5l#48NA|5)8n-Ov{#8qrs5^j(r_X9B0IM~w_S#VqGg^~MM+}H_181U;S+uEO zlE^Uq#vC7ZC3}d%xNp#ff-F)C7Z&NAO%j|{L6_2??t7<>VYu7qrmcOp6UO-D&$X;> z66G<#S4+DO{gPTv>sh*v9k^8fGA65;xwARG<_Z%4R#a@c^ASI$q=EAn1HTmqTVV%|`BPqjG+r|e`B)(5cGrvNJLEIc6}X3rRfz4!q5>M3X7&*}cgb7ejn z6CYFz1&I7bwn{%n0ATKooPdo6ro;$kvN!QIU918m37WkkY$!Dck=Jeo<0Z00QExB_ z3>e4Av<^8Z=7KLR8=Me>P2Fz8Pz1WR^0>X|7iUK05bdx-b1KmnFO;A6_Q-GwU2G!C zdP~WtB+7|meA!TFojf+%=&=JeG+wD4sdCm&?Dw!Tj%prR02#O!$B^3hfTS2Afw8MHBO)!Er3kLl%laNxkxww z^Lc3q8%M3!oXE#nSH*2cGz{y?jHpBuig%`WAK8Y7Ua5fc%5S5Ho`yLCP{%Z+kH z)p73HZ>D*M>woNspM|R>T6OX}g1vHaR(IK}i-W$81Ts~5372+bay1Qg422yTUYr(E z!WdT@9G~e4e-C62EY19ATkF_t%2~RRUzF!8&n;Lcj<4bRaY~Bpd?n`bh!LHmgAGsk zVwY2p`8kVYI1D^bXUN7TlbHWN4WW}^`;#YYw1nqztKB($O9XPSMzl%Vvz}SC$ZOps z>dv&h@|k*Z=I`}H8=pp25$CcBA$fhl%-gE2>2rJi<+YP&lGk&wrW{&hUIgj_x!CvV zZXD{q26Z=*&V@4FR3#u<7WEai6WaN6ARwS9&ZVlSxM`l7&#LsBLT=U;Rq5Q?X(xd( zduCB}cR=aKUTE$pMgs?K#1PxH#}A!4Wg~b&~A{^GO4A4vjNw)opOn7*})6Xqx zA;$~}*Vp3oG$(?yEIK|S%gvCaPhW!4BP6zyyc12S*w?g-dX_8q5Mc9JzL|j5L2iN8 zcx))Sn*UL{TWlbE&Yp{?u9m&NXOt0%KU7AifMevg%qs!9Dd$#e=N#90+E_z{)1A$w z(i)!VTX~$E@Xf;%oiyC`*xH@~Jy2O=C*_o_NMFl$?PQ+^cDxCx;lIg>iE#_++Id^- z>mbSsbE2vohh;xSJ<$xUvCv;L8k5@~@syI%l@#@DeBYa*xZ#7j#|t?K#@YO)=eUtB z8`vx!Mp!(r8Kj`t+pP6I6JYWq0h4Z_Grd#1v;byM)ilpCJb#lyR=usaoU4 z`hdCV(j= zt=3(3T+EjVlSImL_!a#mnOm*g&ZO7 zHxwJWJF)m3WH_T4+8c-CfX5J^4+qSpDf=g^6*A-6<}y66u5Do{IIcayfjZSR7H@f+ zH=Pk1^wkU0FmaG1ZX>9%TOcdG=?I!MYypQ!2g|}!7^xps6@|thLf7RIk%$TuLf7$Q zLM5d+Nfn%vCb{uEXahSK;yP1m*(zMX`TqREvWQ2ryzRx%Ja93zikk6js>6T zES8Jv+%|B;pIv%`Dq(!kL(h%AEbV?*Rzk*Epw`fL@5kBx%9Aw2303X;{f$4NjrsCJ zq6qUb-IohK52=K98j`lr+BO_kM*MdNj%swHvMZ~|c23cU-mpm0VAn}AwUY966X!!n zQ~XHU9RVxshOrA?gI;ajSH~~#9eYW)M>DTNSeuWp6kHWM^d+&fdS^)Vq3~K2PUO~D zuJ2a!R5df7@-@a|m9Q2i=fD6ON%NTB4%S94_=%Y%45>MtJ~Z^`XrQtiqiFQd5B}BW z+{dk}Y@40n4bDS$?1ucs_1MW?Bc5BxRDy9cVaEZT_QCmnxuWB$#%GL%eB1Hn@U%j?tXCWL?{zWn z7dk#?yIV(I{c6PRlE|Dpq*VrbAc6*>cZWx!B5*JB>LkPgpghBn7I&wX6nKcq=VP(176MGtXvJq-Afa};c~7pP~X!1JN_Ss=ioVwd1zCM5%CLYw~-u~yb9Bt&vRHB z_6Hla3+ib=@t%SFC$aXOv?Icx)#Rhw`-$FAi?w0r&%?AESA%aLm3+a)eHmtR95RLU zWR%L@%2kskk0!TX&DdmhRn>6Ywi)Crb1$B=Pkq&3Bq-MD&FwgiXqS>96aOB|o$qB9 zY*E}>1dn|RbUKu9dd%1j%0upa-OyRI_6ga4s>&lUV3s789HZdtfw|X7jMA%m(qKfx z+cR95^}Wvp;WDO$zY~za8!=bq+9kv9d+yBS_omDFu;EP?`tWiy*eY_(jt};wQ-)Ln zOK;+eJpKZWef|3N{{Dc#LEJX2(c(GNKrm_RLPe{LB`(OJ=D+Rf293*QolCGS&jT#W zI!+&Adm*&IO&YIs78Ph)bExrV9_O=4@Jatx5>FHjXVPPTnn^)zi%@1tj9upOQ%1Hr zf|e9<|`N{bg`G4#~~sdxhD93SE|rzbE_~5c#qI7QAe1 znSq*AK5iS4JqLbIBr?W45cAGID!Y%nUI^caGg=())Fs=xFG_4NW^F02-L>TJtG?48_^N5W-Z64Z;Dny4yH6m5$7JKJfJ z=+GxovCk!m+p{lyQ_Xsv1}=WeiRxxTb02nh!Qgqio7T=gy;;ph(|HDAZ!#+A)xuxG z9zd2R6#r$Jyi~3@!&5tFh?yYieTk-}nHz_w)z#YU_*tlqe`+rx>F<5e$9~ibg?X<(|{t;C4-JYP4|3jG_{KYOCR{D z)uq}cmO@M;G!G^?BR1~}d^-GfW6u$BU&=vA+4?~)*>X-UeXCEq$Fs79WV)(V`n1bk zKg=5Yx9JyH+rP7a>#JkOWj4JOGYyt+^tNDbywh`=YvOmh#4LMw&F3;nq9sAcoIGbq zTHgCfkp*7y%d!4qFC!67yLqEYMa_LtVeDBJEfQ1Ggr2)Nxgw^{9gp(?QFbAVHg`YmmAn8HDTc(WZUvzg!n<|B0O# z+Z~qXz__dYT@;>Ceczl)=Bf2WpP6$Wyq&?R&$Sc zx?_TkMhgj43_9;w1Tgc+&XW$^rLEQ9C9go0klFQ4@_8RGvv-7XISGsv|3c-}%{*@; zQkP>jBQM#}e4jIk5|o^Tm@r?ME#@f6$Wj(ZIm?zmz0dIKPKa_^gsL`DCCrZ>_ttIZ z3l>XA?=M=;#c+cUL%aNULLZ5b_~0}eEZyU3`sk`k`BW+bRm<@Tvvc~P+bq}X!3D_o z;i<8tzfM^zd=Ay@zkII$kvzaKgD@`r#Ninc96?Lnf}C13nM`DKjD@N`%+>B>q1yS8 z_Mc-td{_+b>OGILelWSLv>mUBzbjT2J3HFmeA5wpmftey{BMTZ3K*UmF!zhET?lJ& zvOrp5hXfgOxE`^pi%wpmxWjvJEvrl%>qa;^zFG)3U|(1!-ox&thIaYZePE0o;`A1> zQ{|gYtU=e3M}EMlbfmiZoADCq{d_cH*>8JI$mlfuFJbULYdVWP)5{xQ?j01aEx6!; zQy4S*SLrrjt-6g^C^{|4gotsOJ$8mnE$YnGxa%W~fXkHSs4@S1!t{ZWO@7D}iJGUO z>e10fGZ8moTnIZ$O77p}6TEMItJ}yrduXamc@76Ya@srLkX-wdy+oA#%X?$Q<%*uA zmRtc?z2B`#WejQxv{vnhHKLC9&741{{*(+HA26V4pl>a*o;1Lg435u}A%1Z>CT|zI znc0BP^d;zzmHuMsWkEA8WOM}=eU|zs++F=?$VIdC*?NJ;h|KZbRdULRhzKaJvn6K| zrU}S6ZZXAND$QQH{71gdCE%CGcx@dMJ;-_6%p)J2!%1)m=w z=>Z&Fuj6Fc(`O{n?~<#jV+TG>J2$>68DOX}RDuD71RhJSp0SD&Kk+Pvtd6l;~kWKSr`jhzr-5nim=n#}4dm z@UV|d^8N)G&snM2`X;L?C>=woou<`o;qy~W>MftCxj_7-?NRDZ2y!NvMT zTHo}HM}7#PXtU>^42dC(VwaY%c^_wuWUSxAC}C?Xh%B29Pl|D=Kp?O4nMFI~-io<< zGGR2W+vM3#UKh;E{twDHndGj-zNrfAa`_9xTTv%33o)2$n%Io2Zs-KR`Z=q&e;C|w zJt@CfBaSdbtQ#9eEz@A(MGnv^TOcItj5OGIy?XK{qcl#P?=$)J7~YG|VaHfS>qjK_ zzz?IB_6GH}qx+&}!G&D|pPLj&@+xpr)U<0ms+rmw55i(4zK330(5# z<0l0FOW%&!`t|M>!BI0=$f{=9KN!RsM-SQsij76^0rC%mv>b}A(@1I(=*n1G~i{nngi=*#h1l0plBe_fJx&Ki+UGF8}Z5H->XI)12l&0BF zobD4752Y96KDh2xVJzvj-55qdDm$@pGrXlrMo4HsnlK?^5JviM>60|s-rJYBJnva4 zMEL6c`0;Pwz6r1XB4hs~X?Q(Gjq3;N6Z3MYs^eu4)kk~V^By~ie>8p}K$6+McILys zu9g)+JaXV=*Z98-byFX~yYJ)Zg{E8FXKo}iUmv=7FAgM$;tW*(zlu6ZlDP49nfO|- zTh@;*TTODP{y~nPCpKsa@B^=Ahx3g%EMHLz4fg#HXruB`-s3DhG-VPUgzw(y-h;*p z9CovU=dbiVy`KLAJ2N_cg$I{I-)u!`El&Y(EGQ@#A-#Y9qGPq>NJa9`Pa5Egdo4P? zfn#XjjDVE>Lc;{CY>Yc|MRAsYs8ZO!ZIYw_DyI`d4yGOB67Jn>Kk+)gUEV_0tqrg* zoQcR^CpmwM9R1}m&U;KC?|zl12vV^n#1;(y z0B8*|y?#;iNK7O$kTw|gK}Dxu$SeV`?}>ck@OY7-TCNDlSTEyx(+d_0N<561o>`ZY ze<1CsE!$u|q2g~O@~l7dR^h$i`Hp_t9NV0a)}Buv5orA5;L)7tlQ)PzEf!EyqW9Lc iULKZJxW7!s%;WK}lHr-WkFEYQznZePQkBBX_x}$JY3#iK literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 9416400e42b..8eb1b5acb13 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -69,6 +69,8 @@ security_category + pref_key_search_widget_installed + use_homescreen_tips diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 24595b6808a..80f3093d1eb 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -36,6 +36,15 @@ @style/AppTheme + +