From 9f2ef972ca2275f9b10e13ff495f364a8ae97c11 Mon Sep 17 00:00:00 2001 From: Abestanis Date: Sat, 11 Jun 2022 12:02:41 +0200 Subject: [PATCH 01/17] Add home widget --- android/app/build.gradle | 3 + android/app/src/main/AndroidManifest.xml | 12 + .../nt4f04und/sweyer/MusicPlayerAppWidget.kt | 318 ++++++++++++++++++ .../music_player_widget_preview.png | Bin 0 -> 36580 bytes .../music_player_widget_background.xml | 5 + ...ic_player_widget_button_bar_background.xml | 5 + .../main/res/layout/music_player_widget.xml | 70 ++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 2 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 2 +- .../app/src/main/res/values-night/colors.xml | 1 + .../app/src/main/res/values-port/bools.xml | 4 + .../app/src/main/res/values-v31/styles.xml | 11 + android/app/src/main/res/values/attrs.xml | 8 + android/app/src/main/res/values/bools.xml | 4 + android/app/src/main/res/values/colors.xml | 3 +- android/app/src/main/res/values/dimens.xml | 6 + android/app/src/main/res/values/strings.xml | 4 + android/app/src/main/res/values/styles.xml | 6 +- android/app/src/main/res/values/themes.xml | 13 + .../main/res/xml-v31/music_player_info.xml | 14 + .../src/main/res/xml/music_player_info.xml | 12 + lib/logic/app_widget.dart | 24 ++ lib/logic/player/content.dart | 2 + pubspec.lock | 8 + pubspec.yaml | 1 + 25 files changed, 534 insertions(+), 4 deletions(-) create mode 100644 android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt create mode 100644 android/app/src/main/res/drawable-nodpi/music_player_widget_preview.png create mode 100644 android/app/src/main/res/drawable/music_player_widget_background.xml create mode 100644 android/app/src/main/res/drawable/music_player_widget_button_bar_background.xml create mode 100644 android/app/src/main/res/layout/music_player_widget.xml create mode 100644 android/app/src/main/res/values-port/bools.xml create mode 100644 android/app/src/main/res/values-v31/styles.xml create mode 100644 android/app/src/main/res/values/attrs.xml create mode 100644 android/app/src/main/res/values/bools.xml create mode 100644 android/app/src/main/res/values/dimens.xml create mode 100644 android/app/src/main/res/values/strings.xml create mode 100644 android/app/src/main/res/values/themes.xml create mode 100644 android/app/src/main/res/xml-v31/music_player_info.xml create mode 100644 android/app/src/main/res/xml/music_player_info.xml create mode 100644 lib/logic/app_widget.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 357625727..2dd697dbd 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -69,6 +69,9 @@ android { signingConfig = signingConfigs.release } } + buildFeatures { + viewBinding true + } } flutter { diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 878c83b9c..cdc0b38cc 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -72,6 +72,18 @@ + + + + + + + + + diff --git a/android/app/src/main/res/values/themes.xml b/android/app/src/main/res/values/themes.xml new file mode 100644 index 000000000..53fcb86ec --- /dev/null +++ b/android/app/src/main/res/values/themes.xml @@ -0,0 +1,13 @@ + + + + diff --git a/android/app/src/main/res/xml-v31/music_player_info.xml b/android/app/src/main/res/xml-v31/music_player_info.xml new file mode 100644 index 000000000..c4f30b78c --- /dev/null +++ b/android/app/src/main/res/xml-v31/music_player_info.xml @@ -0,0 +1,14 @@ + + diff --git a/android/app/src/main/res/xml/music_player_info.xml b/android/app/src/main/res/xml/music_player_info.xml new file mode 100644 index 000000000..61cd571f2 --- /dev/null +++ b/android/app/src/main/res/xml/music_player_info.xml @@ -0,0 +1,12 @@ + + diff --git a/lib/logic/app_widget.dart b/lib/logic/app_widget.dart new file mode 100644 index 000000000..6dfd117f1 --- /dev/null +++ b/lib/logic/app_widget.dart @@ -0,0 +1,24 @@ +import 'package:home_widget/home_widget.dart'; + +import '../sweyer.dart'; + +/// Controller for native app widgets. +class AppWidgetControl extends Control { + static AppWidgetControl instance = AppWidgetControl(); + + @override + void init() { + super.init(); + PlaybackControl.instance.onSongChange + .listen((song) => update(song, MusicPlayer.instance.playing)); + MusicPlayer.instance.playingStream.listen( + (playing) => update(PlaybackControl.instance.currentSong, playing)); + } + + /// Update the widgets with the current [song] and [playing] state. + Future update(Song song, bool playing) async { + await HomeWidget.saveWidgetData('song', song.contentUri); + await HomeWidget.saveWidgetData('playing', playing); + await HomeWidget.updateWidget(name: 'MusicPlayerAppWidget'); + } +} diff --git a/lib/logic/player/content.dart b/lib/logic/player/content.dart index 8ad324b29..bc8b60afe 100644 --- a/lib/logic/player/content.dart +++ b/lib/logic/player/content.dart @@ -5,6 +5,7 @@ import 'package:enum_to_string/enum_to_string.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; // import 'package:quick_actions/quick_actions.dart'; +import 'package:sweyer/logic/app_widget.dart'; import 'package:rxdart/rxdart.dart'; import 'package:sweyer/sweyer.dart'; import 'package:sweyer_plugin/sweyer_plugin.dart'; @@ -253,6 +254,7 @@ class ContentControl extends Control { await MusicPlayer.instance.init(); await FavoritesControl.instance.init(); PlayerInterfaceColorStyleControl.instance.init(); + AppWidgetControl.instance.init(); } _initializeCompleter = null; } diff --git a/pubspec.lock b/pubspec.lock index 16b15d36d..ff1d05ea2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -584,6 +584,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + home_widget: + dependency: "direct main" + description: + name: home_widget + sha256: c7a57566606ce702454f074a0b933ee156f05ea6ef1f79f4cb680a171afe59dd + url: "https://pub.dev" + source: hosted + version: "0.2.0+1" hooks_riverpod: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 5fe8e8c4f..e3752d6cb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,6 +56,7 @@ dependencies: freezed_annotation: ^2.2.0 json_annotation: ^4.7.0 memoize: ^3.0.0 + home_widget: ^0.2.0 # quick_actions: ^0.6.0 # TODO: quick actions are blocked on https://github.com/ryanheise/audio_service/issues/671 From a3dc1c07cedbeeaac3308ceff1c9307aa0fe68f7 Mon Sep 17 00:00:00 2001 From: Abestanis Date: Mon, 8 May 2023 18:40:15 +0200 Subject: [PATCH 02/17] Add app widget tests --- lib/logic/app_widget.dart | 32 +++++++++++++-- lib/logic/player/content.dart | 1 + test/observer/app_widget.dart | 39 ++++++++++++++++++ test/routes/home_route_test.dart | 13 +++++- test/routes/player_route_test.dart | 64 +++++++++++++++++++++++++----- test/test.dart | 2 + 6 files changed, 138 insertions(+), 13 deletions(-) create mode 100644 test/observer/app_widget.dart diff --git a/lib/logic/app_widget.dart b/lib/logic/app_widget.dart index 6dfd117f1..3c32032ac 100644 --- a/lib/logic/app_widget.dart +++ b/lib/logic/app_widget.dart @@ -1,3 +1,6 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; import 'package:home_widget/home_widget.dart'; import '../sweyer.dart'; @@ -5,20 +8,43 @@ import '../sweyer.dart'; /// Controller for native app widgets. class AppWidgetControl extends Control { static AppWidgetControl instance = AppWidgetControl(); + @visibleForTesting + static const appWidgetName = 'MusicPlayerAppWidget'; + + StreamSubscription? currentSongListener; + StreamSubscription? playingStateListener; + /// The last song content uri sent to the widget. + String? lastSongContentUri; + /// The last playing state sent to the widget. + bool? lastPlayingState; @override void init() { super.init(); - PlaybackControl.instance.onSongChange + lastSongContentUri = null; + lastPlayingState = null; + currentSongListener = PlaybackControl.instance.onSongChange .listen((song) => update(song, MusicPlayer.instance.playing)); - MusicPlayer.instance.playingStream.listen( + playingStateListener = MusicPlayer.instance.playingStream.listen( (playing) => update(PlaybackControl.instance.currentSong, playing)); } + + @override + void dispose() { + currentSongListener?.cancel(); + playingStateListener?.cancel(); + super.dispose(); + } /// Update the widgets with the current [song] and [playing] state. Future update(Song song, bool playing) async { + if (playing == lastPlayingState && song.contentUri == lastSongContentUri) { + return; + } + lastSongContentUri = song.contentUri; + lastPlayingState = playing; await HomeWidget.saveWidgetData('song', song.contentUri); await HomeWidget.saveWidgetData('playing', playing); - await HomeWidget.updateWidget(name: 'MusicPlayerAppWidget'); + await HomeWidget.updateWidget(name: appWidgetName); } } diff --git a/lib/logic/player/content.dart b/lib/logic/player/content.dart index bc8b60afe..d196d378a 100644 --- a/lib/logic/player/content.dart +++ b/lib/logic/player/content.dart @@ -282,6 +282,7 @@ class ContentControl extends Control { MusicPlayer.instance.dispose(); FavoritesControl.instance.dispose(); PlayerInterfaceColorStyleControl.instance.dispose(); + AppWidgetControl.instance.dispose(); } super.dispose(); } diff --git a/test/observer/app_widget.dart b/test/observer/app_widget.dart new file mode 100644 index 000000000..af8dc5be5 --- /dev/null +++ b/test/observer/app_widget.dart @@ -0,0 +1,39 @@ +import 'dart:collection'; + +import 'package:flutter/services.dart'; +import 'package:tuple/tuple.dart'; + +import '../test.dart'; + +/// An observer for platform app widget channel requests. +class AppWidgetChannelObserver { + /// The method channel used by the flutter `home_widget` package + static const MethodChannel _channel = MethodChannel('home_widget'); + + /// The list of requests made to save widget data. + List> get saveWidgetDataLog => UnmodifiableListView(_saveWidgetDataLog); + final List> _saveWidgetDataLog = []; + + /// The list of requests made to update a widget type. + List get updateWidgetRequests => UnmodifiableListView(_updateWidgetRequests); + final List _updateWidgetRequests = []; + + + /// Create a new app widget observer, which automatically + /// unregisters any previously created observer. + AppWidgetChannelObserver(TestWidgetsFlutterBinding binding) { + binding.defaultBinaryMessenger.setMockMethodCallHandler(_channel, (call) async { + switch (call.method) { + case 'saveWidgetData': + var arguments = Map.castFrom(call.arguments); + _saveWidgetDataLog.add(Tuple2(arguments['id'] as String, arguments['data'])); + return true; + case 'updateWidget': + var arguments = Map.castFrom(call.arguments); + _updateWidgetRequests.add(arguments['name'] as String); + return true; + } + return null; // Ignore unimplemented method calls. + }); + } +} diff --git a/test/routes/home_route_test.dart b/test/routes/home_route_test.dart index 60f0e45a6..f3516a23e 100644 --- a/test/routes/home_route_test.dart +++ b/test/routes/home_route_test.dart @@ -5,7 +5,9 @@ import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:sweyer/constants.dart'; import 'package:sweyer/routes/settings_route/theme_settings.dart'; +import 'package:sweyer/logic/app_widget.dart'; +import '../observer/app_widget.dart'; import '../observer/observer.dart'; import '../test.dart'; @@ -16,7 +18,7 @@ void main() { group('permissions screen', () { testWidgets('shows if no permissions were granted and pressing the button requests permissions', - (WidgetTester tester) async { + (WidgetTester tester) async { late PermissionsChannelObserver permissionsObserver; await setUpAppTest(() { permissionsObserver = PermissionsChannelObserver(tester.binding); @@ -133,6 +135,11 @@ void main() { testWidgets('home screen - shows when permissions are granted and not searching for tracks', (WidgetTester tester) async { + late AppWidgetChannelObserver appWidgetChannelObserver; + await tester.runAsync(() => tester.pump()); // Wait for widget events from old app start to process. + await setUpAppTest(() { + appWidgetChannelObserver = AppWidgetChannelObserver(tester.binding); + }); await tester.runAppTest(() async { expect(Permissions.instance.granted, true); expect(find.byType(Home), findsOneWidget); @@ -141,6 +148,10 @@ void main() { tester.getRect(find.byType(App)).height, reason: 'Player route must be offscreen', ); + await tester.runAsync(() => tester.pump()); // Wait for widget events from start to process. + expect(appWidgetChannelObserver.saveWidgetDataLog, + [("song", songWith().contentUri), ("playing", false)]); + expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); }); }); diff --git a/test/routes/player_route_test.dart b/test/routes/player_route_test.dart index 90fcd58dd..0e5a258e0 100644 --- a/test/routes/player_route_test.dart +++ b/test/routes/player_route_test.dart @@ -1,6 +1,9 @@ import 'package:back_button_interceptor/back_button_interceptor.dart'; import 'package:flutter/material.dart'; +import 'package:sweyer/logic/app_widget.dart'; +import 'package:tuple/tuple.dart'; +import '../observer/app_widget.dart'; import '../test.dart'; void main() { @@ -85,7 +88,7 @@ void main() { /// 1 - from [SongTile] /// 2 - from [TrackPanel] /// 3 and 4 - from [PlayerRoute] - it shows current and previous song arts and animates between them - /// 5 - also from [PlayerRoute] invisible overlay, used to extract art color + /// 5 - also from [PlayerRoute] invisible overlay, used to extract art color final currentSong = PlaybackControl.instance.currentSong; expect(find.text(currentSong.title), findsNWidgets(3)); @@ -134,18 +137,32 @@ void main() { await setUpAppTest(() { FakeSweyerPluginPlatform.instance.songs = songs.toList(); }); - PlaybackControl.instance.changeSong(songs[1]); + await tester.runAsync(() async => PlaybackControl.instance.changeSong(songs[1])); await tester.runAppTest(() async { + final appWidgetChannelObserver = AppWidgetChannelObserver(tester.binding); // Expand the route await tester.expandPlayerRoute(); expect(PlaybackControl.instance.currentSong, songs[1]); + expect(appWidgetChannelObserver.saveWidgetDataLog, []); + expect(appWidgetChannelObserver.updateWidgetRequests, []); - await tester.tap(find.byIcon(Icons.skip_previous_rounded)); + await tester.runAsync(() => tester.tap(find.byIcon(Icons.skip_previous_rounded))); expect(PlaybackControl.instance.currentSong, songs.first); + expect(appWidgetChannelObserver.saveWidgetDataLog, + [Tuple2("song", songs.first.contentUri), const Tuple2("playing", false)]); + expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); - await tester.tap(find.byIcon(Icons.skip_previous_rounded)); + await tester.runAsync(() => tester.tap(find.byIcon(Icons.skip_previous_rounded))); expect(PlaybackControl.instance.currentSong, songs.last); + expect(appWidgetChannelObserver.saveWidgetDataLog, [ + Tuple2("song", songs.first.contentUri), + const Tuple2("playing", false), + Tuple2("song", songs.last.contentUri), + const Tuple2("playing", false) + ]); + expect(appWidgetChannelObserver.updateWidgetRequests, + [AppWidgetControl.appWidgetName, AppWidgetControl.appWidgetName]); }); }); @@ -158,23 +175,39 @@ void main() { await setUpAppTest(() { FakeSweyerPluginPlatform.instance.songs = songs.toList(); }); - PlaybackControl.instance.changeSong(songs[1]); + await tester.runAsync(() async => PlaybackControl.instance.changeSong(songs[1])); await tester.runAppTest(() async { + final appWidgetChannelObserver = AppWidgetChannelObserver(tester.binding); // Expand the route await tester.expandPlayerRoute(); expect(PlaybackControl.instance.currentSong, songs[1]); + expect(appWidgetChannelObserver.saveWidgetDataLog, []); + expect(appWidgetChannelObserver.updateWidgetRequests, []); - await tester.tap(find.byIcon(Icons.skip_next_rounded)); + await tester.runAsync(() => tester.tap(find.byIcon(Icons.skip_next_rounded))); expect(PlaybackControl.instance.currentSong, songs.last); + expect(appWidgetChannelObserver.saveWidgetDataLog, + [Tuple2("song", songs.last.contentUri), const Tuple2("playing", false)]); + expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); - await tester.tap(find.byIcon(Icons.skip_next_rounded)); + await tester.runAsync(() => tester.tap(find.byIcon(Icons.skip_next_rounded))); expect(PlaybackControl.instance.currentSong, songs.first); + expect(appWidgetChannelObserver.saveWidgetDataLog, [ + Tuple2("song", songs.last.contentUri), + const Tuple2("playing", false), + Tuple2("song", songs.first.contentUri), + const Tuple2("playing", false) + ]); + expect(appWidgetChannelObserver.updateWidgetRequests, + [AppWidgetControl.appWidgetName, AppWidgetControl.appWidgetName]); }); }); testWidgets('play/pause button works', (WidgetTester tester) async { await tester.runAppTest(() async { + await tester.runAsync(() => tester.pump()); // Wait for widget events from start to process. + final appWidgetChannelObserver = AppWidgetChannelObserver(tester.binding); // Expand the route await tester.expandPlayerRoute(); @@ -185,14 +218,27 @@ void main() { expect(MusicPlayer.instance.playing, false); expect(MusicPlayer.handler!.running, false); + expect(appWidgetChannelObserver.saveWidgetDataLog, []); + expect(appWidgetChannelObserver.updateWidgetRequests, []); - await tester.tap(button); + await tester.runAsync(() => tester.tap(button)); expect(MusicPlayer.instance.playing, true); expect(MusicPlayer.handler!.running, true); + expect(appWidgetChannelObserver.saveWidgetDataLog, + [Tuple2("song", songWith().contentUri), const Tuple2("playing", true)]); + expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); - await tester.tap(button); + await tester.runAsync(() => tester.tap(button)); expect(MusicPlayer.instance.playing, false); expect(MusicPlayer.handler!.running, true, reason: 'Handler should only stop when stopped, not when paused'); + expect(appWidgetChannelObserver.saveWidgetDataLog, [ + Tuple2("song", songWith().contentUri), + const Tuple2("playing", true), + Tuple2("song", songWith().contentUri), + const Tuple2("playing", false) + ]); + expect(appWidgetChannelObserver.updateWidgetRequests, + [AppWidgetControl.appWidgetName, AppWidgetControl.appWidgetName]); await tester.pumpAndSettle(); }); diff --git a/test/test.dart b/test/test.dart index e945a296c..1dd51700c 100644 --- a/test/test.dart +++ b/test/test.dart @@ -21,6 +21,7 @@ import 'package:sweyer_plugin/sweyer_plugin_platform_interface.dart'; export 'fakes/fakes.dart'; +import 'observer/app_widget.dart'; import 'observer/observer.dart'; import 'test.dart'; import 'test_description.dart'; @@ -116,6 +117,7 @@ Future setUpAppTest([VoidCallback? configureFakes]) async { DeviceInfoControl.instance = FakeDeviceInfoControl(); FavoritesControl.instance = FakeFavoritesControl(); PermissionsChannelObserver(binding); // Grant all permissions by default. + AppWidgetChannelObserver(binding); // Ignore app widget updates by default. SweyerPluginPlatform.instance = FakeSweyerPluginPlatform(binding); QueueControl.instance = FakeQueueControl(); ThemeControl.instance = FakeThemeControl(); From f2c2da50f586f9b1f2c77bf88849c2435051ffe3 Mon Sep 17 00:00:00 2001 From: Abestanis Date: Sat, 20 May 2023 13:47:17 +0200 Subject: [PATCH 03/17] Use a widget preview layout and change the default size to 2x3 --- .../main/res/layout/music_player_widget.xml | 7 +-- .../layout/music_player_widget_preview.xml | 58 +++++++++++++++++++ android/app/src/main/res/values/strings.xml | 3 + .../main/res/xml-v31/music_player_info.xml | 3 +- 4 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 android/app/src/main/res/layout/music_player_widget_preview.xml diff --git a/android/app/src/main/res/layout/music_player_widget.xml b/android/app/src/main/res/layout/music_player_widget.xml index babd76250..709f4dbb4 100644 --- a/android/app/src/main/res/layout/music_player_widget.xml +++ b/android/app/src/main/res/layout/music_player_widget.xml @@ -1,5 +1,4 @@ @@ -53,7 +52,7 @@ android:layout_height="@dimen/musicPlayerWidgetButtonSize" android:layout_weight="1" android:background="@android:color/transparent" - android:contentDescription="Play" + android:contentDescription="@string/play" android:src="@drawable/round_play_arrow" /> diff --git a/android/app/src/main/res/layout/music_player_widget_preview.xml b/android/app/src/main/res/layout/music_player_widget_preview.xml new file mode 100644 index 000000000..61c62ad00 --- /dev/null +++ b/android/app/src/main/res/layout/music_player_widget_preview.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 2625f679c..772715150 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,4 +1,7 @@ Music player + Previous track + Play + Next track diff --git a/android/app/src/main/res/xml-v31/music_player_info.xml b/android/app/src/main/res/xml-v31/music_player_info.xml index c4f30b78c..6b573c385 100644 --- a/android/app/src/main/res/xml-v31/music_player_info.xml +++ b/android/app/src/main/res/xml-v31/music_player_info.xml @@ -4,7 +4,8 @@ android:initialLayout="@layout/music_player_widget" android:description="@string/musicPlayerWidgetDescription" android:targetCellHeight="2" - android:targetCellWidth="2" + android:targetCellWidth="3" + android:previewLayout="@layout/music_player_widget_preview" android:minWidth="160dp" android:minHeight="160dp" android:minResizeWidth="@dimen/musicPlayerWidgetButtonSize" From d4cc23d3186b539f4c14aee2c4e1d95cec71ee79 Mon Sep 17 00:00:00 2001 From: Abestanis Date: Fri, 12 Jul 2024 01:40:10 +0200 Subject: [PATCH 04/17] Update home_widget --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ff1d05ea2..460c139b2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -588,10 +588,10 @@ packages: dependency: "direct main" description: name: home_widget - sha256: c7a57566606ce702454f074a0b933ee156f05ea6ef1f79f4cb680a171afe59dd + sha256: "2a0fdd6267ff975bd07bedf74686bd5577200f504f5de36527ac1b56bdbe68e3" url: "https://pub.dev" source: hosted - version: "0.2.0+1" + version: "0.6.0" hooks_riverpod: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index e3752d6cb..3631bc941 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,7 +56,7 @@ dependencies: freezed_annotation: ^2.2.0 json_annotation: ^4.7.0 memoize: ^3.0.0 - home_widget: ^0.2.0 + home_widget: ^0.6.0 # quick_actions: ^0.6.0 # TODO: quick actions are blocked on https://github.com/ryanheise/audio_service/issues/671 From ac09a0183beb5e987999336703259d4aef598231 Mon Sep 17 00:00:00 2001 From: Abestanis Date: Mon, 14 Oct 2024 11:38:21 +0200 Subject: [PATCH 05/17] Remove usage of tuple in the tests --- test/observer/app_widget.dart | 8 +++---- test/routes/home_route_test.dart | 3 +-- test/routes/player_route_test.dart | 34 ++++++++---------------------- 3 files changed, 13 insertions(+), 32 deletions(-) diff --git a/test/observer/app_widget.dart b/test/observer/app_widget.dart index af8dc5be5..1af32a6da 100644 --- a/test/observer/app_widget.dart +++ b/test/observer/app_widget.dart @@ -1,7 +1,6 @@ import 'dart:collection'; import 'package:flutter/services.dart'; -import 'package:tuple/tuple.dart'; import '../test.dart'; @@ -11,14 +10,13 @@ class AppWidgetChannelObserver { static const MethodChannel _channel = MethodChannel('home_widget'); /// The list of requests made to save widget data. - List> get saveWidgetDataLog => UnmodifiableListView(_saveWidgetDataLog); - final List> _saveWidgetDataLog = []; + List<(String, dynamic)> get saveWidgetDataLog => UnmodifiableListView(_saveWidgetDataLog); + final List<(String, dynamic)> _saveWidgetDataLog = []; /// The list of requests made to update a widget type. List get updateWidgetRequests => UnmodifiableListView(_updateWidgetRequests); final List _updateWidgetRequests = []; - /// Create a new app widget observer, which automatically /// unregisters any previously created observer. AppWidgetChannelObserver(TestWidgetsFlutterBinding binding) { @@ -26,7 +24,7 @@ class AppWidgetChannelObserver { switch (call.method) { case 'saveWidgetData': var arguments = Map.castFrom(call.arguments); - _saveWidgetDataLog.add(Tuple2(arguments['id'] as String, arguments['data'])); + _saveWidgetDataLog.add((arguments['id'] as String, arguments['data'])); return true; case 'updateWidget': var arguments = Map.castFrom(call.arguments); diff --git a/test/routes/home_route_test.dart b/test/routes/home_route_test.dart index f3516a23e..312dca0e0 100644 --- a/test/routes/home_route_test.dart +++ b/test/routes/home_route_test.dart @@ -149,8 +149,7 @@ void main() { reason: 'Player route must be offscreen', ); await tester.runAsync(() => tester.pump()); // Wait for widget events from start to process. - expect(appWidgetChannelObserver.saveWidgetDataLog, - [("song", songWith().contentUri), ("playing", false)]); + expect(appWidgetChannelObserver.saveWidgetDataLog, [("song", songWith().contentUri), ("playing", false)]); expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); }); }); diff --git a/test/routes/player_route_test.dart b/test/routes/player_route_test.dart index 0e5a258e0..7290f313c 100644 --- a/test/routes/player_route_test.dart +++ b/test/routes/player_route_test.dart @@ -1,7 +1,6 @@ import 'package:back_button_interceptor/back_button_interceptor.dart'; import 'package:flutter/material.dart'; import 'package:sweyer/logic/app_widget.dart'; -import 'package:tuple/tuple.dart'; import '../observer/app_widget.dart'; import '../test.dart'; @@ -149,18 +148,13 @@ void main() { await tester.runAsync(() => tester.tap(find.byIcon(Icons.skip_previous_rounded))); expect(PlaybackControl.instance.currentSong, songs.first); - expect(appWidgetChannelObserver.saveWidgetDataLog, - [Tuple2("song", songs.first.contentUri), const Tuple2("playing", false)]); + expect(appWidgetChannelObserver.saveWidgetDataLog, [("song", songs.first.contentUri), ("playing", false)]); expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); await tester.runAsync(() => tester.tap(find.byIcon(Icons.skip_previous_rounded))); expect(PlaybackControl.instance.currentSong, songs.last); - expect(appWidgetChannelObserver.saveWidgetDataLog, [ - Tuple2("song", songs.first.contentUri), - const Tuple2("playing", false), - Tuple2("song", songs.last.contentUri), - const Tuple2("playing", false) - ]); + expect(appWidgetChannelObserver.saveWidgetDataLog, + [("song", songs.first.contentUri), ("playing", false), ("song", songs.last.contentUri), ("playing", false)]); expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName, AppWidgetControl.appWidgetName]); }); @@ -187,18 +181,13 @@ void main() { await tester.runAsync(() => tester.tap(find.byIcon(Icons.skip_next_rounded))); expect(PlaybackControl.instance.currentSong, songs.last); - expect(appWidgetChannelObserver.saveWidgetDataLog, - [Tuple2("song", songs.last.contentUri), const Tuple2("playing", false)]); + expect(appWidgetChannelObserver.saveWidgetDataLog, [("song", songs.last.contentUri), ("playing", false)]); expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); await tester.runAsync(() => tester.tap(find.byIcon(Icons.skip_next_rounded))); expect(PlaybackControl.instance.currentSong, songs.first); - expect(appWidgetChannelObserver.saveWidgetDataLog, [ - Tuple2("song", songs.last.contentUri), - const Tuple2("playing", false), - Tuple2("song", songs.first.contentUri), - const Tuple2("playing", false) - ]); + expect(appWidgetChannelObserver.saveWidgetDataLog, + [("song", songs.last.contentUri), ("playing", false), ("song", songs.first.contentUri), ("playing", false)]); expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName, AppWidgetControl.appWidgetName]); }); @@ -224,19 +213,14 @@ void main() { await tester.runAsync(() => tester.tap(button)); expect(MusicPlayer.instance.playing, true); expect(MusicPlayer.handler!.running, true); - expect(appWidgetChannelObserver.saveWidgetDataLog, - [Tuple2("song", songWith().contentUri), const Tuple2("playing", true)]); + expect(appWidgetChannelObserver.saveWidgetDataLog, [("song", songWith().contentUri), ("playing", true)]); expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); await tester.runAsync(() => tester.tap(button)); expect(MusicPlayer.instance.playing, false); expect(MusicPlayer.handler!.running, true, reason: 'Handler should only stop when stopped, not when paused'); - expect(appWidgetChannelObserver.saveWidgetDataLog, [ - Tuple2("song", songWith().contentUri), - const Tuple2("playing", true), - Tuple2("song", songWith().contentUri), - const Tuple2("playing", false) - ]); + expect(appWidgetChannelObserver.saveWidgetDataLog, + [("song", songWith().contentUri), ("playing", true), ("song", songWith().contentUri), ("playing", false)]); expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName, AppWidgetControl.appWidgetName]); From 16cdcf299222f021fe15a3b7663eda80423c1cf5 Mon Sep 17 00:00:00 2001 From: Abestanis Date: Sat, 19 Oct 2024 23:47:27 +0200 Subject: [PATCH 06/17] Add a bottom padding to the button bar of the home screen widget --- android/app/src/main/res/layout/music_player_widget.xml | 2 +- android/app/src/main/res/layout/music_player_widget_preview.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/res/layout/music_player_widget.xml b/android/app/src/main/res/layout/music_player_widget.xml index 709f4dbb4..64068cd61 100644 --- a/android/app/src/main/res/layout/music_player_widget.xml +++ b/android/app/src/main/res/layout/music_player_widget.xml @@ -31,7 +31,7 @@ android:layout_alignParentBottom="true" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" - android:layout_marginBottom="0dp" + android:layout_marginBottom="8dp" android:background="@drawable/music_player_widget_button_bar_background" android:orientation="horizontal"> diff --git a/android/app/src/main/res/layout/music_player_widget_preview.xml b/android/app/src/main/res/layout/music_player_widget_preview.xml index 61c62ad00..64dd4dc3b 100644 --- a/android/app/src/main/res/layout/music_player_widget_preview.xml +++ b/android/app/src/main/res/layout/music_player_widget_preview.xml @@ -22,7 +22,7 @@ android:layout_alignParentBottom="true" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" - android:layout_marginBottom="0dp" + android:layout_marginBottom="8dp" android:background="@drawable/music_player_widget_button_bar_background" android:orientation="horizontal"> From bc0fbac0b544bf5ae4e7297053f148448b9f37d5 Mon Sep 17 00:00:00 2001 From: Abestanis Date: Sun, 20 Oct 2024 03:41:03 +0200 Subject: [PATCH 07/17] Update preview image --- .../music_player_widget_preview.png | Bin 36580 -> 46615 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/android/app/src/main/res/drawable-nodpi/music_player_widget_preview.png b/android/app/src/main/res/drawable-nodpi/music_player_widget_preview.png index a49b1593b1446b65f05b6b57036c499869296416..f6166352e27d50e3a5b54031f4267ebc1a1c3ef0 100644 GIT binary patch literal 46615 zcmeFZdpOg5_&83AROrd$=^&;PrJ@pYPC7VKjO3h%WhQgTu#w{FsVH(>4&{_BhmzxL zNF}EUEi+~$n+;pcjLqivUZ3ypzwf`_|30p(YuEOEz3>_8->)7yJ6=)Pwr`u1 zl$3&v^~GyaQk#|~|F+5kzXXhz`~!S!hF`F8-3t80Z@u-el$3^)%|%PsdoSmyp0$Bv z-ZVaKoSNWR^tklU;ll?WL`H6Ta769mVR(-H-RE2GyEFutWIa2t{`1qZ92@YP*PD+W zSGv2VaBU{FR6Fo_#I^2ZwZ}V;9<@49T>PxV`ix)SCF`FN51u_sD}}ej@d-~%-|Bx6 zq;IUI8!;&Om>PY)7>OzMiK{m1+7GWzXhBW4ec5NX2|)7y)!*ck6z`bH*R8?==A%0! z%dIb#ACz|eK+|+=Y!IP)mOl}V<)ow%;W-)RXRV!TQ1Kgrfr?a1kg?GqL%isu1fpCW z(fMAsZP{YIdf6EjtUjWy(AQ5Gf7|$GGBiC> z&4hLqYw6E+d-DPCQrk0@2``ojnaZM{7HfG^0XR0%9K?+0sg%(|4K~sFj^0d|!0Vv1yo$tkB)IcWlU5T=Qyt z&EEnna6dm3SM58pv0lhmaB||bdd8{E(zv$}^Q+f4oRg8~(OD2+RibbzOLR`d#uJ!6c5BMSzW{Ev^6*{KgHXt6OuZQ5KSIza}kD zfROHjL2rI1GDxv2fuf+W^0FNS;){vZ}Rh)w&MvP zP@)7vV7PX|hK0C$sw?I$yI`|`XUqkSe{Kd&F>!lsT@;HGSG@5mrnIYu=2s940P-?+ z@@*@3pWrBUPmCBXb7Ie!MK837v$k@9hfVS7CdNN>TN&MvzIE&bh2^d;fwbEPiAV(2 z`>fIB*mFjlkw+7M_1yMfi5!!kPwuz5pO6C1k(WTYR`h0E%_L*`fgaQ2e<6%kF<>hqtuV z1K*@he7+Pk{rF`Bw_$szD)9Y!#`fMXyLZjfM8xG!8fM79pb{u{de-TGr2KKP@WLih zN0K`3-)ITf%Ua$%iNER+Hi5KUkf{IT7a7?uuOzzSteO%Cp3RGpygn|sTX{D1ajc1i zGuPiv-7GKDn~_+y>$ThEmu(QAFMZe!d^-WQMNC}!5O*M{P=8heof2+2JoG;xPV7mN z$maD^o6LZZTEEQ*;KQ$DD_|w1+VB7MXZe;x-z2+jzg#Rq;GZYwB|Q1x7yp+z|0_9w zGX1Z1{IBWwznDid&pQS%s5?3}%)(s|lLwfTsE~8lMKIq|7v}OsW5RK&*^4yxe9IN7 zaMVt~%zBT2o)La!4NdzV!OyA;9ZI)JH+64WERGbVM2160%*M|d`G`2glguBC(gD-@dsLJKdqJRkmR%`o+s2j~aRUp=tV6)> zER3=X#oL+57P_Jzx^@Gmc#5o4&KAG{XoP^HQ2p+9uvJZFJuExS{QaCd743iBL7^qu z8!^~h##u!&@3eUe@V=Sm>vls$Vs&twRE`YrYB2-vEFf;&K#)}3xW95-AJM*WeKhbh zH2^R=_|3-JhEQ#Kg9BBW}G-_Ip46#d>x^J|6Mi|vys5;C0r1U@~hpxN+*^b_$Je? zvRqb^C0jgK6Fp%?zRhv5n7I;qdU!fyOb~uaFOoq{a4D`xXDA0L0WxI zM(3XSY`8JIQ5sY;j|3wXsd+s>ZM-5z!ro?=#WS(;T)5hPYnb>S=2KWEdpyh0V`x{q zI^cNQkMM^^tYK?uVC&EEBh_{^aZwe0*aCjVSo6CK*=3!lD3wEgDpwX0-?lv2iDP#! z?MPmJonr&6vpr@rFrJaNl_#~b6JWj0J3~T3eZ+PmyNY%I|MR%}EAfw$%-P@(vrUQn zB+o0a6l&pT#_|kNHR?^r5{5H}c&gVjmgk{N_MrBpOuM;;1RdUc-5j6gC2#)CwG>Ol zg7VOI--glXx$MY$U*Bg-tw;`8=av660!y`YPHDbHE2lHS_XM6TZ?i^CvuuGMHG`v_ zmHhY;F3OuN#1I+ossy>l~5q#l&)2Q0`^N8B30H+d0$ zEs{1`ONL3?&UI<^VdZL70hwzGJo{mxK=3_E-eYu z`XUhr)o5nZ9i5nKDE_m0mh?+qiAB~cP^SswS3OgQrd~yU+;&ciC=Vc-n8#MPZ6t(q z7RJqAu*W?TI!{QAAOEwy^sw4QcA;n;->AQ1h&oMbMP%1+4zKyM$1<~`6xTRVQDq6B zRM>p7pmvjDV%&KkAoMGz37^8l!mlTw=k*58RH(O)N&=(Ysa0zMzYTdBTH&w4@{pEm z_mEh*+$klC6A3GsyGM|=Lsd8|I9$q4a)?rzFJD@NR`a%trRFq_*<6V!^K5i;xhv(T zC_(MewG8pk^s;m@aZBMXH9EHw*ELjSa_!)EncO6Rx9z!yMMOEB=oSZqVErPWdIkN@=?ux=A%?q2mLy=r5wUTjH-(^rs_LP#i!1opKM`7m8j(Uw|YyUm~& zZgQO9aFzMdxEyDt;%Py(2@nXI+u8^^m2BD;;ky%F^FW&272p41!)n~yVkc8RV$2h< zkGBD6CY9iZ2G-%sAG>vCH?xy#^9m@L7_HK=m{OA~Z^25%mmdNF6XSQd_ORLBO!cuJL$^{ zAO|_Dre@38$ibdMMc%X2k}s#MR)`uVIml+V%uzc)+GST@Uk*M7-t^MtsCp~$T?@k??|5iXj0(Gq~i~P(`t&icH^YoT8HloBny>kF5JC4{v#1% zaEvtOR&Xc1G7aq6KQN}4?xrG?1HDkZr=;F=1~{n1<1@drm$gu}H@fMK$QkqMzlS|K z%JU$4ZOzde0A*E$xL6nC;%iD?@_;zCXN4mUCd}rP`3g{_6=G|^1BD5$I$)Vlbgl`k zf^xR*fh=?NdP|fYVzoT7{RXeS>uUd9z#LsTok#g+{uTozD$bC3%aWdq0vxdIQZ zyKVO!wlzFW*!e^3L5SCe@rzz$MdrJKvhlH*D&dK}X&axUrEX_rEPuaJHn6@{9S3No zcLHv13d+nIuq{H`3O)`G4HvyI7d;{gmP}5&qF!{xvg6+mIK^v>q^x4_&qMSpY+4eo zAbuy2QUj&E93_N|9%j0WeVIA5#<{flN`Oym$BrHS>J-28hg1FD^~>%H15Q*UFEiw% z?D0vdoWF{ag&jGCS%eSvL%yoO|@#j$_0StvjRz04(obq*FZ(RxdJK5Sy0 z?1~O1#OskXjeoe(<;MOk#m(s!A%05(x}&2khRaG#nl`^je84!2LT~lQ3O~?(*rWHN zFHaNiMxLNHA1ZkHWWS8xRf!_KtSIdULmTo8LBv;1|H;XOD6e9_S%eBSY`V0tvAhR} z$q2xGNQL`^CK?VyKE}>@64AQpakPv25otl&(%fE&R|?dsr8ZBFOYFosC9Bn1O7@rX zFMAB;+#i$e_k$d}?uzz)sGO`gOf`RzmQLqwZ$|eF7pVW9_=NM2U@N5J94S6t^(R%V^$3u#BS3T_ z75)$2HV!ti{;$sz0f*`T)VfBGtLXdJ|C9xzc{!Px2;~q3fZtkCl^_Lu`WBK|)G+t0 zC=iUsu)+pH_&hGX!mZxJotNotpp}=DS}CYFTwrV5iW7hmMV9~_m^@*Or95~%`lJs% z;FMaFRbT>}C?kqYDcu=dQ(b)@w%%w0^r^;`u9o>ScFo z_8AUG+`mpzPg*EUQ^hF^xk(=WfNa*V-)ZeWp(uUCfbuq z1H$M#FqB?+2+>n*QO!59Z~g7J^>qD&X&$`s40?tcO! zspqc}$k-35T<5;>;Eh#36V8odhqwxI&09E#@U!a{u* z!My`U5P^A8#rco`@&3NVcH(1QR4!9L8uQdlq!EMU`qiQ!`W50|xz0*nXC)$|7MPVo zY#`otu{u-~_>^Bj9(DVLR>HKXp+f{ZlQ}ad>i6y>GtaK5JsPrbc@FaOYm|A2lN|p4 zyq=wR#Rs~rfusak>ns`EFDN$#+1G~%eqnyb5^}=r)&$U&ArqK10q=Wxv|* zCHETAW?`o&%hi(!scpCClY_Wlkt@mAW*4f_a>qclXS0F(Or!VLEMY6g zL7v+H(IsJjuGSV+ER_Q8EIoaCPNo(=hhqb^LlZ_1d1ZSk;4EO+??`PSxpnP*$cZeu zggqG)#qt#^T(nQTe$>~hTLBjH#!X$MmkGP+y)Rz6S`Zn}%{BxVyXF`*nHLk|Bmq^T zzUQMx0Fp(075~%s)>spgCMN*oe*8xyMctF631W==0QHFrs-rB<-w|F@YgFXNq?aB7 z{2O~OAT;4oc`wHQZgJW9TZ`U528q#6op5J3#C2Pc@(hdaS9~;DF6T6KA69 zh48y0iBL$xl^;@_((UUXU5Ga?-TnOvT8)wr8rX_?#(+j+>?0M0?DJ<9K3B|}-ri^6pj)S0@xo#fZ$FU8G+dAbUk>HQzFV%=^}FSp`H~ty|5g=#H9;r(ZV|T@ z0a!QY47@9EX~tAFJzg;U(qo^x*Fdzw=t)kwbs?Jf>P8(({p^bv#^vdR4Yt8!`VYNly_WLZ% zF{JeG5QQO^==(`<_Bou{4bqoF1HpbvMKP&07Ah;(ude_s{R@=6r9~1nV>{jQytkOb z=K6MqMDp#XO`_ZhdqZd-Wqp75_D7c$Nhfk0>v3x*5(_+)mrLH}DlgYjMob&*?o(p+ z&)?Z;&|5!rzy8SVVQ~kSM*J|~nFNNL?*wZ))BvSX20qB96QEEbqJ@&2* z?naOv$mBbGM&v0UeZy`~K44As0>AuMzD{oSRm&MqDo>wzpCTv(vJ@oZsTq6rUVV^R zqQqTKLaZH-*&pOr*B1Zj?+2<~YN%l)?!8cB=VdSbho60%6lt304Hxo~F38VlUSuTn z+u&uFw9yuaKjfD|iaTdz7a(wnABNaF~pQgz-Xy<&4XJ#r*2E~2AJQX>=RRH`kjHa@; z;PNfLH|(7GbH}Z`#KRI?-_Je#xW2qIwcEN8Vtxij$cN|+g>|!yuA>9;dB3P|f^nF8 z{jst8ge>vsH`tg#P7qcU-9}$;0IlthMx^D5Gv%)0W4WZi)$~sFFigz7-C2y*Et|Y< z{=u7+*D~l0NBSsFoz3xBh%$eB!=aMnIu5s{8Q{_sG*hBh8+|nbov2<#HA6zeWq#b7 zm=MBC$QQqgy{5SaX-;ljmOQViM5~_^bnePKcy8tqP){m?R^C%kGpLqR zL0jFnek!z(>w7V<#&F+JGH<@uuLHays%Nb9en*><|I-$&4B6)n$e>we`UR#ywr2PM z;dM#ElCrGht!wXSnjsNDTs4XgD8UFn8TG8+t$!7Ls!RAT1?7n83{%eTZ!g;sy437& z6c#kFBPyH-6|xZQf7?`6WU3r;-9`Ic84-Lf#0082J1X)-LE(q7q+UrgtI5k4{5yQ? zQ|nx?LH}&)+DQS};nPEk_WwT%kaHU4Mr)$vL8gTU5&8E{J;UC9~=yH+GaGlCrIJFKWK zX;ks(7ot1mYsV4p5N{;{SLY&6;{(x2VcZiKW)WM9iLyhkw4rtmo{;! zdjt{RvTdb3@K0i_sQHZI$7p*Q%mxz1{OFj^`#hUhZ0ht#<*XF!1$U6!!g5vEH(rOr zj-Kl1>Q?M8A-%^dK2Mm7Wfq(&8n{}%k~on6OD>%N57w>56H8wCST(wxrewgtF`-rY;6tuaL2R>0&j3r zG8fF9u9qi}#Prox%u{Gv&eP62*VOuO2gbKnuvU|=#i!?w1SYhlrMpk5H$9Qa>&#rK zy{g;r%fm(!UWN;)!*@f!Ml9Jx+#V#I(bjBqH2;E$J-Fucx&IVI# zqg1JPY#rKN(>39q;cO(|`|oBk`Z3XAKd25MYWE+a?%T#kNVjdqy?I}4JWKBa zUpMo#Ej)Y4jVD)eKxISK|=HR(Uv z=q`9scLp*oOx@UJBuscJ9C?QEK5?Fb}UJnMI$ z5j`%7Sb*ul%mq6x=(A6c<;R?!k37t6ZJQYSqES#9RaSWH-1T!3%3@PirY6~X zCY(+(9ZKG1Z1~^uu?^96f8Q_0tK16BZBP;IcZScjY^$bQRugli&@we@PnwjK={MFKWU9*4fTTB>$HrYnI z#2PM;rF8SUl9?426TUGKqLnPfND3%%CLtdtz2a|f9Ai!sq?RZ%A2_E!l+;7AKW7C) zRmhIGqaD@Cn%HOa>P`;z&woC<19n06A(8rdXD;0ePS0#s_k5M+c&9U_I#OwE;1#60 zI$tOZDHp6tKV7)f1mt^~Q1&7jV-VfxCzy7xKizLoV^?=E5TaNmcMwC{do*EhsY`bK zrwf0myQw{jL`Hvr_E{(4g%{7MX`L(0*P_J{H~Ryr1Oexq{jyK`$CgMT*)hfj!oMT< zr9C%j_+1lM^t}&VBP*9*O&oLN(fd<5_cn9v$=+Ct63bjl+_e@0GCabzOubi5)w++65!JJ1@#ynTWr)AX1Dk)FP0b&2%)Uz@&8}RB#MtB(G9YbVnsQb2D zPI?UWmzy&Ewpa4TnYV+w&)%csrhJw8HQccFNu@c?DfeC>%FSxs=5sJa>jiNf$9OLZR z>;hf7mJN;~WcG<%Rr4&cO7B_%LP1!uFs|UEPKwBS&75-e#hp74jKgxEhs{t(hGW|2 z)WCOJB@XT<`Iy?&Hf<#F>y4Ux3oxFYaPG%S2QpEAEoDSFri3+6i3X*WKt9CkxKA#a z_hSrn-lW=$y7u-~BKQNYQ=-(H+_Oc$)%n_@?gftQ=7O*%?u@vaS3iGG%-?ZDS z94jWGrJ^P7j*QY=AC3BAH{$_uKgX;kt!X;P+>cYN1s^evxe)aYsy*JYO9$)%jc>yo zJ5fFEll}ZG6kN3XHyD-~jqW|8x|FaZJxY#ZyYU?eC(@2F?uwqsS{%Bx($720-U{tEAJI13u0dB-TG9I(_7$(a zMWGdgtC*Ob?-OVdp561b+5lVF2ODy4Cx zRUab@NU!S~m)jda1%*{#;Sd*%Qz$iZ9@D+D&At9PradgZkrWGh&>KrN5N^3v)~)fx zeIx)Yyr!RHCivoMG5L=1Sk@}5_@ht3fOx+sqDef;fWN7@mj0)FGGB2Z{`x?7VZP4u zbf#(H4JU%3TE*xuA!HX1sO!GRJaMSBiMppqG}NRt8lHM4fSp^N?u>hfd@uhSnKN6E z7W{isKytw!3Q)2y5E)yH6om2>YT~YM5oAt3Z%7pW;i_*K;*x7~y-Gxld*#ZoJL`*U z`SVr63(N;K*HT9u{gm&4#;&!7-t%R8q9Yuaa$GK}HKm1mlutjRjqSLPLy;0YKisas z^%X!|WY4TQS+s0p$8sYS$DHcBh2%hO?f`zew0{!&@+1Cn2Iq>8bgEMCO^~DlEbP*} z+o_Xz?+5I`$uVO_?O2QN$6xAWAxB7ZE+eG1@?AygToV8Lt?@-xvl()0L$lZo{xQ|K zwk612Sb;#r6%??)gL3spK!wFIPE>XvWayuo<|4#*&ueutr&n5f2iSLQu@EyZ>)oF$ z7J0XWNaPbS+6xz>CQ_#-&hEofZYQMq9B6Qzad_wzeHqDtIBJ$sK<2u;gxon|yLen&T!LQ+=uqAu}WN3lD1?jw%Wsz!d zmI4c1h$5jDUGEiPE*nA(Jt&2}c)h#v%9U1Hd>^B3CRtQA+9!1la$K;JGfENbLw zv&CXLhlYe>ss>$){vPwYBwFZeZ;f#a@UZX(dzoa#;%cgfvJ>;}7nA@6LTzunl^=*< zl@R5F4uI;9s9%>oT7D3;B|-Hv^b$UgQ`Il(vDgu`!BT}%C(HUigT5C*G7Usw)m`&r zCoDq*nLP?F2`H+5?{a5KY+Uf#aLTf)JEH^)#l)yCxrBWqEj+$Yd&Nr!dZzPRCAfg% z!Eyag^?4RRyr^S#rq3`Yyt z1acOzjI!<^%EFzU)Z?nfI4orcj~ke1@VbTQ54Y!)UAIc$Alh`rg$@q&kIYvoah+3V zZ7Q^;M>f4|{8N8A;ZuE2-8$Xe7csHD?25Xlh(os;>dK-@5IIaD#LD~WAY+*41PZC!iU!h4#P&P z6fktYp4`=}?X}`<@!Z}58)uNa4av?_sABIKh5w4Sf7rSWUtI$(>Tm9mI^2{_GL5g4 z-w41`enpEWzbg67n>+mI%VgWZsHe%&EEr(T~ zF8hGpK3+4e%=CMvn5&c|86QmCs~&$HK|+^~;5`r>y`^0~P1}G8&X-nWhGjVf2(L|R zLZ@KAjqmE)r>V8+qgLMwk`3U#h-S%3au z1pDDKwuzja&s4XpuRr@7B>WwEpt{mvVF5Ghbby<9Qd7I!jbG>AeHa27;LX1a$1`;N1qLN_GXSVl3%WOxFsf z2VyZdXJqCLW&-K|Q6Q{11q^5~@01xL>y~@k4&ql;utvXe5#btYrW$7aEkh%1c8K0a zJCyh|6X?o|h`Ke}t2rItV!fcMl@DZN8%)C}CRT4S5nel;p}9GNj(&9*JO~_Rm<}b; z+()oXz4GKhAA*6*W7fF%ox&hSn60{R`|Bg|TJV#a-@+V&S90Pe7WBFm*T1K5HT#@C z49~OJ-Sd?OhZyI~ydB#1<|31~OZqKU;^(5Dx|sxCT$y{@UGNcFS8R=;`U{^GW2T+& z@r3CZyS5GV(12Kv$#lAt=NlR@)VT5bHO3ZgxH+Dni0vdO7~)G=PKte+U)>VIwYXf8 zol8T6Ze2PMI#e3WiSkw4BS;oaU&>owj!U%{v>B4VOw{}uQ>Aobl;qK;K(f9gmtzyw zi;p6xS1|KPjllH(wij zvT+I$(pyl@vZ_TzEmltGo~`()uCQrdrxMvR^6OR<(h(J(^MilXsY9B$JxRSii}$T$ zC`M$)jDmSwe#U8D`wcn2Gz0TUNL=Bfn&;H}zscjkSq2t=fv-Fbvy46%3ZAM{CSxEm zNJ=D;sFZ#N9wBrEa<8a~eRI*u|5AfrLrjXIZ@w6IWq9k4Gr~5=C`<77B9>_cAM!?= z3oaNCj#4i()`TNbrN*!rS~L;2@$uaR-Y%s6$%4K%@0=DOknTiaCdx3rWI2tKqkb=V z1aAcDtld}Kx`>XZW}XB(Ys%~K-xd_4#-||~8uhQj@h5kz8)>vu8g!ffR$2Y7?o&WP zX?$><$)r>ogQwX|roq&n=7if()4lW5~aO^>q z8JSs%0pMNO1LgZz!-S9;d9L|#-ev3&Z3pt(?EiM$hs)P=@6W91cU^{~NhZ=rkZQGD zebPDiX>ZTwLsxwRh4jvQ&Ucl3Wq11ld6?|x?sevI(#!|*J~=JE%-fsJCNapveRdr@ zGR^Mkx?*!t@0{re+*yuSE@6hcR(pa7%u=;y{cd+)D!?)c({0bf%r9IDy=^?zTKUA5 zdiMK+Ag*1i^r!RIfpbd~}gF^;jRE(vAKUp?>IE-0Txs%a= z?rC0lJm;+66rND8iU2$gVRUjo-p$}VpZM1qhK@|qZ26be?1}_ZD-QFN6o(7AwHsCV zhB|y$p%2?-2DI;+mJ2s_F+IhZq_b%5>cOKgpI7a}Ijr5)Q)*EzM0nhRq@H4InIfey zuALmPj1rx@(OhOq6pr;oDArn0(`Pdl&c7`bO628r-47NCFS6< z-we zGoT*4UwNu^P|JM-iyRSx6wfEiG1*?M*3pOkUS$nfO7NS`{Hk+T7&V(3=%3a zUSf}HdbBa03^Q2$Ca0Rs3m;q8T^d->w8uWO7N_31c)zx^KX>P|+oyzFm@xyXYv0yF ziiMxS*}qAsvQuSKGbe`7;)CmV*eKoCbN^PqYt;-zWM&vt}b_ zi0jidH=&UqJ>+WGb-&eh$(L_(_Fn`a#=S??QpFBXS{M>rb$fW4VsaY z3b~9`U(XL$MY7kkQ%AZK(Ux7^m61=K(@z4Sw3jVxHHhhrazcc6^j`J3Ol@zxw2P(k zs`tzJ+wd`^m^9YfE1IMHux1tGly4PeID}Sx?@$zmyOQckYkcSDvqkJ`(U5BI@K+^f zba1jmF1%8Hu=y3l?|Do^fr9K2WFu=`nH1YhJxC>NmJ@aa-(tnUYiqn~IZS!q^A9EC zk~&#)hNX>22E@kJe6>Z(OXci(hGyO=mDVuxP($f~0r)BD8cGE`tpi4UHT>YNPys_~ zOmaK&yTw}-VkZ?v5}k40!-|_cz9#nGB-FVQb3_%YEg&@(X%2^pjWD4#jbllV=9@!R zEjYg1E|s*MqZNg()Q)54K=QNe_Z!D?O)D+S_}8BuGB_w9yR-($x4p;I~*#t;&KEt zoWC4gQSaJ?4uGFqX|7?pXz9E8n>SVO+Ud}l+(tWw^q#K=OW%Obcvg!_9aDIGj7vcn z+XaIv3}C7HW2GGjF77O1U%btIvi%+ZbOF&6RDD7l;L^in8Kwmyb=iA^R2_H!qg&_< zrYy{J0tU=RxN>JOY@g~`$Co9?e$$I@W63(pg4eA|+%j$0rpCD&`p{2~^_AMg%^UQS zk1+WrO~`atY+1ilXTx8}H$P|~xGpwE;XXHdY&+4r=wkmF<8-si6W7dI%{=zHvjPjM*vPG{JJkwpmR4bL)4 z80#X>ol}S=#8(@St^F|AsYw6k)xEMXHW~ci!c-$J+aMv<2%1)jX`&E zzuYwAW9V6s{_(@yO|wg1>qmFY8kdw``|Lzlr*MS<^Th#gI9R38tGTdzUh-zRTIWu8 z1`t3*MUmGHpVf4W8=vzl)4CIku7m8}Tmg!ieuF;C5lomk5ts?R`|vN^%<)zapk@va zB~Luz8b~*|*Vjv%kOs1*Qw0oGbNswl0RgZ7LWT=(~<1WX2xEL7LDGmXHfAY-NjNwfu zIEPF7SJrPB*0`Aea4ng8eAWWj@!i9%evwN@$A!uLb4{pdO&`m`u}?{n|!Hh zlm@UT?u`9#gH0_MOiO{ry`|DW#)nX39rVsE(LS+U%BW84yGHfcYwkH2GVc_=oymg5 zJgeHr-?aRxoF#8@e#rvn@)?HYTx%|vQ|L%D|JUhd$=>v^!L~~3LTXuDS3%)2&8VI9 z(IQ#uAEp9LBVn30d3=bUW@8TyJiTSA%%vb*yU1Y>etFLvkT`2HDi1XnbBg#0k!t(a z;mCmD#L8W0YQiGk>&wpZ9LHym%Vo2ETkN98L8EAkTLq&EgLq4?Q?ti72b+qz1UuE- z7u#e!Wnn0L=Lbctl~aueu~o!Wh9WV?cQ{h}5k!>LW${qzAI9@8H-B*l8poE`Hn7fj zh;Hec-47x8|B&;lR2cG6$uJR)LLyZ1` zS_e*sZ>03Em0<4GpD1%3Ko1DhA9O_wI0zez+1QT3$zJx@6X^Q+6I*BMfVQ7YnZSIM zWT!*Z5mMp`y(~U*s|*VdFZz!j2YTavcL{7x}*I?@`qLh}e_t2gNZCyR_V6eOBo}&u^ z0|W8h>YtCnh-)dyJikO|RN&(0Yf}Hr%+%yetTaYbxBp%JG359&qYp1?gI4CYK;2iv zfY{Hzo_X@BNA^B1iw4fF)#_i{qW|u}vZ_aO#~YTu72Y`|q;xuvs5OWHjweZ1$WDSF z*{yiSAjaUT^#{)1JF4;HavOrk<3Gy>6k>ESa|2zMlciKMToTd|{1Q`NeBe#W2Mb*E zI!=>nX?6Sepm0;=c=YJNvaUcQ^s7?nVL~G7zn@3sYWD#7C1HlcZrL5Y`B;~m#_@v4 zGj618Nnr(J@exkeHF*zSEcaH{z(U^Y_R}rq&!!*UA*&LpIzOMHeO3{j&{KSL>xaRU z$NDKNj0vvKzh|Y*da48bflyT$dAlDCb2R8s+S6d<2B9}NiP8)zK;u%q6X|EEAd7aj znF$-~ih>Psc*xaP04gG_zy@1y&&@xD^%P3Y~6Q5m5VA zy5weunp97%j&!^nQ$K{VC(QyiHpLTt;+0t1ZsCg}$S@VJ=La!Af2YQfOmk=4R#3m} z^X-<82BBygQhY(l?=MB*-otWZsj3pYMXMH59QFW9c_Bk_$o#xcRO}D3IMTUg2;$Kl z75*M9m@SYp*-}OcOVeFI!$-M7zwr|mOu;Qi{}?NNIf=HkP}0H6?nn_}YFR?pLb54a zLFcfZ)L!|YKmc#qMR#K`i0B-zH)_p$2hUf(tU+D>x?wm8%p_k=b4ry#_wpgZ;G0oe+1oGUKLu(tz%vwZxc(;+ z68CbZJb-?~d!{8a%Gu>%Bb}6t z@S8vFol&m7ar-sN$@0|^Y0D08joSDvm%ievfxLcRIM ztoA&$C*BWZY!N+xnD;x|XjWI-Hrl1MdH&9s=|aHDSFXrH313h2n^MQE_@vi9Xd`Im|sq)*8Vlub5}mZa@262SlbzW}1{h?ya``I!q&5TT(;YmZ^SBAxuo zyc{FTK;|y=*XMzHjl7~J+=n~Yn9;^PwesJRMnZ0_}A?)evs-(1q0Rlo@ z81?q5xAvi_$$+p4Vme zmnJrV)U6qofBu7!X`iE|d>WsTrcGP9MKUk1Bd~OKZ^inB3jRs4s`KO?7z=vvy#Wkn zQH`*@cU>$oRO4aGb^SGhp~~I1%r^J(a z$&ZGf#2LPdtvGP5nu*)aY@kkPd`kUFFPq;I)VSgH5E9cC=K`hgS6_j?*2C*F%KUbo z#VPA4=Di{E3j=&a?Iw{}MH&%V5&M`@3YLawx~6!J9ttUsF+KGcJ#OqZb3b+EhmGEjw^nLmj1e7!<&-rCBkspKKiqhQtTvr@ zC5c@33dxH1F#}t2C-#eNiD@XS?4EYux* zbBu0%v=JPQs{wtzHxqF!0rgS2sX~;n*c-4?ZViSiV1P?emc{dUaZoK??o3?;rRkfx z!$WyF+zFVV~89>aweIr0tH zMHjD-!gwL-%ijvBOBlaK#RJW+y&bad_Rmb)lB0yHFu$ko9n3kk=9Xc@)h*LjVfqh) zej(yO_9tC}FMn)>T5S7_PBBc!PMZDjTZU`(x#OAwM0{y$-W+K>yLl?&V26OSi@ahw z$k$mWC^U@V@&Rr zCwf_O9$F2{33blvCtO%eLT2T9c*CJN?KCV)@oxA_<)3z*L5T;R%C!WqeHn5rTsqSj z5t^=_5JL12!%BTEeKoP%fQ9C5LIVux;orV4@F!TJ(?pBj_;mTBS)VJMH+}7`ff$#daW;f`1_Fj=fC@U2M9O37T!8|lFV(;OkI2!Fx6Mr=FRJjA*Do_6qLDorXnX# zKx+mVBiC~jkg?yMr8|^g2(9?I>N#~ETl7Vbq3XZDGfd#BL_w?D!b&H6s9iw98euV3 zX%XFXHG~LeB=}-2 zL|=udZwNGr@>~*5S={0+bBq$I{gbNuETh>Gz7VZ_t!c*_)LZc+))ZFLwV@bQUA4Y% zH0F{kwFkI|kQNM973TkcG<{`URNwbC-K8SkDhNnRm!KfhF?559bPOR4QX)!73XDU? z(B0iN_90T|YTS7G3v2R{#&^+7bd!qGwf4|83=q#&s3!`QTpg2skz+<;+5=> zFh4T$Ux$EpU&uBuh<_ioiZ4_3hu=OVP*Cjfa{n~DqBS(FuB9|X!Wlm{ z{=(cYZ~k;yslYSU`XIpjqQNp?0Z6fPLG}Q(8qf~%qfFBaESt@@$)tVbC-EmJPe{qq zCLX$ahn7{(RcyzUOf~*40qtlvT8X@#{Hi)zgh#Y{&yC67&>?TrZ9N04WB$S8n4%o` zQIioK@89V@fp-Z%6POV;0%@GF->X%_M0fD~U*=cNJT;A-YZ=x#eDP5qRL4EKF*z^y zRtH4h={M$XyP%IKTB*sD{+w{z@~hq#PF?}KDgpc&mfbsbUwE>{hCbBUOSBiwu_ylt zaH}9#vai4VY&ar#xdpI}Rb=v8SkX>80z2RyMcX9L= z5{p&Mm7)1~y4=%`gb#@XI%msFr|ru9ILt?hH(tQNTAHVpt-v1+=c1kGofqkCDvIZG zp38o(VV_SgdG1T;)6jF!A;Z1Qh#DiwZ-O)5kO#nL(!^@oRbI{-6UYtw`jha(NnfG(Dmj`hDk^h$6EiWK5WF}QZDLN z*OuI6{}OXLV~6o^8{}6GTKriGZD>N#TG#zkMZ!lPU*mIv>`=C9Vh?sA-_6zeoj`-y z0Z7iu%;92DV_6`L{Q^0!AHk@OjdG%FkK_E&{B4l!)MiGd(_zHD%jac1=|j&gwEeDx zCVpo(9WAn~o(?4396!ssrfCyY1NvsAv8bWFNy5h{ZQSF?yev?yX;JGn<2DHiJ@6iz z@WAlwbSjX<_^;?_E9zpF%k$$lfsQLLZU&ZZwq&b8*rIj}tStAC^2 z!av$hroQMp90*f0_YH1vs9ZB}OaT)q>s}_M%0+<7WD9^xaw~ZWa^FjK7ItpBg@4|0 zoub+B3`fQ2adDf(ab15Wwri=rTg{fd4y5sg^$<3E5w0VD3pIJLa<%_h?(Gdw{yp)* z*s^AlelUDEtfHdbIhl@O7#KocAgMmIjNEHHFRLH$WWC_mc`pq`o-6C%&e8dvH4SzgzflCs~p-r?2Te}STP7zNQRbM1Jbq@ENpZUeey12Z)|-DYR~SB>4mJ@#I0QOg0bDz#JgxUYA%!dw+y(P8_589vyer8SD9;#6cP9@Sx>p-r zhubP?pP78i%t>JNtI86I*Z=!@Hy`;7^WT!AI8VKCVOIHt7SN^9nl$Xhdu_G_eDmYl z&G{`5?w|EN0DW6^*8Y3iuN(d*FC>dyns%B&MF*%S6@7C=j+dnobFvVCS8_qII^d$D zxyrK4KPSt1j_>mcNNNa><~BM~b78gsPu+uOmO@eFJo+;fCNWDg;?pUHe`50HRnhZ) zy4UBY{^}mflKmRmg>B9S4{L~nW8!!K-Gm$d-um4FMY~1|mEkN&scO37bwp0K&l&LY z&ryJ2J|gwa0ktmE8=cg!eI?ogm3CxyO%dk3V#3c~ zx$l)fZvcesST{Kv!ea1<7Z}?18;X`fRzBFDwACAqwxSC>0&VW_1PzJfl8Z~spQt?p6$yd!J?fDfzGI80fr z^W!O$@jCR`!5eO(aJyh7KwhQ8n(qpC{PIh__@m0@833sf=YI}GE8nn#klct&rV zRH}S!%C(|vFntP8v*>EXnDG^eR};{-W$OhJ^#4PGL;yhG1%H%pXY+Lw+9uv^Cf{`5X&tuc zbSUDw1QB_QcRSiA6`bPZ+$L?8wNQT={7wws^oeLB^&-5D_pD8Beb=$D%psW}=zntI z`g&O7tf)%mHASjK?Nva~Y5-K+tKJp9;;4fzc`YsiBu z&Q9ijP5zvLaQ0c2nkw_C@#VmAZh?%Lz`X>c?wZ7PJeEQ0#ZBp-T;hh+va|yQ9@d#8 z_zvgk^^40>FrHzPKHa`9Vn%oI z0MLGef7@QnntS9;;Q3O}wchLf*;V7sXQC`$I;-sYz)gg$2NmRpp6!&C9Si2k{`$R( zO$R}vGINqk6s>VUb{!qZM*kFKcM|F8T@`1D_OqY<_EF)&7k$gOV*2$ z6jh^M(7=4hmV{jQQD@dub@95nn?E%2w^#o`EbvVV!Kp9ri){_rO2XG8Gi^h@8V+?RJDg_iA1J2GfdO2FzP zqX=*FIkNaB+UD1=i;l%)KMlosF1eXzkQ(ppgV8GQ6&AlQ}bjo0;9v&?xb=~+N4WW|1x4C`NfDEXl` zL{0c>6rNuzeIZ%lcoQ>%l?d6&OuhEX^6u4)c`HG*W}p-L1oj*{Zn~`z7>J%uQ_$%_ zKIc`Xsef@h$|0?ItSfwmTSZ9Nog7T+3Z(j}-Y9SU*qlXIS|nMg^J^&}?RLNU%B+4* zy=LH|tD3rk`9Mt@Ee|NtyMQ1AA_uqr&U(=dw&wjiL}_0;cGWcG362q7YnO5qWax9u zGU!2P((Im)_Gj%hn`c!@LCXr8#Ems-#NT?fdJmE^rQV{&k-+mN{3XnG^jTW&xy*^v z-qn9o2`s7kUGmwrDP+JpJCZ9vUco_>vbiEG@ zZ^M>jMgz*jFBia&7!WbiMAxA*HZM4gLXHTE=8P_u(L-(i!v9k29HI@L z?aS!2nwUUiiA{Rzi)rv}u=|C}Z3t-?d;jZu#WXIbr-Ke#o{2|!JjR@!3q=%vx-Ka2 z6B)*kls^)7`f3MFc?DpOXf|3021N*9E(ZhyY`ad&=zUBRJ&zcH7k(~j$lb^O!3q0y zfg>j}utAY4nTB-;rvSXMGaY{LL0GfW5p7&Q$hEEXe$RG4h8`P4@8*|ogL?mVwULe2 zICd=w1-5>V}C?|8_iE91Jce`u6tL2JMF z7F0WFjEAguDqnfOk_Q$&yeNVr(lpITadM7?xe#uFdKwGCVX_vl2=M&V#d3;7VR^m> zId<1$9}nCwzIwJfJQ-gtrF8_wjIZR&CKqCr$bWT*|bo+E}7eV4I)@rT0I|hu&M0zI->P-08cIcCJl+= zDsOFd&Bxzros}hmnEM-xX(mX6;VmZdSBZ%#%XfE&F_@fF5NKchV@&FA$;e1 z8;%e9%;_cI`RaYMn9mlEYKpFfL5UZNo~iNTMdq2T0ZXG(lR2t#vZj2)j)m5!t64d;y6PT}uE|^l?&8DnZASze z{_Q6>RAb|rZw@<(GMm)EoP}tPU{{dCQY)t8N#nh0dOk4X)l=Oz9r66K9TeoSmVQW2 z~5Hi+x6N6!phft9D^GsmcF?TK&jmWbGAJp^5Ei zSx35aCVCghCGyURuea06&0h=K zy9?R0{Tcaser6vn-X%V8g+QBNEy`{OHNJ}{`m(*)mc60hKCjv(1!9Mfhh|S5fU$LT z{6(L-G%X#*hxDy_Ru;`G5y|e+=&n4)J<7OVIUR}cR>KE(+!*4K-!c8Un~j|_ozRxM zx1lM4Hu1||m~1kkIwEAZe+Gm#jb1jf83AP^{5+LF^zeOFIgh))4s-q9`iLfkcvp{F zOH%|ox3k?0)kUrhK3-A!0TL5W3fR?$k&^4^;5eLlmXFT46%j6JDZGYcAO=qi@d98N zU1!hk1zr|FV|0ylSE4G5h+D^9wM|)_=_5rIP}k&L&_bxF2+iqm;-Rm2L}zJC zo#jDTi{i?;0drPgX5slaysWneoU7&*9<9D4u&al(jPe;Wa9qHJey)xTLlZFYr~@|m z_IK**KiICP!5?IG*&EgcQI@bgpRy70y(^$n73)H6o2|(iAW_Pcy(U+hV0Mrm!=!UXD$y5^oP4a2_9(39>b`Fl_Qs~lMT_|48^GvKUI#2eHL zjogu&YG3>eI;9PM`sOE^Zl4e8$dL_!0qt?acOt`SwLW_pS#{5C4g=n?HqvdWhPp|{ zD!~zkmNExs4b109PAO$hLEfPK!>|_Sj)u+^aUdTA#j2)Wvwhn-&9Mz`t6Oa<% z+fo;^z^+{N_VlYJQm&Vw6c{p+th1T#fcv!|=0e3nPke}k=p<%?9Z__t`D z0)F`L0+%JFM>uDFR@x|%hM6S-^lXP976pz)HkmQou1?S+J z5Iosm&kC10E^3Nd4>hbH$Tfz2kHjX4wzlbJ$Cfg47`vV1A6frgwC%kRPwTwGdzn|q zHn2203N4NR=8X6!ymnspn<^DwF8fFs-hn=LJhPl%y(qlyoy&nQfyR%v?<7;Kcllx= zX6@~Z55$<&P49!jV6W8IwPx}9+v)vnRlS6{fL!-I$|1jgquhAk znfqK$x0dK`0QWsE0vMA`)G`Y3EVn2+KEIJxJ6o2f1-1Fe;N}xR7GV{@Z}BUA=Kd! zK1%xVM1KFCO&s2)Z3m{f%AiyD%x|bCz_+cbgAgzio8$R5R7>xcyvY=nXE(!OgZ8&` zm#6&j7u|r@0ylk@%FSK#PX_>XUAo>`c6I^yEMOUpV}8WnLGF--!UOhzc#UaP{^Fruat(SRS z1Lo@$d!1Y7fQ!v###GcRI--h)C!a5}jUDPLrQMF?w%4k^gtz zLxZ<1;UWC%x_z`BefD2gMQ(Gzyu+S>3R=gyo~=&*_}3YN$QuL)@&3b9K&@G` ztsmeJbId&qKt#?9`j4Wbq3K(IueWe?IE_aD+22&8W4UKrN!O~<*InELmMRT8l*sJS z;(+e44fxAYz#LF9q)VDhJGLtM;j~uENt)+&>V6RaBcG8(B6`no`k(Vng-fXE&p_B9 zO2A1Fi`lM&4>@P$V$AoB+g<@-EWqwpnCBv>5<-Mk0U zMorgCyF7!9*j+3yIuLngrQfHkZ+Z7^Eneic8xW{eo4@%Pg|5=~Xr{y|EnN4ISc_PU zafO9YB6^yk3`K&vW7(h}m!^o?_qi-t0x=cJWF)E4mM_EmUcaReZCqM%6VkRE=nu9q z5uDbfA|N7`&gjd+@wp6E%;hRq)`bjStuKPS_G@OAuj;+k|4JcH3Q8C0!?y;15X%xP zcW#@?0xq=i+P%5`xM=New}}x=o*gtFCl9+5K!0pz&gJq?mNq(FqZh1Fb6jCKGL6FE z^cH?zuSEx`a79x+&Cb84O2boRAtWrEe!dqXcV`pZG*R^8GB{|D1#GueDZZN3Wwl){33$tPX+k$?kD7+b6T0@F&)| z$74(C6G^e=RY!4=E?S)h&bN@)a(c}u*AU8&xfZu3o$Z-EirI}ZT{)$d{tB_HSeN&b z;mE@lZ6?sDfu@P(>#DcuW=;Im_b)AR3WdpiqN3l_G3}X}#_G*#7BDomb%m&n^@;UG zMhUDf!UwsSvug;FqJFqGAa%RG{MKh5+wY8k-dtv6aDrZkk199ZE=$19|OU!+`N$?E)zKv^N zKUlUNyqS`6N8}Sdyfh0=qSbb0?29{G5vsAik8J?)wp+8oSVmr z@&!`aBLwOp<@0%Zk;<+NpVS-N5Je~OPb>ZDo?KM3h*>)QCd52zT`5)$z>0M=k+?3u zTp6IZbIxUBc6Y}jWzOj(vt@3xOcxa;LR`9c8VPdjmRhxB_`5;lINnyZlT-Fg4xh$qj#=F2Jd=C7tnF_czS?pwDaYwaqm4tetg9c5^L z@2iQPUu4Gh^%Bl9ZyIJhDC7b74JQiqvPw0s6)dl)#q2ubM=~h{ULfH@)undvm!=ih ziVN8+k1KL(qbhj3WYV$#z=My#^%O27oa4FMLOooqM{1k;;f=0}pI5~d+^69e@vXK@6IvJLf*04Hkno<0K?Qa9 z%kcJ@Z^jZE(>^RT?}s<7kHDW!6J~zKsx!DXY9&g7$wlX(H1%9PTEoSAvQ{eltET6+qGAhrzcJ`Lk=pQuqxOa z=SXyzL;UDa0Zh40(J7=PbnKiv_Bu3|5+)AP{So*AUQ^|C7Nz`*PQ8WQNXfQu>40hk z4JXn>&4pb!&u?uK)23zvam| z(vi`U0>Pe$Pe=*kE29HH)9H0+nRPUK_4tZk&=h|rdan*s%3d8qbOOJNpK+>#=$3#- z4Mo9iRo%@>hUJ2*X;i&{_AsT1j$JK z;d(}mAK)b07KKXICnRFE(2boYO--sVX?~>F%qv^jje4oHofQRqeoqX2|HuqefSSt3 zWZaxD{kIjr$CF00PA*`t#nd&txxc8;n5_}aSQX@)>x6?{&nq4`SWKuX7v z{lCu%|GHp&K- z@~qTkA59w(Z^U}s4~2ngnz;TdBGJdI;eBStB>3DxpMe|UL{^3?2Anu`+Rkc~Y$^k5tzBlY`ba`B;@2tq58$P@oMhFjj~x zeGFLsvbQjxtJnz|HG4tPha=AZ@1nz|ab5$A{DNui$6she(_bNdGWh-MsCWaRryq1} z{iL+UL$(H@GA{w>^tQ9pnH@oX5jtgWmMqbum1!r zR_-zVj-M2XwzIziswAjbau&^FDEE14-h`}2AGcmp$d~4pGi3&Dvc>EP!6&xmB zDX0#@3OFHf>AJ_efpyI8Pm41&mUns%q3nY9?b4 zzLIW|))crzYVEOf>B=iAbwe!>jeg!dM*l-* zMw1plAHy-fjQm$}K(oz>gLvwK0Du-($;jPU0n#EXo{b2z#e5tnE5DLmF7e9oIKK z1#%X6k3TZ4#&yRz$ijy8&~g@6se(7L>Murv-`^3{@0nwciZhGt|EXGkb-PEn`WL%B zSq7WI-z3sd<(JB_p`{JpHg8spAyi9UtDxf14-J+@sz@_F0uV)lQ7D~je|>gkoN~^4 z&bMwPtg1Rnn2cwlP;=d#>UJYM*NWI%K;r_17&=*R_39K2HN?ODX(=i_ z$gdmF#QMAD7S?$p;Us~!0NRZr4k}JV)4Xm!adY{eyno|;y1W*Ttv?)_ zmCD}8@C;T*l}6i}`l#Nk4=9*`0(`VIvz>XpTBj?fq%Az4bmLahA|vdZsgoeE*~=|L zR$v6MeNfS2oARiuDfk}gwA#Rj$BSYPt^yOka;Ax1aKE8Bnu!SF3uLOlfNB!pk!78! znb4&1L@?Cmopv_3Yco!pnDW#X?@RE$#Tn!n!6IO|VPQXJcLDWSv5JX|=cyv%T;Kd; z?G@DFzWEyPip6EZJV->=&J>H?T|Aj{!9^&_$$O0IKcVobonH@@OS4{a5m6o$K6J<>jU z$Mkj8X*K>3)9mY`qu=_Nh(jC^=WR*(v@DFjQbdavBjazg4w{~boqv3p+DZ1W=EWPX z)}PNTjaZDHzau7KQLY*1ln(Ya`#xipj%DxYF&N`M_K6})IM97e{?f1$W`Og0Bu$jr zY%`X!R_@pRsscmPeI_-z+;TGm$D<~dJ@wwK9zTZZEe}(#WidsNowX;7SoXMqK64Hz znt?_rtR962mF3AfR02ee&{XWFhEQ6ze@RwmRr1t|5zhaL!PgqqUdeljUXU!~-e$_a=FN z4Zd+~AyEC+Nytcp5P`5LV~JggiUDz;q*d3+IO}EnX`%`|GT|{u%9p+IC zAI2R@AJayb{PM6Cn_g7oAZoAMb@ecSMCt^?<=*s}=-t-3J?a@|F}^{>deW2kM&-#! z`-;ub{wLpHlIId|`Dh*!eb6CK-*g8%Zk107a5E$oNnl-Nm6&C;;-01q{6S@GcYw|z z+{rfyeRrFq#M`+f{!Jkg_95z!OW(9@oUF}+GOt&&&3x0og#hyOU5lqj(frisVXIai zcSHm!8Zd@p7#QJDiDD6}v{zW$FQ9MSirhL}!A-AyI(z-f0!17QG$)g~m$z8A&F1sE zcb}>?KUJtWUm1APo-NC;*}dY$adf%z6EY)pdurrcGQ$>}j~l;5Q5_dj0MF~<>LrC# z5NH)m+GE)mF$q!RD1Ws~huA%N#ovu3S0cL zOmp6Zie`*xHpr;yI94Lvzovh@eb_JkTuzv?^@7*(Hz?~h>h;3-XErxm>+M~ExHqzO zKj-he0&&uj8bMWmiElz2vmd9>i(qoo2jxDsa3wS_z*$w)IN?^uXV-(}vBO#QN5+c<`AzySTNJ%J&vRme$5}JstWnxK`NOEIh&UgJe z(K8dl=uB)61$gy7j_nA zw1ug4P^`S=)7^tfyhh~Y1HuiZDK7rmT77qCAarqjSuq~SuH0@Y+`bFPQnBO?SI?jC zul2#=`C3Tp+%xfd3FlaYBH(Bgp^kS$^HiRImTzdNJ!vGH zNYpfbkes)TTj-$qu2L=auhCBhxlqUS$4Z;jb#^+%z2?t*NxPfx*Sck9Q6K3!B{uCj zu5lXn-0r51Kldi|Y5U53;$iCk#!^%Jqjx4s>}_U}e^I)ZJ<0RZ+Si%#3WJN@E6vKo z_+1=SjRAWSYro#wc`fQTGUZbnx=vyuT4EnYG{%2qo$Ehk*R#H7OD<=1mYX9(=(>r(hFpV^9W7s_VgR)S(7cDo_0HMA@O!U-+J_Yz zOO%fN*LA+X!r2eWY!R@a+`;g@gecBJJWh*9;c0_-b^LC3mi1X+u4K&7ka^>@o?WY({V7s-QCFY9shC~58Y^bNN%}bLvU#AZ0J;vc}m3C)v7{dJ>GfA%X_itmVZ-hSW??BnY zbFu;VG!bFM!0B5wv%^X{SC1*?2qe{NgGjK+IT74UiPlcrhb<@FD2mP(h+}!_MSY22 z`PGg1HIy>w>6S*BCW!aqJcQ;QiiN|BiDMcXpD5}~*nCnR<i68t_`tth<%VgCo1vy?{&EC2OA5KsiS^XV%$*FHPn?$0w@1Hq33#^q_wiDTmM*<_ zyY4?&j3Eti21NF#k*N8E`G-@FpXcA0W=5!>yp5#5y9P>r!&XX10Hg#b>PxWU zcr#F0X@*L}^czwE=V8-c7OO~TqJUw~SV!WY+Cq^;tg-8`u-iWXvKNcq&#FBp>mj6L z9d=g!?%PlVlw;{??ajlt-L-Ia9Vz6~vg$=A{QMhM`ViaI4|dy{>dM?Okb|g&5&e#? zQLQ1IFd|{qZ=C7;gs%y2#wW%V2J;0Peg|z{a*=VGd|LJ^blu^HU))nNGeLAW85ys{n)laDarN0mk17S_4DHBgb8Z zsP6eBAcE&vEhNcL?}#IBDhiLA@%`N^({)&FuGmHAvP;LNF7{!gvZZs+n&jZE)^cmG z=fwh`hEwMYiI)K{;A6Aik0_64#fRp+I{=4q6Mibbd4=Stgl<-aobLQP>7=M}_VsIl z4Xa{HFJy-$l?QHtRBh^kpLOqZ_`*alh@evRozZeF(=pb&9%aHoX6lOip1-b4g2-j>1A%q)TVKfOU~#4h@B38 z14gW@$1C_Z{yI|I4o3XA*;iBs9^r9q&ssHd^_b!@91}&`pazZZBZgUS0sr-s=(%!1 zh<=Pt_Qg19+?#38MbnuG%d=vVaob$!1o_1n=jq*1}0#B4imv{wXQv%wjb-uHVq zpJ#t9m}tFvtk@IntmC)`Xfv!lvtm53-IOhMJ;l)kS)-KCm@P2wvhUa%DaX-QsnX%xDy&)#^K=>nI_$8Xh2lO)Ufk}8I*f9JPo z+vr8wHN;K<8;`_1nv9UsM1o7tujxxA{q5pX8~^?O6JZrl|39{Am}`hT$QUOYjS6LL z30T51BZIm{h7yY#ABoIcRzJSJYW8?t$Dm80Av4Sm)jZZ*R`}9QUj-JuWfkY% zH6Djcnw!l%Y6~$mHS*HZUQ4&Jhw4XOHSVK_zcA->+lsM%s1PnO^#l`|upyuoayPdn7?)Mo#Ke2X~x|i#8esH3;n#`Z+k0j<(0;R~ZIt@Ke zBj{-%k&$3$%|O>cmCGHq!k*t=IVurL*NfGXd{B@dGgIiT86suK(-DlvO|5mEXJOA2 zWwPAt@a%2*3B1bwS0mQc7Y^#*dJJf=idV6bT0OQ>qU|UlK+-?;aO}hSq%-PzQsgI- zBJQmDY0W#;L90_N1+lf@Euqjl>I`*W@m<-`Sxp-IG$@<;xO2~xHQ$z`flh) zbTtf7-*mv2=Y6Cz*Dev`DfanBZ~cT4rUkUqzQy2dfkt+_L!(PM6-&4=1}Z$BxXRci zw-*!jPmY1g_J{R*W);IkpFfpP)(Ck~h5fK=Ra4OO9#YXl?z{5jQ_;k!`Pz2SjFWws z5GStbRf7IFUx9I{gAt#TPK7;NrgMz|RAHOKM*DSEnhZC*;u|ojznJFPb+a25-!bj> z;OpI|b{*daobAOvmqOG^Xc&HbBL`%%{0GNH3m?PcDOz{apKYg>InQ1rU0nHv9=@6q z`72&5H1yD&Dw;}>h_-y9KTdomnAjm%-`SI7%MoB+ZeifK8zjh>HxX&(_-xXi=vZhI zx(i_4&KgQSNpT-gMtA4#S`DvbM9+46_wEMb8KYmIdNp=wDPRkoQ2Rb<;I#0a$D;Rl znN5U4H*I$ov@n2(Uwh=qlXs$HgX=t2Uac5e^p=}`?C3THZVK8)|8x44+Gz&TGNk%eba5%PpVDeGZ!CSV)xzj5;zT zr_b8iN&nHy?@M5taj75T;%aQ6d4|wVj>4~ywPS~qQjtRpPgl$FzLha_^&B^z1X@ap zD@1=hXm-lKM(1iPY{Fg;La74y|t))UW1nh#6@B^+*piwY!9>jBKW3{l`nq$f*l@955)Y z@#7?PzFOOH@a-`%n=8|;IJwEqB4uP-2ty&hlEOlkt|gYYt`+FOb3%CZYDgILpOPPE(FEH9VjiletBI14X z+-Wn5{YB+jLv^*$*vzFW+p#ktu)&zeY3Il5hA-bsx%y|G9`A%t|0~lLHP(*@q^o_| z*wT;mwhn@t?%;v{D9{UlK@o)_I1k-g@M%4+g)Oa^qtG-?wVPfx-KkJ0#tmD6wNH4PuXe#lD|@f~jyG0)W-d#~luY%0D=$S-41 zcVsOckC=+rGGVgeOCxWlnq81@5P|J#DwynQ{gL%!WWS~saMfjMX%HxyhXkx)bJ z^OR$O`g;I#ar2d1U@$s|(<82r9s0gO&6G8E-~Il3c+odr;VM3aEp$>7{gJ~SK5`xo zLQx}WsriFHE45`B!2GI_vY|1CcmX~BPMq;jQ!2cyWy7Cw@xp%erCY02FN;^Vf}`Gt zg^E!^pSe6tBZ25&nc$^D5X)GnJjRY?JhYjJv;G?kqi1NJljpQ`p}?nC9a-7osoWYh zj~CU#zDz8$Zf-aX(JzS@$HKLzSMDvGxJH(wRID_@#YwY{ zYsrw%_1Wnc%OtU~6PlqJtMTWEm*z#tq^Un1JKvqcLNWQXQY<;Co=IE)E2R7Cq5iXkG} znt71<{+ZxdnCvf%LF>2$qFmS%183C&nz}nJ({w8QdP}o;j%5i^3zu(Giu4VQVnRnF zOUuzzq4T?Tcw+_#N*GUOH`oT8s{)u)A-e)Uu0;Aq0rXk_krkYuY#+^5KbkE!*)PRC zDAD_=*(np^@Jt0@M2&-W%Y|D`k=bF@c^D5ZH+qHht((}Cb+u)Zx!dadJL#Xr&)28y zt6HKJx^*fze=fE0>|J=sP_D0&EM66-=rfzZ+^2Pe*!z3rtDRNZBt!#Fyoxp%=B}FP ziQZg$`J^g4{NA=KJj5Vi4b4Fh10oI>t3m4=7F_oGmAf~D+Zm{Hy&npH^s;g4D0kzs zc|9)^XrIH6>9M@bc&R?_{1TG^c|I>X+miB&%23UrF^Afl@_eVFmroG&4x;?&8TWFs zvq=%6#$QZvshjf`FKsF^T(WF5ERbiR|6tcA2=LZdazU#6K!|kn%`RYPfHK7dOa&B# zeQx~^{pdsk+j~i$<(mcCs)&kHr2MPNRVhCF%2DTg%!6YvwGtJ`sU4=7fHm)&V2w*2 z{yPfGW6#aW5QbMkg@pFK$dB7*x9VUUm1__qA`@Fn(%0OE+IJMsbM&3b_Q=~xANWo6 zg1_T!l-5^6ve6P#y#qgdWD-!AvF(LB;scSyLz$ouaiAfLu;!SqH6*L2w3?`>b6dlX z&}&3aJk=08y2Df7KESuO%jDFtuBLZ>MdS`q`w-ScKQ&kf4NKP`G@DFFbTuGr66T#s z#4JFjxf~3sak7>|Kb+W>`^2q^Mj^>yQjd{%h1{5Es_l_{Honp)ui1Txz#u@EL8ZEH znoJ=O{0QleAY^<%RupI!_7`{iH?PFRAxA=Cm5n#fK>LH&QzD#J#1*6W)$Sfzch37B z6We7JMsTON-&qTWPt}IgWP9)$s32L&-xbyULNJF?FC!b=A-@VY=yHCfu>1WR3=X>^ zIX#?hJb|Z~G4fmSM-)i#NjI*V%8(`vQ~$TW`StV^pSmnUuwrm@SqYwWovP@2 zc)ZO_EO80hRI6Q9nWxABmUT_-uGb!jDp5}kydh{;Plt)z1AM|pcfM1=Tt;!O4w+L0`>PTz z(GyI--TUV!CNDdc{|`2|rH{)drBC*ol}Ra_bBFSH$!Fng`>y^(_g=Y2TLX}J+! zh!vOs6sJ3Z=nqUC59=eYR4k?3UhP+Nfb{pF#>CGaMakevhv!;svMGai3%uE&Cqyw4 zvg$R2*WZ!s8m6#+oE{7fG($RT-G?#XvlAuT$mqglcj6^3{&cX{xUh8vJv0iu;ZCe_ zZ=v#L8X|qp_F&;m@~bDAmr0ITtn45^p70(Sz6_pm+U=(=LWOh9c&8R2EmXo2YIRh^ zjgVh8DY4k-Q+d-WnANE8ZFDQ~_X$ReP^M+dHHh^>07#H%@Y-pf{EqWNO+N{>8tkTvk| zr_0EoB4h5@bNR?GRrMAS((V7%k!NC}jUPNGd*j+gmn3rcK5o)&FZ;6YUC1??+q29U zhy@u0y+;3u|8xOJqb;E~`3?l7Sw(4y-$v2IuPGUH>={s#RDDzUTPtAxzI zeiY&(r*%fbH&^Os>Q(7c06;1tMAm-|Ed5QeRrd;L{jasqTDzjT6s{fVV3#xAT6Dd1 zWP7xWqO$*1?rs?ssx%c{>N#0570E_fI)7EBtm0DSn)uCVG&iA1o#&g~VP_qefpC%z zFkg>}uufW7AC!-?CmSCOlZhdLmQ}U~XnpjJnaJrY%3zb4a z^zjcolQTx4_xVzQurqp#;6W1Yvf;I|Kd*EOmxqwgskH|VdLv^K z!v|YCL3K`{Jm%cgD<-c$WQFJ#0P~uPhZ6q=r8qw^D~0=2lA~8;#KWrmOj*a@sO7m% z!~)#NeM7tmd_i>6T3JGoYX(q|*O5ReUmAKpAMg5+qthl4=YEiFeR@2AE1x;9qP6vy zZX#0xrr0tAd|&aJ!Vs7cnPMny^x^3G{C! zl`W;xGba>Qm*TwnvdTtj+i0h*-Oed+m>+w%9zudYJe}^QcKqYO9=e#uJ8Mv?@#zV z2hV}$dFD>uJ2Q9YUd+30=I<_wBy3>ozq7qq&X>uK@=D2+DMw}(LMZ<s_pJzp4hns` z#BX;N0x7Vna-~bHq4gz4NZ674YP?r2Gu2()GU}r22jqKu+22B(w!;n0i7Z!&pI5Zq z4Z&j%X{V;Me3~r#RPUQK?kl9Ufk}Di@05z=Y@aRG<~DdT)odu3zt<^ByF5~rEkf0tEG--Bj`cA zgUce>y_lP1Y;=?s_%v5oiw)al`W~YY29jObuSd7uk}v6(BO<_d0z{^0%?_FB%`P^o z{kbXvIDIUcnqNT$_4QM4K~0;VNsR};*J!@>!L#fWkL8Wi?|O`WFEgno_diAKExYs1 zR|H0Uz<}6El_n2dCf27Fw7HM3BPq%o809OjYkJqf(srivT0AR%GC|yWTyjw!q_+lU zfzw3S_r`c)4wr5ujRct_4?4U*)@gV=X(rKb<_{`0vrggPZP}Y0#-|?_7^aI;#RS_H z-5|R?^gQ$17fp@ZxwWstG(8)3)T~JbW^aKxibP zqhNnsSeA#PBXNmH$yZIC+~sDsr`?YS5W!|rRZ?eP6uw>3tas#3KOhU(DZ4zf*%-aR zZ}i@J3dXmrE4iBpF(2kvYdIdWQPDufgfmXpL^7tiquiTlTk)QvpZ6OWP>s6pw&8&w zgcCo1ib|oKX@Tj-3&OcbLM=FheQ9&Dx?K!^B}m4viq4FSw^1Wq=aAv?@y|8cDOk(h zPz5H5CJ2o^d>usk5p|Zo5`kO{^a~wc${eS;oaSS1DfCM>N`)aA*QE!Ed6)FAYA7Qj zGJ2K#GDX`f(K(-rXu8RVogFGnsv^c^MGP6C8F^xNh_GH7o1xidG2SRMI%9gwL z=(9#|qLl~)xjgpmlKQ~S*F5EtG^=@$Qo~B71%j-%5;{Tbjp{OF2oud;u3?Z;`$-i& zUmG&^=DzvM+umsYGLolw)8rhhMwTcrlc?h4cL^DBclOPMzi1ni!gmtrL^WEcTMZ>E zNjze*a;v4u2_?FBHGuWe^3kc#qI8~C_VTXkC^mE= z;dy3gsPS7U=yfs;K^A(MuiT`neWIi2k!p6rtTB``SQrM7xw`3uT_$_)R0Mv z$8QbNF89Pa(?a-7fhNtfD8MO+{d`n3QBsy)JO^Bd=kVF5I8Hm$6l1fEsEibm}8-UCfir z1qT&9i!8UYl}lG87!RShvY5MDG+db2LrOk`wsIUexk`)MMcZ8?Je^7DZdon4Y9rZ^ox&AuA>l=)-D z)o(yR8%N&ICZc@ykxtU%Ykk^d|F!#yH>io*gU00~Q1U>CWS|9!Wj1r1;FIYZBm+1LH~5)2KYv#~<{EIa3EL z(?(Z1LyyS18N*u?zCA%i{2X@OTx3dK&a2~Ou0-Q%roF>VW~8TK1DA2*6^#8TF&fd4 zSgBgB(Rzk&yEt7W7JFN^{j1iuv4?qLC2_lAkIJaGb$O(;tNCoJ(RYViJuU2Fjl?`z z#%tHc@gjtpy?;!CGqQE;CmM2p$ExDi&@53<_%Sd1P{D*`bT7w{E$AhGIoE+dJC}~B z)r6+x4YGjmtsmEVx`dkTSgl_oB4Q>N(A}g;Dbgl}M+>i`Z3%DH%m?gC-*5@wpcAib z!G^#c%zSzXWGdya2%cfi>K)rbF83|tG)gJ7l?+ZcHW990V-xS)1J0C>k!rM#ZnK4H zxMcF$=k@PNmfy~ECLOaUzWIQH&6?F;g*U>dyqR6n18Bl3ooBpn2lGsd#@Jd0#lfrP zA$)FpLbIxS?jz0{OHqaphCk63Y}tOf-KKQZ&U^(*`R=qfWmE#jpsJ9D$kzG#Pud&Jva z<%&N9n>1;Y==cfSNHDt3vx4?jrywvkc=L%(?EtX%4wk~7hl%(Z~4+jwLxA&&4b zt+*@Zo=vM!Y>Tf(2YC&5Lg6b;ov?Z$O&)7D7DrL4*XXq+JT5DCX&zT?N|>gkZ^^GAESlrPV!mQ_L0a#YKyPh2YCThlp^-DAgkQ9QIPL)aU&egIf+Apl?_pBA6vie|cC^p#<*5$4|A(_n?c(IreF11y|f1P0{R$yen zIS}lC+%(P}fkncS&ewC(^=xvwCf)zq%6Ho!Mp zEUCnCw`(*w-Qg>G`P%0e$dC_t$JxXHU{%kBg{*9jBT)q(WfPh1PQBu0C)vqQXZ zX~nGp<@h-v(efLs{(Q?s9jWvO;mr|0_-C$XpMBTJAr^1dKeLrw4EZ$r2SqXfGuext z{EU3|6M{mHrq{fxR<(Kcw2W==vSSzrs1smR>%z;pteIgl{R1KBy2>{YF*5A*(|D`J zHQqMPdB1D-?%uN9ED0k^~sjv18Ew+BgZ-e+ye&r7_86KXo|L8;;QHQv346W|*Zv zsm@D1No@&_j*Cx5({nZA#MVFNP)1uI$dfN)+ZITY8PXWDXL+**3`^4AvBnIV*}V@# zh?OX1M~T~x32r@3swYTK5@<^gg23%&z`dv8u*tsr&^q)zsvtKq9HVqw0ts&<27rQm zEqEih0E;L{@G}Y?1ZIXn1VEol@e1ia-G|k_xDaem9G&;l*?DmcE|KT(NtD-G z#F2$wKF1Yhdb>>;v`>&drz~Q<#gVFFF>_Tn>trR^f9WrwUEBBkze6r4*CW?y*BS3f z)y1Cj^w4N$`B0GjXxCe~p^z(Ue&Zoj%!~`D$EydNjx)9Uz-h%Bx_f95XD;@hGuPzzK z6kA|b1$wCn;zz?Sr~|wkA8KH(F_u5`MYnIFmnR!Qb><`OKJmHkQtj_=E+M5E4aX%W z-j2Ac$Qg*?_s)!%zX7uGePRw~X{UlQS>Xf;gbincAk9ULS( z5<9#yinQJ$I!hGMHaSXhIZz>CvwEQPMRp09|CnDM(X)2mxS{~{mHMQopDG3n%@>?J zJGVF8fT<6jhnQzu%9VoxXZEn9y2~EB`6rRU2HQP<*w%!S&zA>0hrSRAJO0zhIh>=m zg2eQan#rDQ7fxz>Z}$c)v@N51-)>zx>wHKnZ~~iCmLq;MHU+&808}+3#qkoE&F74P zzT}c)6GR|SmQ8Z!FBn?Aj9yH@YxB{h&vxW7?V&5jN_kqqyr`okOcgL*IgM&9m~A-# z#3q1Y;U6S7)ytBvh`nLCa=M8k^!rOsi@vjlT2?K#&Iq2@xVY9L4YELlmBh^1OdeP? zvmxfE_=Y8ve)2gf){ca}o3-qlqfp*B3;s)IX!Ef7y=nDgz*Ja6W!c5wQ5a~{vRQt3 zMV$v5bp_;!HN9$D?$;>o^;`A+%hT)K*#j!!=OT)Lg8ALQZf3NhTYjK|ny*oWW{`!4 z&k{)6F@_PAcOSy{yRV)kL~!$;>&r5QQ7J6bZx6r`PN-yC5i(E^kB_hc#r6trY>wfPnfQ6CZCH1Bz$*Eqr<^7rf-P_%q5G1kL1tWXJ7?gM6IVaIs zOMPdmIap=CQ%mH7!!dcp1{L`o>$;|nP4pS7(4}3aDX#K`S>whhV!6b(9!pN><7KaS$$f1sui)oih4`^DPI-ZL7VI@2M1NQdrESXtf{gM9n*T9UjWX$>oKc@4iJS}^HAh&4( zg#KLYqyL#{KK_3GuiwbO5hLB!I;`4d$q>r$MQLSMXhuCLy5;!d%@O}uCec}!8HmQg zaMSW^;&Nn0wK1At81U#h)?y65#8N3d!e|d+)EGZczwCht!)x|M+3m-nO!oBOGyPWW zP9yz+L3~$uB4_5J6{JzNEe!h5Y@2$0ed$YnF=b`Sp?PV0{hs~f(@XA+Rz)idaPT4C z^;lIUc|Bbr_&eaZCrMwtY%0)@dn8|v9;jo#g`KkciZ|iE#2byQ;8I<^$=`O@N!J?eXDf zUA|`QmVAn!Qh_9QsP8GPsmtazK+j8?WW*YHR3xjhpKXxxS5BA-Yc2sUT8VxB#(EiS zbuxzJND?Qwh%~3t0%W`SkwRyj%Eq-*Af0HhV^5N2@jAs-km4-a`t#V{_qwluWCew^ z^$=$fg6U{vvjSDOJ(p1AA^O(L&3TrMS^-ab ze}}CGMY!!myfp=`f37-kt3ekS+%Py>m#J-4-s>KWducp9lrlEsj_Bd#Eu`>9zx7@~ z%C#H|)KEdpeT9BG$kc8}x6=wGn(tDYO`OS@)*qTB7BGopX8fq?&y5{jC}q6AO}(9| zq?;>+SL8{cHkfN$l-p~tD4FanlfJ9h=!K!o{PX=zEnAQV8z~+pS+Z!}l~M)BaPC41 zTJgp{fIxx+wbwZ%X}#TGE$6K33;^!m9N$34sraYL&eT3V@9UYqcu2vy1loLSm?T{! zXwVIh7V80NH+STMgUH|)o`dc`nxzF#7=5~~7rh-d@k)TWEbdqlvX?oFn2os5Sjegr zB6|9IPrYP!C~^lkYT8k=e?4G_{sXl@j2#}5J3VKrzn$ig`?3n{N0pfKcL}kJuA|#6 z9FBE;K1+6|oYXWn9epj?MCj$Vwpt8pkXGp+mcL9#Iki#UpjYe?o>Q+6?6)9!;CVy( z>F#>{0VgK$p4q1FS^138ABE+RP!>tOqG^PkwJE6aYT^w$;goPowT(;5{R11B72;u& zQAIEvA+{Za<#uumg-Hr45AR|s*D;qT>-Nfg95B^It@`zq)`{c{3JmCkqRplN$1P~} zY;CT`=w#srgvnx#$=~8=%Oz>c8{8?XaXiL_si=k5agH5=mtD8LCml=+8H)RQN3eVp;&+xO>fS)wB&#NYb?w`Hf6ji>?jM-YSK&1 zfuXU&GV1n{g`S!1IKC&tzv?Mm_V@gNwT&am-0+xkRs7uI!iwOwl|NI3s~msjUjB9Gm3THy%ozPP;kd*+j& za4%+MVz!03&!LpX%}cZ*v`@g{DyliZvrc|``|I&fze>ZRm9H9;2Ld8>B9%y{RE79;h;BF|>(y2NJZN|OO_Ma(ai3&_e-(|dvk(f`1DSH^1U^j3)m+jl1U~36GSh9A&86w&e%DkN4n= z+nix(!f&>Nv=`CMc7?UJVM#1jPr-(X<-*J<R$O zY2N&fgm2x`B$FN)JTkuFSSci#AWvJ{J+LGG0cs*~fzNK$x}()$^`Yw+?CgnkND5o{ zwr|xeW8ubj9hWP%f?l&#TE7pwKzC(sT?A3-(3#K2k{+JZ=jzVBL}&oVK+y#yS|`n` ztBuY2$04yA=Li&4bBD*B_TX%=tRa1@Df3lFpre2NfbtWqDxe{5t)i^sJ${)a$?ShM zwtd>^mFPRmK)?Q^MD08lTcx<_IY3Wb=k7JjMy0?>R@AORY5M*I?8OXD9jATj z)i0yBNbVHdfyB9i^6}M33(X=pjY50;50?JPwVaXW!(SG%)cGbouS&q_G|DiOzJ!za)YVS4s0u0zZ!q?jj{-RbZ9(=#x z@?bdxo^A~?T<4q7g*a&L>#G$9t?!7KAqubH>2#(ajUA;8)1X^KKn%h|)J>I~ao;56 zv|#9liCN@GK`w^*YBC%5ifZngX-_GKqsH@j=*+2*6eZaHHZGUGR*#;Ex-Rbh!p|8w z4mqI+9cl=lSAD<055Eiv-|)o@&&^WMg9ZXC-kSBzYUlNcSstX)W2ETXl+TASbS6%6H+e8At3&eeME7rs@PBx0I1Vl3QjHq-k ze23cA=ex*qvvDYQP_(-f^4I3k2A9KK+0zam^=mf;rHW=gA76V>x+=*Ge9k+|v&SR% zoSWzlMPwpAUI+8j+d|*jnfZ|Q^Pgi?OUYREvuTISdU80_?mpkGGOzi*t^G(v@57Sn zv-VO4eaGoNb??J#;@1u89R=tbtu}zNeE5OBUhULo9~w4#*2s7YsL^?cHrt_@0{7SH zeC*~%E;&9FJ-zdbE^@1;H8A6*dYsTzcr&4TfxI+G{W{Qto6xC4#hD6m zl}EXCJ)s%-lJJeV4=>x(Fo8*PAp#pHjfE^aAT)tA*F%aa&%xgoV6E7K&?+pmBz{SA zLm`XXd4heBe^|A>a-p~9BvLYsyt!+J2~YZi)drlJYm+2P z0xX6&zpkJphhL$T>0E`>b7+9{-2Y!iEH*Oh9pTIE4d7C0KY7mcc!1U%Uu7T%(eo1> zg&cpf4ha&EjI#mhV|6~DWDZlF3(&h=;8p_oR*L$AATp}NFL%~|(;U32R{Clp*=^&D zf|~ujSA9`KS97U+=7@PlLNkW}j5&-okcxwxcP&6qvMc=nH!pVuQPTiovhH;n9Wcw1 zzfHlqI*$^xeNo0m&E)1|y)N-qYrvJoQ&@94I6b^^(Ij9NGF$Ik1aa9H{N*6Yd@-+K zAQ%-x^$x2;KqJiCq+tW}Ga3R{hw3cFa?!ah=@^rPRIf0DItzmxW^`fs=BqFUdNQ0} zaZW1Gel8+IPB9C7s7CO^P(i2k$Q3#Mi?Cr+bi%$3%mH1&{Pc{-;4gI%5IK8`8Ig!t zA^q^Z;cW+nPcDiNH)>wf=}pw_MK|w@#;cDqR2_4#jjnhH!{H40^aJot%Rbn zmcQ}}Ie6xs2Qu6Bjm$^O+y}4L6Rqdd9jD2k7P0xTq1V<|+`^9E{#Uu@vCdTl1XGPR z_mIai$GYDW2VGQp&k1 zu$Eh^#KETFv5!BO*y~o5Am`?a@uLPP(ht0(1eJ+&z-~2#v~nVU@kj)zi$uxxVIhCa zWW_yZvzo~y)q3Pd#)-`%k+2PFXcw{29$Sq`A6VhMdWtjl3&&Y%?6WKiNc({b01#CxJjun%5qMTkcEf`Imxz81=aEdbid+R!j zmsR6dP17G|GRR6iVq+$QW0_%*8OY}cAo zk{t(t{;rnHmA}rc7Ih8h00e)iFK^N{7wJRpsZDWp&!_)5dY|HNzmpx(m`rx*;odvP z(s&Nsx2ovPqR9J}tgdt|KU`KYQ8rVL>zqZVK6{;{q~j1!zZbfNzg1NrXFXH7o0T1< z+y|EuJ&tGW*z{}f#3q}8WFp#F=xv&1>60F^OkQ0gbmXRx4BcE{s1N&>(7`73lpo+E zofDvl`Pl3YziuB!KzTmH=g=n6%3@AYyDqSKnY-(ma4t?yts;*P4FV<$L)UAimu{Br zj$NuHJdCj0;PhU2^|byU)5J48X)4Y_d|j707KU0aWf~~WjA$2_>aSqaS_k#`Z^nk8 zcmAQ5b|i%!)Jxe@6t6CB5gsW?Alk`xj+_l@V+pQaU8s4Mh$A8qwn05tZvrv3@SRHW zsBvG>I!IM1l01=^;)ByK>Bs<+>HjB^LXWkMnAYm-D6WR5+8-sa``DztgG+z#Q6oJX zlR&-h+_iLqPG1H>rWNqLzB4eo&rFTO`5EQx`CTW>Xs%YfmuC9Sq7IqEcjt52Exvek zQC=Cp-bfO*sF{<3G>4B0PG$-zKv(@8XT>@jS0IUG<$f!#%I(sweH{Kw?61pJ?Dc|r zmL4N*k416QkHmX>o!jiVH=s0Q5~_qF{7&0fO1#;ludAJLTFz^C-bQ&ven<16dsiPFXt*74{~lml1374l-R7Sil4+mq_--*_aBVITZ4~Y8O4x&Jg2=&hrE20 zihZm;Ok3dG3d%Ye&-ycIT8POivt|<_VH%0Q&nJybMFL=1A2lbVCrcCtk&&*3{?u zJ8v~S&2XP9v?}9EKS^sYR1Jq^63bKKv7VPeJg$1Eu)5-AEUE!fq93PC=5L8lKULFV zpVy6>h7z!D+xhg*ATERJ`p_dPgPk{sZim0;Qs+!QI5p` literal 36580 zcmeFXby$>Nw?7P`($cL+NJRCOcnyC>ECQ+yT!>K07${O9PF#s~MmbOhYxgGsfgi;31Gn}<44#`_h~2cU*gOtt{n07w z)GCwuTxRE@4suZRW=T{hD^AO*9rxSO8{t;z59e6xb)`oBH4jq+MjbBOZm8}ChP0QR zm}Isb{XAKo4PWBBKb08kp6Y`>zdiL@ckHv~rn%mgVtru#u|;hgOkTDvYI0i(ru?-C z*)Fw9$erc?dHh7##~&`z|Dl-h?msJR77~dH;1(CKeTJdCch_;dx8) zxxx_3Yk@b?vX42a>nrFf=Z~=Q$Qt-G!jOHp;JHd471jF{@oaIjKTjoW3CqcFABOnfQ)V=i60?d%6plPmPxYE} ztQoCR$x1Rb_L_yGDyk-@iC^zGIW;Vvi@B>5Bxs4B&Da-ZxvAEnR<}%@TfOHGd;)TR zhMj3uybeOPXseUx1m?cV?a{7z&)l_}F9yX*mZv5aeHZjrGuGHK-ot(4e$5PpzBYLR zPwXu9Q=;1^aeCzemNXND+D{J~TnUrgSCVgd-9P7CzU#ZDYdCr~zZ5ndGJ_(JD%P$z zPmY^YIe|(joGyy2ZHrt5tSmeKd7b@d9VbVC=i7`ak2uzDxtlV2uUnuVaNNjm zj*sew=50Ww8q%c(kpjltIf7?;E~XwSPj*-?O(UO>m%Udyy+TujG_&=YgfHH9cZZfZxD-(pdl2+-BZNKxekv3Hy#Lzx+@P zt@|9?7t!HN?N1ND&3HD8vDKcbKIVOg^@W-DnTv=k4i-nO)AhC`>c2ff;)@Rl4c?8J z`8ZGtE1@_E{gSdxcj9E16YN4beKa)udB%bCeR3-6lct{sX^aAcyES7E`!?d~4#pV0 zgDbx>Zk#?2$0xq{&hh0~v_Xcb_AA>l{=`zA{F1?;y;lzil7gkHlUI4js|f8g8kjS9 zyPFgx-==@Ac{0_n*1B*}yR(a#a_j>WJJM|7j%pN^!%EwTPPy3p)9wxa% zk6|;@_D@~-XLUvV44lOuap^x9o61=YVAo9Ca!^Qej>z}EJG1dK(!qS74NsLNgg$$j zwQF!__R%@RS4Es!Q&``;ka*3g#ke!$qb)^EVln6Y5~rIq(vAue1U7NcaIf8{EoN}+ z$|lp*8LV=(qO0agl8hY0*O?n0^%J_JR~_XBh@AX7D_Re`(@8-1?xk|S+rksosh>S0 ziFo<#n_E~Ce3>^@M2Uh$O|M@v-J?1`NefcS3zN4&+K%Kt+M};BNWVwMgheqY6)veT z#p6yJZ&{vLTW;>*Y)E1HB}_J+3aia$1iOz-pJeU5uuVOnsRurp8PNmp;1XcZ`_8rZ znOQsWpYPk;$>oS8_0rM&S%ekyxmqs#^4<#qEUO*OgFa72#NR=y+H-@VM@>>-u6KdZH|9l!S;e-BjUN0;bU?9 zi9uD(SJ(E?^D)U--$qwrRF65ey@RAkq{X{9#OeC1pFG1uFn(IbH2G#_O2)(qmA}dJ zT)T86vrciY)9oYi55j&_ZMjsQ&pFG*wGIYXai1PFA2dp3+VB*A{gFdL|A7dF!Reo;Uo%8A+?+(bf2(@^ z`}vA0mt~94b;>T8SkvD~Fg?#JTITyf759Db!!O;P(O)@d>r%@+KUmpU9iFYVKHhz$ z)e@*ta0N%aR%8nxCcNo9e66@68T6%H?mz#URg#p1$jl1DAtU*S4!GggTG-63Utcdp zGw@ypWrj*R^PWb$rIsZcH}o?awK1)g-YVrkXX{&8wK^v#;GNJVDC4lg>UHuj*Sr|u zdasETe(@lIkK#wpm#4j~OskRDq*qmbixh(U(ylgi`rNPD`dRKoKE4$sES#*1W8461 z!A2)pIoN*9Mr0F~jZu*;*NPNLY=nK(;`#RRYh|_mJ?CPBDHC2Q^@Scj$3zLa@Q8YWLW@eH<%ZRN7<=4oW z;ZBR)aq^A-t$i$r&RECh$#tWiR=UPF4siJVTQ>`TG*+AN*H``FpAjBKO=j`z4J6Zo zTMo#4<@`_Ph1;B4OZs;vJMIJ*z4hy;>E%(*Xi{fuf|u*dR{Z zB-p;PmF|pdX3_o)&+GN~m0ShCC?d74z$7Dq>n=`pBv&Ogny}%YaoGIJ72~GK(Tn4q zMRox(jpfz!s#{z$GnXIK82e;DdjDqC4q(06WljkmVP6&uGlj<~j;7N&lzc+7xpF!z zRJ^+zcGlG;Dyt<;sT1F#&^j8)(nu&B$)hgypeAnN#_Xp#L%?lcj*Hgat@$gr4nJZu z?pUr>YtRkNym_Z$Ibm$|jNIuhN^~ugn1;lPSk;uEYKXa6Sfo1^LrY`$cXc0J0To%> z7-NBhMI(aa1bcqn)hAL?ZX8|L zs?H`O$8EN78nM;nw{L zvX#ln$Dw<_yB>_Wx7NnXDBzqKLKQk_{m(l#L$J6HY~E&RP#V9^EZ@3tVZH23UTm$1 z!x3idqgM#Vr=yf`7g;?s9@Yzw!FR@e+Q2|4x_HY_V!*c=y!$j?T%CpGh3c(3YW1M; z@Q>sNj?VN7W+NP`g59)r3QaA^`4q-#YU5s_y!kYLxJgr4$#7fm2{#CN1$F7Yq}i=I z+~<%+iK z7u*=LH=f5jLBDCGg@1ZoBa}6eli~d*GS}Ob*DvD9C$Zxf*Nx>bwR=FgDtWKt!({WC zuHuNX8V|Ek-qm=+E2D2cQYA;(jcfQnn9cO1&$i2uN4|yyHN;NyThd`hmd@e%nJuDaRqW7OlSKDxovmSkoH9ip z)nz0vb@Z)oT}*ZZIBPC9zOsE!HNQK`L<~MCijfam{8{BuoJtjfBBC8`|6}hk6s}0C z89m4rnKJ2}fLtGZHT|3Bea{bq)>dzf-e z294(R{W7#oNEhxdinDi<&i$-1yu(iaERRE2G-``DoS957s{2cBJ~bS=wj&Tr_T^pJ zisIVV^Q3n)cj<`SUkQAtj+Su4%dR_Iu916$yu!BkfWgy!V!Rc^Wwg2@gUJteqy;uT z&{u8|%-*Xz2Y*IaUt=2$?ro=UUwUIelxxgC{&vOpPkaGN+cx#7p4QDIrq$5f@)Tn5rNja1&?Def@db(QOHu543+_x>pW2E1%^k(-F@y1yU zb$A6Vc6NSk<{WjGIp5w%Ik}7T1NzVk|5MSuzl-Lo)J7d+vh|!2%uO_Br)~{^u zmc?kCe*PG$%v2qwcoz|BjjR4(NUcf!3FLkpRnm`E<9Bu=rs+v)F?EOi&uNEHkL}AR z@5|j+S7E}(CWmw8-J;Mo(bpl$e<8EA_OSk1)m?RiJ0#8qTc4BEN#@tXtHWtd4Tyy5 zXWFqdYvYG`vX(S2rg`@+XR47LK}U3rI`cPhoYd<_txMA^Pdhq9T-_F@^QBhYacTV~ z6wPbd9ztAluv)UlMK^=Sc*mNzPN(O3cX2-Clqb6cg(z5-s?6^39UboOA1s5)ZUV6w z%-r9O8loQn)dpI7psHX5(U7olapJSGb+NYN^L26sst#CKPh@;ut!y0ZJejQRVD`>Z zEJw}lEKK&cQY?mGhycV@!S02S^!d%!Hw7W$ohSDaFD9^fUd({+wJPkpCp_?C~!Y06h48tz7v9`2_f# zocRBJhKHw;H$dcH8~Q)a@X!N_GyFPs9xh()Hg-zhcFvxx|4zcz=0E4VdbvCPWyjWr z-_Fs_2^i`DtSb25mVBxTdG?<(Fc84(om~IU0>J)nBR%b*{{_~6+Z(3mFFXIf5n%d% z(*19v|AY6xgMm>Hh=ihxjTdHns)|x9nDr%WU2N=aCI0zpZ7Tv50}Jp%#RS2;!d74? zuehzKH80d!SkwwE3>CH!g#H^TRc8-RD`y)!3@Ly(pFKdw4r*fs5(k5Mt*z{!yu!jF zqP$`tK~Y{SD*-6f4r&Fp77_b55?b!|fL2;L{`;;lq-+6FAW>^uA*culAYg0DD=c6K z<`owd7Ui`Sv;u(z#RUa~K;XZmY;7czUEH0l0CCzoS;6f1U7cZnJ1~Gt$URe)ViDpK z_^*~{j#i#fU;kU<4xpumeDAh0#=iz+bWeHxdf&c2=G)?s_gRj#4a`O)+6+{#9_MC;x~= z#ohxL@e-r+|I&J0JGXzH{xJea`@daGOn((u!pi2KMLev$?QH)p1kC%V%jSiZGt3UK z@PDb)f3(~GpTq^QCI+C)D-IGBKU-T1t)!yqL9*tdWPub`lwkf4Nsm;_jah5uj7@?&iJ zKe&Cu|Np|{$=?D0<^+Iw|Fi+l1@Kk;|LLs$g%<|G|BFBWlEeSS6#&xzyU70t-~WZ{ zf8qKcA@DyM{J+}uzi|DJ5cnSr{$K6-{|zpJ|4Mi4oPh|)2S{dym}IkoMCh)y`cp-$ zKbYU_)}jQU1>aT0*aNte?ZkYrdtHicfks?URfrPq)?GphJh6`;5@swcCM;D&IX&OG z{nnSM1^O=!UsZf8clN`w)p>?bPfC@y79^-WWd^@5#zY$tp&Wx$85$?z=uA<3B8Ur) zc>YB7baLI*KALfzG%q|tnYEZRfrV*+2_!tjG$#8VZQl9&W=0>qXMR*O?YAt2Uea%0 z_Hr9Huj{SzIoe(ty(ZFR?LZX$&I6-3UKXvVdq(HyrBALd?UAacJt|AuxDD*MvqydI zvHd%brmy~sT)PJRiz_YV)AZ&yKWi3a2Ctb?lpeKgvfZd0o#o$kUvC5v6;@z}_OwR4oL|8e^0> zI+Z+n()+47g#od%IRMLC`(yQGFC?4}=-nX~T|N5@(mMV#HW}mTQ9#o6S<7iDcQo=I zJEr#`?BUC|foIVqpAc^dkus9~4{M?FuqeO3Q)RYCNA{-baV|{ok#_`7>{PY3Td)D< zWzC*QR?sw%fnywANdLMkQ}+QOHv~}YV0!r*iJx)(S@c&)8zC|jN#}@Jg!b;J$r$4` zg)m`KFC`Z6IzWejc%A*ZZdDl6YGepkTo)K)bZ;wTgmbv0p8y$(-;oj}4gwl01AMp7 z@)s0WBd+Ss7`upoCLWNpTtabO_RGQkn^8qF0iY=wL!P~Utt!xWtK{az@UCB62C&PZ z@y`xA@BJ=k4|{&mc!xnXUq_^3n#nqOUr?^okhw^8%XIp`dIthF6cnci)*OAZci%_u zSB*(nkN>sc(>nm^yvPE5ZaQQ`=DybV2_JE8po!Kl{j|2GZKJK>*ST6)k2=g%5oi_o z)`hg=QmCm^y|mCK!fezg+a9{@)wia6SU@zKKlzvp!;k=byaX?$g3?Knw5VI zG$jxP7Upn&grO6b&Z+8bMYc(tj*FqdmLLI@ukj=202s!y87$2dUd@PI$BeWzJJ#%l zi0#tG0$PRDL&fm`#JtP-&qHb+J78q#03KM;k4JXD;~#n9J;hL1k35&Km7ie$*Dwf0 z{IvT$pk1J+G-K>bup00+NU$5?ih1Ef;E?GB@DEE4LnbI2GhKEJ(-4g5{om&Q#pM6H zLX171cD;=yP`%v9p6|6+P;xf0kuNOXrNwhpa3OB*tUOm^Iw!e!L5GD=Ir@lH1x9YE zb>ZD#&*{s<`>Pz%JdaV7JNDa`JWMGU)A~IplTd{XD0Ih1 zTWfj0A14JgZ5AdC%f2!x{(&qRCxN?Lk6)T&Cm(=9S+RnwYMetn2h#FWuFj8XK=GbC z3I$(V&HaA&Pjo%1;O}sk)fT`aN-C+Fa2Sne{8^lIzM%R0KvV9-P?~3W^uz=QV9QcT zNRavZ&|iWsCTU>u`2v{}tUcu`gJp3R|9xyMqRsh9lih~py6W!eNByc=f#s(QUsZDD z$uM^II0}}$#?$ukbz@3iUm}CKbl2WbxftFW7Dg@RHi@2T!Ce^M3N0 zV1%MENLpUuTt->6tI1e$6wv%B6mESwCpGMkjUj0>sQaAr!Ep`h{36Tu<7s7{q%rb= zd%RuR`+4Tb4hyCJD&MqcyaJ_Dxi1HuId`_pw zx=oA~O+5OWYD6}ET0@oNiOcfxc1!K6B4NqF*}oJwm?dl8+hplnH=j?$nokhr-omE(8}zmsC%4$N%6dY*|c$gyRr`(R~?rT{>OQADfZ4CEIfKFTEW;r zau}({l+8qYTAJyLy+Ry(o^-}5)RIj`}^Xrh$Y}WK z%PLJSYBAT^tSdnDx8se+VUd4hbxn74!bV1||9fGGsVK%BTYgyZi}5@-|NXjoi8q{{ zA97@F)*+Fel_xNA!A4ru7^x49=X*?!)9z6ToA@}{$xyt#%_-jE5C@g)?Y>4+N za9-1%Q5y$f3u_1Wt2y7R%YEsEXNj@+-O(?}0GyyZLAL-=W1W5(mWh}C{^!*4&)Zpq zY_X9+f)~w_Ph{x%81@}hI2h1p**}fPYP$+9anL3zibW#`wFPo%@?yQIWZ}+VfJndR zMdiQ08XZ|GC_k?6DKXZfiy^-W@Y8yVb}`4ra~ctqUzDHrw_HKEVr-10YpFpBJMiji(5lm?(96W5 zsi~onA3E3=%$xG<9}MQEMkvMB6`1msmDDo54LGGOJogmw{%b2tWsk^b=}L^f*(o1R zD_ZRhMEM-WJZxg}s_{hwvJ?H68WONNgD+NSqQ1bU)tif6?qci{OXoyw@r!<>Qb&%_ zfG1dd?`Jg6`;!bbN%QVM3TR!JwjZs9m+qM6Eq~SZ`gv)ZTil%6-1&3gUXPOuFZ^(N z48Wz{f_Y7;amiodk)cr}x8I+j8C*{uTt;9AU<|FKpHD5aycIWrg2IqYw}H?foihVf_4p7{6f9 zmKw(kP4?{iP+Iuinh!p1an)^YnBenqG3ey-a1^&eMv?i;@ufpVf3 z3H7$NFnKDnNCKECWE!ir8+FOKzJ@e{Xv6eonCpC$kvU}yVMFw>KuC)9McFHE_0 z@~NpP2KXL@^+rDdA04-OZ%*ix{7_djQs+)fNvYbeb63Lz^%)gu=1A($#2Uwv74e~= z_!5l$b>MNO1h0HozK)P%TX`pHZ>%*!t)SzV;Qj4K)ho*BVLgI3ug-kx$_rQCFEz5# zWTE8?q0q1fvcG4Q<`7XWitCq$*goG#qLDd-kMs#xd&3FEW#K|fGE0!hR~wX;URKS@AdS_ z;g{K^HIX7OO*?UDYVGWKkV~cw++Lt4=q2#F)#~T8Q5GW{~h{spFTw8EZ{q zogl#*2Sd*@dCR?H6mGK3q<30+Ht99;toNOXIO6GO%(!U{L~1UtH+zat{2MU2_(n9n>4)El^;I@p*| zHODlfNox%~Zdz(|^nG_cgy?QUj7_-Z2;e*OH=J-$YGSAm|Ee_TZ5&y<_|yUaxbXZL zQLB#u^6AvyEfjFiR{25|Cm)F&7>sjINzq~W1^TK<~YR56e?I(yA_%Y+|VU z{ZbFG3#siGeLTQGS|*slU@=PR;|CIXY_E=qzWgpg7~5ywFBfW_A}txY-FqCxv*J647@pqyVSww^5&nFl&C5U~_?KXZ6O z1WneT7UAuJ2(G0zTR;z(GN$oBk1iBd*ygpzRrnHwwB?3wV=v<7z3RMH8+k^zglSb<(A$BVv9-%5Xdd3T+3zRC%z!7mkSu-t+imaL8QHkVyJfj z!GzLkU%{z0`r+DTyFw!ND5hk2?dj7ixOYkl6z1!|3ZQ79>&<>s1rnl0><1-Q znG+yF8=ZUTvti|;Dn<}>c_uc!wO-OlmInSo8~g;dpO5;=H=2-ekZ1J1#%5dao*qFO z$RI%-|6y+_J;t}d$v}5dTsf+6Aj&1GGnOvlJh3*0s5{&?%eOOA&Y}x#uEX|Ab_FpO z&7vs@iZu*%o!=+ffiKd7bk06;7JSY1K%_n9C%=QC^=p+P*pd!VhGrx+YhzSXB?s0MMpsUbqb z1tk;cbtz0Bbyoh$qVZtaQ3gbenqk6zd7+V4sE4hNfiCBF_#QFQ8*&&-%^bp|ZRFn; z$LaM=gDR7OLtDWBAE5RDf>QkKMJZ};+TACOv~2NR6u2axS51-&2rI7nrVszZiF~&% zWH34LlG6p;jr%R2rks89+Wl9W zdYfih;VyH?Dw7lpz2CK{U6N}x2q!4Z*I3lBi?dZgsTw2?%yeYz!3iq1bE(KyyR10u zy#oUjiO*y(?xB_(zZ#UZFCTJtcLe>FLD<}h^e$%>-Ws6QDBRbuC+!9EK4>JJgM>=~ zD|bqUF{N=^({aLk*t?D7ZSkk z8j8b*jr`*50~;6|lMfgP(|!4(B+qP!w@*RH;em7N{!=?Wsfr+NeP78bQOg#**)`en zoRgXnHzu}N4k*!Z4-It*F50#4z(T^ku5}ip#brnFzFYM8g}iuFPGXusu}3^4rQ+7A zHUcNOgBZ=yYFz5*x9C7HWN!O{PVq(ALF`sg((shT?uU13@1!;S#uV~# zND@RCnVe>xn>1$$i=!_D(h+gc!h#GEm1f2dhwY|wenp<64<@F0ZN!8EZ{zN;l@$Wf zw|W_CcyM`*v#8I#95f{iMkJ`aw=>{0@w0wLpp1RF6l;D;B4XPA$T4PS3jSlHub8*i zOG_hB>8P(|+0gB^Xz*Rj&?@Iv&z-o5&WF6$3!r?~hrAHYpWbQyg#`>1AIjTg=iF;N zkF@eX%^ph^6`tYdqzZyS_<{-Jdb2$7>f!Iz&Ohu=g*G@(H$Iqz3kgY4k*$AQE9oDi z%i=r)m$9b=z-OaPdDMWwVhN7#gV@(d+(cxhEW8!2(y(Su$*6jJ0H*@u(FY}cCwZwR z@e6OaD@Cis=<-s#UVN_K@WD0x4C=$ zFOs~u;x_i=P(O?UOlZ2>i^EwuKdL%S+`}n}dN+OX+oA~h45)5sJme;SWf8UrlL|x= zhGl3`+VrmV&(9)|XQKSW{CUL@-5Ni=o)=)ei9nBrrW!{k-}M^TL?DC2GRwQqfeiW2 z1Cve{o~L*}VS2UtFrVSIfZA?Ka4Ma zHR!a(P__3ux7O{C9i^TFpc-+3C#9Mh!{=@6=C1V{DK$$y+->1)yX+x~_sI(_>yadAN;$3_`y|QY#Ygv1LkW;WN?!BTakTc6e1C1B#0* zT|p3}g6fyxuZSI%5PTc`!bWhN?C)xp)-k6$MQTNDB?%dHcK4)nPsE>@kEgcEd*SCZAMf#q2Fxa7V>Ux(P}+`W&PP6OWHi^FM##vxY`(yMNdIAzfr0DjWK-*qiL?0!xGrF0Yxb+q^XnsFN1aI^ zEDjpKdMeJA@e_AqJxj1fWS@%FvFS<&S%(}7H~8bg)>%nw`O1$b4u~!muv%BDAb@% z9WQ_rY#Dncs%eHtca-I)@`WBlCm!#^=|7y@^xg_c7;a_W~Uyk3r73she5a()L z)9BLBT2nq-L9cnddT!<*U@FZ8&2{Y6sb~3>1kwxhK||)Oj-7msU2GxMA-{ry?#pCV zu5;C?O4cH|6|UUVYV%4}bS#Sx3xNoX8@7o;Am^eeuKA38%?9R_Mhj}mULBvGICVXB zX|m-x#F4|PB=GGutiB*A@9)~Z1EaLCG0464oZjTrqmYS%K zjdD}e16*;Y;)Q|p;@5}pAKHbOXlwDu8Yus%6vAUiZK#+Jn!j0vOs}9>40|BXh3dca zdA6613KkVQaJ0~N8QXicU0SI2#;FihGU2z>0e3IYEa|r&pTLrW0b$ZG?oPKC$mzDM zDXJuy%2cfLg0U-@AwP9jNr3qU7Sl$RR!ZQF()CfKk^UO{3G3J4VZ~WyuqsV=tqXFWk5h{ZMCV-m#n{-$z=@bR}dC*oDO8)KAA=2 zW9{amO7x-+gmV2YSd9YqE_uR$3=)-~@R0rbcNPik;gH&AjzmS7(!z~$_N+fc=jFd+ z7OIhJkDC;W-k)7*pt#8KEWEvyBgzZY(T|kOAw92v$e=q*a@owWklNd1t#<*vA%v)P zZbBxK!ugC*W+OL>{NG!SHiwsc_lF45tva7_bqEQFvt1ATVFFE73~BH{-Lv*WDv_nd zpY+tNZN=qLCGk^&e5R-vRo+jvcXzsH@86jWPAX3mY%bOt72qPLo3;BePKNN$$lccv z%46+>M~-&bt$D+PETRw~X^sH`Lq?<4NYkx7AQ>@uI4Y*^_bX5AU0}YWSqOiYG?gBG zU@=Dnm6$(Ro(*L^%b2XBr^ZGb@~c!LXX+~b*>^iwF(>zJ5sBEL6F&UtrXKq#H05&J z`%yH!CU*amvN*j)BWe0_nUs-+MPoC z;lP0Ep!Njx!Zw|`vXuRCh;1GDrH1R?G(3Kyjz0%&YhF~{HQ6|7#_VcfsrYBJ3CYbn z2UzoztF}#hY2lQ6zjF7N&Pt?#N+B(9F57DQh17aK*dD8C)RsCKD|9ZTLD_Q=egMQ{ zt`UdUL)G;Ih5NYAZskj=dO$7&_0VfT2Ji$0)OvqLE2%mMS?peMv+z(Uz7k&@Kgafq z*w-jQl>j#aG5CX#&uxI3ZZsi@WHR+Z+sXmccnW`-^g~>l*B^f8I+#Glv81+hqjjzG zD|B;Fs)%y-JoQ2P?Ct0klQi)Jx@^PoH@wMm>@}8cnHjrKL){;N44z=GYYX@bFq_Nd zIVZet1jw($klL;j>aVqssT(|g6Z9cV`Mi?Nq|2%5RNK&Cr6(Re`;_tGo#i6h4XTC- z?+xfT?(Wz%XPT`N>D*!+7)TVcFY40zC?Iwtw}${tFJuOKgOz6KV0bEbV9QCxIaPqu z6L9<~qbISiGLi$cD)#F*M$j6o2Kiq8UIb2U?Vg@q<2*%!0v!gM@Z8417ut!9K;eVp z!FW2tY%%)0C(I>ll(8|fd%Ffd)!I;(Cs00Zr1^&*PD-;@)}QL}1FY5sr!-Jpz*e81 z{hr0M>`-Nex{rRQB?7~g@OJX>UqkuT?P{1$61Jx0@yL6S{EUC1WtdFt@ zQ{7Sr(Z}*7^oE)F&=laqlT`;uT~yz!?%nC&%e%*|8)at%;U*b7iJ%h^m+T98Ui=Q* z4+t-QUGI`l=j!SuF23I%;wA+Frxf#XHm>?RsdSGWn0Fxzh%i=$Zp&I~ZI-gT+>WXo zZj3;0kT>R5UC#X~HlEhKN8p>s)jFNg z$R}!_W)9Kr>1KPY{Q``*#XI7sXbveqxS)cL^!1JKLXfF4uix4$)8QD9I0bXS}m2GQ!dBKdJ__GWr$|vR6dI9 zUf>dA_BPe^lgXS7-8GhKrkv#L2O3m(78di=4x?Gf0R?HQ4F?W2XX;56G#!2#)hJBQ@4M#erCvC;dC_K**yI=i%GByU3ImFs zFJ8$%>$7lSdc3!J>zGW-+5md1>T&x^9qS(Mds?mE`vFJacJRgyW{{H#B$Py{IQQZh z<$ZLQm4>rL>N76T$>jxrLVZcl43KN7{>PN*{5{~%A8t)4;;YVm7xXoQCy&heG3-lO~Cnb zu;J8%+}BIW$fyzm89@MxpaSH)N%R{6L}R=+!dFb^ZWFBglxi~yBX~wRXuY|7C+UZV z!~0@DZd67e?gI|}TsDK&>lsm>RO*bhp#$KzFcyGlH#igyCSMy?QR+YFNU}w?rgW^k zeQ(~m-R;cIGDvWr4Q86zZi-uDVlWXYoQZJes880xIn94T;41J3%Ed}Pt20uKOwVA8 zM;b$*tB&lFtondu5Q^G7=4QB{@cxjLVb4ZRut%)(e(=*0Iol_B+pnkir9#bVM8q9T zcZPG)<(8AwS3%7YXgvfoh52ZDCaSBvkZGnzQ|kpd)UWe?k6|TpsN&*Se()|(%nH!) zfWwV*6FUT|=^;SnQCzeN8PD?ZLyv2@v9~h3K~-{AV>5+0E%+~3@pXH&#b3`y52h67 zk_{5b-weKNE|>*QD*2Ue%Uz1)N_ELB;3{Mz+Ed5gP#5q~x~~po8Bir|%IfvBCE+=Z zq!OV0G0)conVOU4kQk86_@&!316@|Zw}0MdW77)bT8a`=dLVKJ^Vf+5Z6Zms+7wb~ zvuQ@s-6Fpk=>X-!WlbK9(umhf+orXhD|3KlJ7$#IMYwNoN1H>AZ3IWeKcTp!aa?*2 z_OV*2A1L=1AwC_j-|D968j$rG;65l-1S}yu2G{+r0+|TkfGlMjy{X$*Ahw~Pj?@0C zjSydFsrv9O5I+}|cXn6K9ltn7oW zl~&35b?7Ne5+{-FR=dRsxS&0oO+11k*@QZhaXG{@PRLfqbjzgLt!@CIDJ`|QUVpcsbj zXAv=%IB|jCs%Sz}`UqXE z!m|8^a;DYDNbABk=zK+yg0BcrdB5yKAOIl>X>Aq@39MPa`D_f?G70V)qAU7c2nDL) zoF?4ugw^cED6S!iE+nrup4p^l4gVc$;*4#4-&(V zc`21CP$h8o2KGPBtji~5Gmqvn==b@tZPjgk0 z8(kxQe&!pO6 zq;B@x!IYs1_4L%YSfPJUxKmC0BgT=OtZi}8`Bt>vY`&8bgldqz9!Y5o`AEIoGn+BT z?qoPRV!H?ZQmSxT>kgDmAli>KhUB*s(Y8-gOs;^W`BQnJBYPiJX|~xS1gJVt-a$a- zIsxy-SQZR$!`zZm@3MLScX#;%1j)-3EpN*9sdu4OA59=uA4-8sw=~XIQRWa;6c;sR zd6R3kEx4bYfeuvyh{mH;j`o+iexmUu0=O4f4*qELePSB^1MUJoGc~gW18GiAB<|rB z(eLh`m*=l${5#=4A}Us@(6y9T#HjwJTo1I%PDwd?5pco?&C)&g$PX~oEn7!D!)y8F zVYovuc&}EyR?qP6s+ScQVa=X09X?w9&_LHUxo-NH*%)%~uPoT=odH>NOEsML!gX>` zTy1a0fLpzk7f*HFF?TeZ)u1-M%rDGdt6oD00Zj2>Ry6d4P|3)CE1DdUUTBbzSoN0P z6P%=|P#ylnV>1ywwPFR_mnN37zkdOon9&423w?B_Q7At9KQZXJ{EPv`d=YyN|2BYu zK|Umeci9{x7~`+U+IaGJgYQCg^H0~SN0%YmTyA+6cC9?TjW{fr(yd+ zpd%{7&=E?Py!Y~~UZzWN8JI;#8_c@tPH~P3P<%qS46LAPwD)yFJJ_%(VB9>|6J2l} zc>(dqX?Y*fiPyo&TKWS1**=vC7dY~rt#0w;=RnPei@Dbq%E0+mpGrVYw zujau$Ut*SW<=-BA+_21aur!;2euOS#&#Fe|mPSSe+m)fXs$Bwd?iKE0wN9`fxTYi_ z`hkm_E$Nb>izFc848Kb!FGTghM$qOX*W*{L&7_T0sa!b_25lIc&Wq$7x~Mh1}Ttzr8Kc>|GS_soTDY(2jbq{LC*E-+eKRF^_-=}-b* zOC)3iMhANip55ibp70E^;E6UV$cUczR?rAbEG?`z=Eiu9^gaG{BEQW6!e&#KXI06$ z(W>Pr)kx?F=Q!6R|3^{LOwTVr#SP<^vDYll&Cb`XztStg_A4-lSPb9Y*{psD5w(Za zfJ(laggrCmHJ|`8mE<(jibKbUu*1e9=iS1GkAj~8a?uVNHHPHSme}d7d4E&<)(Zx5 zEJA{;5uLX6xmhb`-;OC~SI~b8f~5nev6x5UBPcx# zMi4=Y;%p`hl`<l^h`#cd!M?`{BUOKVOAckdd&Av|w#e&15t6aVz9stX2-phI^@ zYuWlE9h;p|98I(N4`5nN)70hsG;%`#f6DKo+PmmH2lZ*VWZo(6Ua-uTv#*PE&b?;` z&Z?2>YN@2%Ps)`(;|<=h+tULBp|_*_r+zJjQRVJ1etMaQ@d zdpMX^D$CBqC7XSg4wFX`__!o{J8j>e`;kXj;NL(SmtzQIjl?r=`ik-HIBX|;{P{s0 zC=7p>LZMV6x)an%CfUB3v3t}WRHSwOB%Ux51uMmD?!&zewN30Is`EF|ry z{ybN}=dt$eTkM|vNu8a%1*H_<4uLy~`lj%&l$D9QM(lBA1iOyZ+X1msBEd`*+IF#3 zw6yST2Wr9j|7q%~!=n14EeZlEND5Mdf^@@>QVIyjfOK~cC5?0lQi?d_kV-ewAt5Q< z-5o=B^A7yJ_rCWJeiPn%?m7GHv-jF-?V)<9c(1tf2^GN3J>(29ROCoXixK$a6cAiW z35vcJH~(d~8$e;vr>WXjj8-Y1KaNjJwy}vxl-7j)9rpZHKn)5Wr>$1k)3KM6p!&ce z%Es%^3Sxqqv9!cf1*o?8IE{nl=fay>TR_p6N}Jy5idzPer>WUp(iS1d*X8m^`)Aiw z-eD5&R;Lsn^`xQofO9ZP^5iPv^>mFC7Kui9kxeV_*zi)6E+fhHxXCSwLY8gOV81m= z#>b$+OQ5L(qFH|0WSoEFVbY-m8LA5}xe|Jl?-Tzh~?NBSq+exY+I_SV!g|O)r~Fw91e%u zJ>h>|sdnBh7=~h2s>EB2_+t&>SF1q$K%(PE(ChxxH!%Yxz1O1>Ia<&%{nZ21Lm5@L zd~m2u9_{E1j1$!r)DEIzHB57}Eu7Ks{I-_OAMNVP*F7&Ge*l!ST%sEUh^z&URYsV(K~)}y2~Rt*e?}+%SZh~H@j_%$ z9U5o+zACqUxr8hFbdAXQ_ViJuxH;+__=dsvCDxKHs^{j-nLQwKsVgfpzqDMD9s0VI z9~Q#l!FsKegIj3|A<%2YvvQyAt4zAi@S!8#d zENaCVEw~BqfREOQtrO|w3qj%LHyJL{H~YMjKAk4S+T0GbK?7As=us(_E!XBbAAjrf z#0UjDLq5&se$;;$KXAQ~D8)k|NO(FimF(#OPo-C)9$(S1WEP=ZmnGcAag@=o|4EFL=-V!{D z>Z08$dQR^pY>F+9n#&5JcOsETNVi9EDTwc3J6r}BaenzU#frAL)PjpTM|MYlCaBU= z@yp3n3Bdl4Sa{`$?+`%oKih&KIlX*tD?Ku~ili!q(*gx*E zlG3V8rRC=Y*%k9LgVKodg$qG$JL9JHOVjEy#E|2PtYp_xF_(k^fl&Fv>z_6;@r`U#ZKK}6-i4Ec!MNhTCU-Vh()(m_45B3_}{6Wyb`DUovkI7i>+*f|ei-8O6 zHcM?g&L4O;JHbGt%c6bZxlV0seatev0SifWvXNIhT}7>kyzx^b}MIkk|_X@e?Su${;x0FtLZou%NGHw_B4PMyhXXbf$qWQpztCbfYMGMzcOtY{gd; zk^cNWJk%-o;0~v(*^ZexB3(zkR~tD%Bt{6Igb$cq*D3Kv;=c<1{B{`j$SUjgJsM<5{;%Rwp4ELOqeWIpkTtWRvk?{i!{n4lPJh z*^?B{-vn3%iv7_SJToqBbqsh3qA~CLFAdhMxN1<^MXqlM2Z z2HdYdOgP)>(=|h|f^9DiK1w-3q}Q`cRhfC|u5ry(-nb-krzPZxQkek{D*Rbdgv-6*WN=^bZ?b z4@4`I>&17>8Dp$Tki-vk#TBu(F`~&~_rWbIW~gfN`m@&eaza`(Uwo8wMflOGxfp>u zEww2ut{Qkh%~o^eJlbLar=pCV@K*q?Zc@ZI&mWHaWPk(!(G1_)c%R1Rsb0OuuKqYKWDoq7kEV@o7fnirvkIwI&ylZ3=N>;$+`;A`@TwyYdEc!AwX<|##56NZ z_7KB8doyRL4{6VQ?8|ij?>|IrqISP$>!`~^1tSTwPM9YCvyfsg)()ENpTlX6pd^c> zXOo*<>fBxxee=;5u+GN1dSnD$b}kx(FX`7cGNs$d*(mmcUIgWSvgpho7$$zd>LodG z=9Bnztp!%B^u(E{r5N!;VTSI0f)h!h$FlvUwNMh4m1n%XP-fQwSu^cchf;fY0)w$% zn%{8bzaHggn>SrqQ0G>OaE5-4z+nL4_$YLaxmsMvS$Nf*A7D^2Tn%)lwIxtl3w+S5 z__@s6fi_r^mN+ReEwkz=S-q3lx@u=$p-w_L$_yW%5mf5rJ9YcenF$N4Z;dY{_{&50 zqnNVtC(F|bYe2EcAIyPH%RbI!sF_Kza0VCy;jCQhrfhOvhRrp}P@cTX?BcxV=!|?2 z@RTUrtG-*#CqWL0H&6J~1+K?I;g^Bp3eCd4_{@6N^NVB4*}zF14%(Z$G>PFA`577Ur8Nv_ zHpS9{T9{L-)p2!ZchMk{ULk1W^Z7eg-{#P1j;^h%1H(1kzFT zDRoVo+7NQax{c`;_)FjCX+!JRfh3`UZK1QyPi$M`(`Rfa`Mgi~(j99p1s0~4*;Z0X zxZcNQpjT+cPs9UI)SW(pakqo;aHToAq*stoxMw*)5(@Tf7y}H@bPc9ut!sUq{s7dI z!8DSHOHs3naJaZ*JWg__-KPGGSe4AtQ!Oa2u2Eme=V@cL(?IKy4qC|P*gXX*=IJo` zpq~S-*QZ~~s^he&g19g_iFjKH0-}2)atA8XUiUkG4F?n>Jz<5O2 zqOQyZMA-;mvbCkp)vogHhJ~ zHbKHqUh;9W2tn!udBsTvb%8+er?DNym`$sPNl+HA-+pdDFSH z!N*LR-${}ak2O5T^VDRPc*dM{@F}G!qDas{l|e?MnCCQOAzO=M(anPjP>ZP(arT)zB93k)_e9O{ER|(w6M+`W=F8W@1djC7Zpb3Azpl`Mykh!eI8yS-G;%eAWuzEqc%)K)@we`(Q81BL`1_kvA|)MV>LyUAFrqf zSbv>;bEs7-bA0a6!J%mKmzAFFlKY&YzD5c|&9Fx`u^xO6#$3HXf#bcZ63t9n<7eH` zX_VTIquSqzf7Egr1THdEO$hd;(sC`H`M*n;s2_F5=ep%<#~&fn%Pcpk`f+mG)9Xmh zit)jkYWy7mfsZhmGzY&k(l9x$SGPRveas5K>9%#Ty9TW{d=n*o!lH8#aHq#+2 zidTp3gW476c*p=aCx^!PjMzf~futN1l0o7Hh^YBl9j374_MXod@F6Q7-B>#rlPORT zX-rS<84b`$6@T+MH#?VG%8)PFBs4?ZupVg|qN+4I@cKXhW!jC9)9F^c{D>{U%PDe# z?I)ez^NI+^Zc8#&EJ%265!};E*#okcnMeDoIsU!l)n}5pAH&8(99kq4$+7%!^{Tmi zSv3Q=Gjl@TnP|_y9`zF~O)(v&Z`&p-vNWb$Rv|luPj>r}<7=}hcL7TD9%bz$Z*Imc zz(QYhT<>os);?;`xc^VZ-`)yR)y2E1EV`#EDSi~k4&c~QI!16#6&;)bSSvpRJahE$ zP&Xj4>RRYSvcJZXaO7qmUu3|G+ym~WPxHDddCeF`JHm~V^HsCdojiqDHzRnM=Iv=L z%M_?$1}BuG9yTuMIY_6zZ_Z}Tr_I(-Q<9)G&Z9*h*%*Tzs|5sTh}Mng`5BS148ie9 zHHe9v44Y=GIEq_ePY4nFUDPR_s4Hw4ih5`~_O_MxuxO;I6k%WSR0GO7m`)IymZ1Y3 zaZ;MBfP)f_aIV6I0W*DMIiUFvIQPI98SX8X!L%_G)?;A+@_1jIijmt6j{`w)gT8vb zuBM<0rf5MuAkeH=%y*F>(E*i#hzZDRf|>8@`yzppk zc%(0!^LsC@AbFyIHoF)U0o)TAdEkX2xT~ajyt~7j?`_oJCuiVMy5c%E&4JTjypR+b>oD8XdE4RK=HJalh{kW}kw81(08%-#u21s(FR7z&JUy1b>F2l!1hstm%uZV8Tb4#J?Z(@ee|_l0BXnJ{+A4Il2LbS7*=fBQz<_27igJErL`oT zsY(%DrGW}aB@2ixz~-VKyjO?HVS{n|>jCvjC&0w-xtV^69^%c-)=Hcss0hD{Tb_2@ zi%)~VhjGrzlLrBoFE(c%x9RV)68m%z)-kOLQ&Z}Ig}6Y{HLEOZ5HEk?>HRFv65c)JxP+S0*3X*a4s#GxkY4D-lQocnbiTp0#K1GNJOlW&uE?Q~ zu&;4kD+RP_#GFt2@g=G{-24-Gf>cRqLM8H#(D(R_s}c4ZKPCp`mTM3RCQqw207n5{ z5JWP{n%_T2yESw{?>0p}JS=`&XhLD~cS8C-$$ArNmjiEkCst9eBS4x!T)_KLGSJL| zP07`}m8#AdFxWS{2AX!uV;S;!gG!`;KDCN8zVev99Kkr~L*SRCNJH^@dz04s6`Gb< zmvIRfi_s?$H8OQW+B5Y)h5r!chL7rkukvTvZeD1Ur;Ikh9!bb9JG11r0}pyeZ)qf# zdsL3!sR5mDZ102Z_q+Kcq#iX(GDev^@Q#soiha;9gBu)BkTJ2vf02-n0$h4KAy=!> zdy{t_hVPW?qvc1Q+p;0C@4%0SQ+CKJ>#+~ra@^anM+I=wlnP}`@^08~)u;3k-5(3| zA+OK}qVh6a0q7+z>+F++cgXC?<(Qjo;seAR2|<9{6PX=PBAA;^d& ze4}x&hM0H^SjBAl%71d(GnEK{MQa+^0|NH*Vu)yAxi>=uhcs{+bSR`)eekf&@Q#3n zc4irW=md5-_gH=JnEF-Na{AIcn3kJj*Y{fpzoDbG>RXnbB-L)ub#+qw(?$H_P+mXL z*I~UOB&vdTEJ}vmO?$@<`Hm10oT2n%r7FLM51x!4fjMEU1vKVFCtB1<3z}dsycixF@i=sBT^2rN}%`$*hjugO$%T5OOJeWOF7u;#l{+-CHQ; zhd=9_f96jjl8~HsEaiwUfU=C8MFx?WewV{?-2+SyMl@$u4t+KQh(?(}-Cva2I!)-$ zkB=X@l4(In!ZSeSN9MyJlVIxppt{$d*qzm%3Frm82-U&j=o+$(3VAwYk2!Bkt9YiPsh{-Irw(Wd$Q%fZy zoiq#XxlM0`4eht*mG5>RV)~&0H`urCqe+Pw31|odAT$YVt#Na1)hN+XbfT{V)(*A| z$%8J9-1adi6HRC9}uv=a7I(0+I>1=VI3O;*)f7XWBB^5>B)}HCy4b+-w^5yt!NDEK%06 zNB*xx9vx_U9G8q0V?~l_h9$kp$*J(R^G0=&%d>!nyC5&G0Vh7V$Jl@?nmhYvP|Szc z-weOeI1|tTHm~#e@L_Jd6)$hnJMA%~;-j{BE$SS=B4%r`s+FG1Ea57+#HUfD2}Gd) zN?KA=GxR3}zCeXjg23`>h}u+;AR?3;HX4qV{w1dWE04 z(jy1KpVg^zrPpP@AH_rj1)>*ksDd_gJG9G^{>+5w2%6FtuRdlIXQ-)E#ZBw2aUnd3A;5z41_G8 zj{l0oNZhIu#u=ajIA9haC>AxKr6Z?Vn8oh%2dpBMxe@l};J&c`=pnN_i5!FHlsJpW*5?5zS_REc)f@iVj=7P8<4;9Y{6 z#yn}hxKXRe@_D@Un$VmH-5&h6aXi_-hKC#{ooGxwWFpHjuK@}Fk9<((GA^aD+3l$E z#k)V3&T3L4KNKN;pdR`)5Ytf_=C;dfodOEXh#P7)Z!Uw1_7=WjhB@TSR8^_MF8Mz< z9%5pL5ve5=?3!GGNIOP7WX^4u$*r8K_61L}0UsW+x7Pvl9~_s^@nIaMNfgr>e!6ul zWEZv3({g!*>^EMKWhUg*fmXT24fz;ymHa3U(dGgs^x~^o&$C`T-1yR%Nr3n`XUvY? zX(wM=W~Mwtny<(4C=j^Z= zC@^PyE35JLoT!9xp6!QW>oV%cTpeh(u6Ywo@g-nRVOt-G<+5fQ1mV29JK))=6iS?P zs*kBGAR2;kjbXt|m{{Y;R6qjLFk1v{uYM!P2uy}@Q{Ezk;$A)QbDCzkEwH=#63VlU zFJsMh<=Y=?#Q=SrrS7RSL_;Ia%9JLr>7m&en(E-fRmOcQ>*KEzT2QD_CB(tBD&9?z zi8*>0_L2+aWhl=iQKoFIo#5rK1b~D=hx-#BF@b|BJhX(}7eHS6tkwes)5(_4jcX>- zC}ynu?*Ux6r*r`SKi`r^^9OW%`UM@WS`O-o8SDLfQZx zz(i|LqM0&=gN6!#rNq%9>o{4J_Mu*lEG+GAulp<;!oHT8<}h+EY|2{uB>j40Scbff zG{F@?;@=A6lu-8XNmWO2G=j8L=zy|}tNN8x$WZfON=sKt0nV*PRM)R>>2~%qZjCQn zA)|Tn*Uuj)b^&KR));H;xJua7h+1^4s4%s2Nq(fON!kWnwL?q@DYU3Z~K#j&meVMOLaC69^TeqP}uh=?FlFzcRYYK zMWF@eJZJ!Vi>LS$EsZl&AL+E3xGb=VgMR^um;VNAW7PgV+QZvAecBdT!){SH-=?A=Ej%%MIuNM`YyncH0=+x5 z8$zDmV!Fm&sm?4bf)~Z6_lo2RXC(dTOM^%?-bkX@R7<-9N@ImUDpPLoJ-1tbp2f*O zepbkdDhcR#K){K}vM2)LZ76GQ#%7n~Xbpn&N#FaPpmjxFc2S&L-{Fr7A^4kz_|fpM zE8$_`CMmk~`yj^}=^DZ>-K;E&Z`$>+4aT(XQc>?n87RiWD2d#Vrz}~e%@WE@_l%D6>$_AMMcsmrB?w{uB29yL5&2h0+qQ26 zmeVpAtqSK_D6+->x40VF84X%a48B?N{Vzq}yN@C|ETsgW;ALjRyEMG*snKWblf=6+ z?Pv*EK9teQWhnC~PJ7`I+NLsq_uozs6%hw8mNgVq$E3p!!2$gsV%{G1?x;m>@CBNO{$N9aK8x+GRhwamDH|G78NXlg;?hQ6 zIY0sS?r_bo3=XI!Re9{AL#0S$l;aW@Yr!d6$Z5z&nNmZVGHSmfTVIVZ)cMiT6I=cH z&L^WBY7H}6AyqwV{~Bgw7(=2s8G)GrF|_gVOCv~nh|ll4L$U}T0-d_IoHHJ0OcVY& zC@!%bZ4Ou<^O<-h=P*LCE3PKJ^i7vAXKO8x%yAuk_Y%6wX-d7957 zMHp+tUda<_)3$e+D@w|9Ogg#~PxC-kC7XT|5CJzqCm1-CYLK!bu5k4_W+$%cEZSx) zK>k6gHnT5=XIl&ae&N^tAy6G+t}{_nGUd}7gic)bkyK4?Sgc^79^Q(``pgu#A{3w2 zf+&kaiM%TYSF@=YK{)HRa9yJ++iB+s@(Gl@e>lA#RiWIXy^pp*N~&o86A+rMHEqM~ z>X8K*US^;P#qE;yU2EMe8TTDUmLN3I=DakajF=(duO}X5s-yeegi9by0o4znGLKg_ zY<}rL`SAt;!GhFFZLqjIVZCPI7JP4DRDuu?sC3eUT)3|Kg{e#^)ubl0;6{GjLp!?# zZZ&Y%k0h48iai&|jkWnvc%P??rVv+i<5iAM#C?biz)8*T=Ar+2+t~(XZRM@g%MBkz z-L69`hz3uzo-SZ8Ds?5?^_O|JpiQR*1^^@d@@^Wop``{2!MD#rO#_pWp~6MU2OK|T zNoIPOpOKHMlG;KlF~@(6b)LZC&OTswPZDym7D`DL=LY|0P|q9`xD>D(06VTbL4kl{ z@t~rA=Mz^ts0mHu{okdh>a3@KqpVH9IGbfbw2Ji6rMpl3KpxKYLMkOZZypl`CC~?H z3`y7t3Ij+bKxaalyT-8kkP<2{fRYPz7i-v!RWFKPA+Q@;RSu}|clWpB_8i1zK!)6N zE84s%2fNc}eqpNao(KQd090)-1+-?VZgg>RuOsFd%zbv(!wgGusQK@V#=YvwhU~c5 zbyd1U2e|WWjK)jTTazf7$}!c$P=1zMYYSSG0MfxLIk$k8dLNy zLsa)^t{jo&^X_6FVf&%o&K=WclWSwp4iJW$9EBO)R=lwgPbZfh8(s{&z=?W(sK4Iu zHXVxdV`PUdf08O+r=sZfH*Z|fBlXAbz~!G(m+(@vm{Rwe(nYUzU-z^NZ^r2h0*lF7 zOhkm~qVGUNc=U6(FvnBsbnJ_RI&>5tl|VQxZTc0Dm6s)iAOzBEwiU>;=xDybE zIqc#+etQ7Eq~EgFH7M}gtK~65@3n+13V25K?8*T3`X3Lv36kI5cFJv#xx4gr2q8BH zd2tbh4E#6M*K~hU2rkqTQa};zoqt8#4Gj;v4c>8z;()uC*$>%Ku&^Kdt^5}04SfhMgCGecdX|-fn?_C7{#xq%xMB|f-hS%8{kkiu0hQm17|zNA&@Ikq-r}<_CIS^_`TxCw;w=2{ zD~Nw({}CY?YM#`}>MDenH+Q^B16uhI3e6vGZbriZ{U8hQz#T`d=N?Q}S$^5BI$?#% z?~E)hr5(>Yrabo;!?XXktjeCWIZ>+=b2De?dC^$7o@2>6YVhTG0df7DBgM^W=K7rf zlec3i&s=w$PJ~=wlgAejLBZUsW39rsI9^3O)&ly&N$n}zjiPAX6Hd7o*d9A0$s4nE zr*@v#3E{}{ZeEL~K&Zg=p8Oz5;f+$_?vmL)8+q%uxVYN$bKai*8?T+4A(o2iqQirm z(~bI#fL`}(uPu}M^ft*!p%YQ88;xlZ|@8#SA)op-wY(OA_xg=|e#>6DakO}NcYpU)4^j%GkH)+*nLC|If)pf~WZ z7du>d*Z8;N6)yA^yH{K*uU@ug9yXL;!0K!EGAx~X)P%e1?Vky5*R9IwcrCwL*;!dx zacqK)uAx$T#`L^Kx;XX3h@^v=A}7srt2;kpTbn?7Wu2X!b@W!)dW-6vZLB)BMNg`( z{>74_&YNc$)pOpQDzGf58MvHIsvWG}*yxm8u+#Nk96s-n&>NL6pUU_mbVy&j`-yFM z9_Q0DHmcaJuFc_|#L1GF@hXQJ*6SHwr-S@a2qymmZOQ`rA`pW0sf$E^EP zeu^ods?rd2wi-MTr0CbMv))%1Mxo>aeS;OLw~ZO!8`3&|AL#;!7rS zq?^~CzRzXbTR&HLf3JR&U++4y+`3*5m|K~{s`IpGZ{qoB=1k`3WlyN%G`1RxCG)=) zRM9@s_s-i>1vi)Ht4FOOu5oooi8n)=30L`ZjqiH~<-N}do?x9bT3sW_R@cgGUrXPd z2Y3&Re#wdubeD+VRSp+Gww{}%$ZMnpu9Kg zdZ#Bhx$+(xSJgMZ`Qx27wL3OjvSTIyYsUf2!(E*IwybXOdTo7myR?(&a+}nJJhQGJ*iY0+Qn}We_wG1Xe#y-h{Cvh_wtqddR+Y_lJKL@6xBOf!y3S&)ylKK) z=gqN<@T=LAH4HT`HMX0mQDho%Lcv!u5{vK@--y-dNt?cU&%NZM@m_Cb7lRjngY4Sm zZNP8h`c@zZI_pwnlJ;RjJ27%2_by6Mo}hPLUjC``ZV9M9D@QtAeN{sq4(jF_g?}Q) z@K5noFm^7z`VCHb+`-%52(VEl*7Yb5-pf8gHtu+(j+s6#%G((R6A!J>&fL+n`>AVp zPIfrPlM zCBXJ4e-w7fyTamPGjccjt4_8dOWiZt+NCr#^QQB!77-7j+`Cc zxmjl_JF0W%d-ja4#G#~mk*?xyPhB787mjYZOf~+bGS{yf1D?LlbAI&jhu*~}&-Kpa zktCtP(pQb@kK=Cyc0%1o9*2*#37_d&*X|@qwg3Sg_|5q3>C{5+gZFOZxk=fDm!tI- zZQrcP0V*7L*1fQzRWRr-@-bTXLXd8+`@SmS?QRjgo)sCnIXzHA0_!z;{TeGkaHsmM z?RBc&V9oVBn}77#SCr`%(VRWv0!a zGtI=~S+BR535Q6xC51Maz5S0SUtcec%Ox|B6iOY3INg&Rk-p&iQx6K)2C>^=od=)X zxrp9dV+n8&{;9<~D<$w;_0rwzV2c-ddscWkcAL1hOBeRBiJU0s&)TAXK}9vPv5`~L z{uF$DKJA@@EbuOq6I@mi*!Y(U;?_PDodMpS zo8p3+c}5-k^|SM@F*o17xp(c6V__X~oqS84$_e+}udP0xU^=W;yYWpr9x}7&rg=di zhAQN#b^5REMmPEN@S@D5)0CN3Jqnzn7Zeq1CCN8gtmoUjhs7~}BYSe|j_4W16{&P?;c?A4enb&euZ{NzK?aBvSZt(A#OZ|=Y)w%8U z57x?4?TO#_etA>g9+bC!p<>n}N7&`Kja#TT-rv`^ZuQnKC@*(w1g?hZHZIh(|Cw?6 zp(BdUzQrHa;nXTs*wjUMbEA;lx=>s1QOb2eVs9M>2M2OYtc2v5T8W$8x(bT}3S$^9 z_lKo{PS(D%Q62CD2j&e|I99`Fvu8QZJ2UMD4GnQ%;#Eeq3v9hEn8?xn&}FQE*Rq~$ zW#{n8u&RRleR}p>(Aj2m`edqIjLJNvSqw)&{9?zO3gcei_b(!wcnD3d7O{p8W0eN* zC;X>>$G4`9Dt$V%pytlurwTc831yDUHJ zd$;zr{>bb+?#s>1*0j5$%CK+S-cD8c)Y8hz)ss(B_y=q}r+Kk}O6_YxkL$B7>EK9z8-6`@Gae z$;-!Bh;pI3f9iSNRXe_Fyp!nQwVL30+|yXhtP=F^0S#?hk?Z{1$S34K%u!d4hL4(y84ad=@gvvY zHe^N}xlR~5zLKo(U^3`rBlUkzw$C2!*-4*c;6EVAgfFG(GFKjWjTCwY{JQp6VZh&g z+%*>Kx-x4=$!0qxX6jbXm<}Hx?@6rnO<*PJ)@uDOmg>5&p1d!DJ!x*ipA!=Cyrr1= z2fh*m8Fz@_3Ufx5UN)n|eb(2n{T8nM<6JKA192GI(tTGSaoZoMVWy+L`<{@{>OhvX zkRFq~>W>Q5wAOO_+}FpBPKceJV~8I06!O{KGl%fuDF^Qh;kXVvh-~ufn9Z3p($sWO zYTCjNTm!|G?%N`RbcI1?Nf&CQ&UM{!T$w8T1J)NFGWG%$-x530a>lij2h|><$~5pN z%AK#ou)DXu>9EbC;i1)y`Xx&3i~E$MsgeWU-p)FAMx4AdJ}dO|VN2QtMXa_>2m04E z=M^C=W|9JU2wLVWzm6<|{fh?VG5tT5=B+0R>GXY4DLBUuK1ncNXMSN|qG;Jq_6kSE zm{n_$s=$5z{O_-`&e#te{>{zG(@_yAQnFI>7_**X@si58WbrAF6jCDeL%xNWOtFAM zDrW+vFn2ghp|xtdRE%>|Uw_`YMxv=fR0^r8GgtV{5(DQzu`&smIF?t2uN}j)!j?vd3vT?zzRphMnJa&nFJwHi$$RsxJC=mQrT3^PA#bK41R+v@# z_K_3C9F>_5b}GY>B^SHMYQ2G?MHV?PuQyMr6Qi5vsaSa;@S1FXI*-&IGCfP-m8PM8 zo%G@Sgydfy;(>Bl+#9K&cXwCG;n1;ZjZ}jtM#)b6LchzZXz zRpM}F>{s{=7I30PuVpN|t3X3kOgDm2+*eYd1T3S+P15qUMK#j8b$N! zctD+m<7M;K3;t~4o6|XOw$nraF|AD3eYTzE3?7R`(PiVZ$#=Xs zY<9tN9E442sPGVRTpOB*)67g^5ayzbVenH|F5zNiEc3c%R_ZC_ z;(0>d<|#6{XRG1G&%<`MZNdwU?`mmkMCnaa+qi#pDciy+Yvx@37|bs%ADgvC*2Jpw zzemnV^)4-b5aE1BMlxWV-_mzATTp6c7D=#1RZ3?RYNm;D6c z*LbiRM)vsR{F$KJ%k1`bp<>1c(@l?y(CAMzPX?Nf=yTnm%#E0rIn^*CHs2aqW0|Y--~Z$ZzRPM6@}{GKb^GesX2l{kZfzaf7+*&pIssaurG zb{d9vmRq2g_^ud--iI2Cb4PsYKevsxX<7|k%7}Q1Mdm?}Dd+iZaQWry*Kcgug0&CD zEh8eL)1&^>N8oi~yhG@S!uOb}sA238+y9mw=O2YrfiFhAc$vsR&CPFR&aJbdkpG4L z<;$019hf}a0?hH#8IOhcBS>Y%#l`*Lc;NLDZSGjs)7^WJ*r1>wGzRKQ^N)F170356 zpwaG|>f<~KOw7~b) zy{vjT+~GGhM+`+hOVM(PpM`d^C?v$i-HL^FPPu#ykP{`Hqo~+E4=iPEx27wGzk{m^ zX;2k6@N#vI-tXS;9&t{YSwa_?!GYEc$KHOZFlggV#GY3tRFWXlhoVlz1hsWqMZ!LS zn0b-d=LvVt5o2TksGWll_8)f&~3%v85S`!(KA2PK&*^kMiP$M@-c|L8N z-(ncmPH{1rtUt;FsSXN~aw)cqzah7cY{_}Yt6|A@RrbU!WnczVIew~5Yem$Q(h22u z`U@<0FITx*L-X~1k0Zdo6A;iebbB<&{#xpESO6QJ2oG<4195WJyB=t5-TRzkU|y8V zJKyPCmTb5|E91B{e>izX*iA1{3``Bv`I_fV)t~%f^WV0K7O8I6n#j^UQPk_FRlTJO zzJCQFnR1Ox^#h5dxA)EXlzc;O!a%1zdZepl`T}SFK6={_U&04r zB_r7Fl=x*#U$@By?sN@hX0mVDZ+B^{r0^qs887req}^U`Z2szyqTm}?^8t;m33OW< z9__4_oTu@5Eo#?DH4BRZozbS{Rs^UBxY@4!?KfNNTMf1`J<(fPvy0C#iDGv}O(JB)s zTDw{8_MtYP2Y#>Fe7*gq{sl3D`wtJ?x@jOZzuOTCu8KPB%#;5bt&2y+)R-LW88-i` z4K*;*C)zLPrA*k z(Ef+}`3>cCq3~E}Yu7qi;Vz6%_Q?ArQ(!lKN z*2P0bn#s*SU+w%gd-s*l9oIFrdqJgh0Vn)&W`c6FK3C~=(WjJ&o)xTDj%#h;C|@nyqe04@$6`I=o6uy!_{(z3tAnR7!A`Nr?J zg*WuS{kTNU=P?(8emc=W++f$aP-H!b#Xa6 Date: Sun, 20 Oct 2024 03:44:29 +0200 Subject: [PATCH 08/17] Add comment about updating the home widget preview --- .../app/src/main/res/layout/music_player_widget_preview.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/android/app/src/main/res/layout/music_player_widget_preview.xml b/android/app/src/main/res/layout/music_player_widget_preview.xml index 64dd4dc3b..d9bc9f7cb 100644 --- a/android/app/src/main/res/layout/music_player_widget_preview.xml +++ b/android/app/src/main/res/layout/music_player_widget_preview.xml @@ -1,3 +1,7 @@ + Date: Sun, 20 Oct 2024 13:29:02 +0200 Subject: [PATCH 09/17] Fix comment Co-authored-by: nt4f04uNd --- .../main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt b/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt index 1f3af3595..ddc2ca83c 100644 --- a/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt +++ b/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt @@ -55,7 +55,7 @@ class MusicPlayerAppWidget : HomeWidgetProvider() { } /** - * Update all widgets to for the current playback state and their widget size. + * Update all widgets for the current playback state and their widget size. * [widgetData] contains the current play state and currently playing song. */ private fun updateWidgets(context: Context, widgetInfoProvider: WidgetInfoProvider, widgetData: SharedPreferences) { From afd7dfef7a484f889e011486610b7039c9a0b48e Mon Sep 17 00:00:00 2001 From: Abestanis Date: Mon, 21 Oct 2024 01:05:06 +0200 Subject: [PATCH 10/17] Improve comments in test --- test/routes/home_route_test.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/routes/home_route_test.dart b/test/routes/home_route_test.dart index 312dca0e0..865b90733 100644 --- a/test/routes/home_route_test.dart +++ b/test/routes/home_route_test.dart @@ -136,7 +136,8 @@ void main() { testWidgets('home screen - shows when permissions are granted and not searching for tracks', (WidgetTester tester) async { late AppWidgetChannelObserver appWidgetChannelObserver; - await tester.runAsync(() => tester.pump()); // Wait for widget events from old app start to process. + // Wait for and discard widget events from previous tests, since we don't wait for all async actions to complete. + await tester.runAsync(() => tester.pump()); await setUpAppTest(() { appWidgetChannelObserver = AppWidgetChannelObserver(tester.binding); }); @@ -148,7 +149,8 @@ void main() { tester.getRect(find.byType(App)).height, reason: 'Player route must be offscreen', ); - await tester.runAsync(() => tester.pump()); // Wait for widget events from start to process. + // Wait for widget events from the app startup of this event to reach the app widget channel observer. + await tester.runAsync(() => tester.pump()); expect(appWidgetChannelObserver.saveWidgetDataLog, [("song", songWith().contentUri), ("playing", false)]); expect(appWidgetChannelObserver.updateWidgetRequests, [AppWidgetControl.appWidgetName]); }); From c80429d73247b30cbd0367cdbdd8a7636dfa3e2b Mon Sep 17 00:00:00 2001 From: Abestanis Date: Mon, 21 Oct 2024 01:25:17 +0200 Subject: [PATCH 11/17] Add app_widget to logic.dart --- lib/logic/logic.dart | 1 + lib/logic/player/content.dart | 1 - test/routes/home_route_test.dart | 1 - test/routes/player_route_test.dart | 1 - 4 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/logic/logic.dart b/lib/logic/logic.dart index 60d8e40f3..e27606ae4 100644 --- a/lib/logic/logic.dart +++ b/lib/logic/logic.dart @@ -4,6 +4,7 @@ library; export 'models/models.dart'; export 'player/music_player.dart'; +export 'app_widget.dart'; export 'control.dart'; export 'device_info.dart'; export 'palette.dart'; diff --git a/lib/logic/player/content.dart b/lib/logic/player/content.dart index d196d378a..c91210643 100644 --- a/lib/logic/player/content.dart +++ b/lib/logic/player/content.dart @@ -5,7 +5,6 @@ import 'package:enum_to_string/enum_to_string.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; // import 'package:quick_actions/quick_actions.dart'; -import 'package:sweyer/logic/app_widget.dart'; import 'package:rxdart/rxdart.dart'; import 'package:sweyer/sweyer.dart'; import 'package:sweyer_plugin/sweyer_plugin.dart'; diff --git a/test/routes/home_route_test.dart b/test/routes/home_route_test.dart index 865b90733..c30a2ce00 100644 --- a/test/routes/home_route_test.dart +++ b/test/routes/home_route_test.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:sweyer/constants.dart'; import 'package:sweyer/routes/settings_route/theme_settings.dart'; -import 'package:sweyer/logic/app_widget.dart'; import '../observer/app_widget.dart'; import '../observer/observer.dart'; diff --git a/test/routes/player_route_test.dart b/test/routes/player_route_test.dart index 7290f313c..b74b54d9d 100644 --- a/test/routes/player_route_test.dart +++ b/test/routes/player_route_test.dart @@ -1,6 +1,5 @@ import 'package:back_button_interceptor/back_button_interceptor.dart'; import 'package:flutter/material.dart'; -import 'package:sweyer/logic/app_widget.dart'; import '../observer/app_widget.dart'; import '../test.dart'; From 0c43ef61e152a0de30ba34f82d2db260af37878b Mon Sep 17 00:00:00 2001 From: Abestanis Date: Mon, 21 Oct 2024 01:53:43 +0200 Subject: [PATCH 12/17] Update home_widget dependency --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 460c139b2..3475076e0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -588,10 +588,10 @@ packages: dependency: "direct main" description: name: home_widget - sha256: "2a0fdd6267ff975bd07bedf74686bd5577200f504f5de36527ac1b56bdbe68e3" + sha256: b313e3304c0429669fddf1286e1fbf61a64b873f38ba30b3eb890ef0d7560b12 url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.7.0" hooks_riverpod: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 3631bc941..5a1de5cd3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,7 +56,7 @@ dependencies: freezed_annotation: ^2.2.0 json_annotation: ^4.7.0 memoize: ^3.0.0 - home_widget: ^0.6.0 + home_widget: ^0.7.0 # quick_actions: ^0.6.0 # TODO: quick actions are blocked on https://github.com/ryanheise/audio_service/issues/671 From f5d4d07f19518cf97df33f8d96d3d2d077f0c69d Mon Sep 17 00:00:00 2001 From: Abestanis Date: Mon, 21 Oct 2024 01:58:52 +0200 Subject: [PATCH 13/17] Normalize string key naming --- android/app/src/main/res/values/strings.xml | 2 +- android/app/src/main/res/xml-v31/music_player_info.xml | 2 +- android/app/src/main/res/xml/music_player_info.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 772715150..282b89c5e 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ - Music player + Music player Previous track Play Next track diff --git a/android/app/src/main/res/xml-v31/music_player_info.xml b/android/app/src/main/res/xml-v31/music_player_info.xml index 6b573c385..9d734b753 100644 --- a/android/app/src/main/res/xml-v31/music_player_info.xml +++ b/android/app/src/main/res/xml-v31/music_player_info.xml @@ -2,7 +2,7 @@ Date: Mon, 21 Oct 2024 02:19:02 +0200 Subject: [PATCH 14/17] Use `resources.configuration.orientation` instead of bool resource --- .../main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt | 3 ++- android/app/src/main/res/values-port/bools.xml | 4 ---- android/app/src/main/res/values/bools.xml | 4 ---- 3 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 android/app/src/main/res/values-port/bools.xml delete mode 100644 android/app/src/main/res/values/bools.xml diff --git a/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt b/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt index ddc2ca83c..95958413d 100644 --- a/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt +++ b/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt @@ -6,6 +6,7 @@ import android.appwidget.AppWidgetProviderInfo import android.content.Context import android.content.Intent import android.content.SharedPreferences +import android.content.res.Configuration import android.content.res.Resources import android.graphics.* import android.net.Uri @@ -202,7 +203,7 @@ internal class WidgetInfoProvider( private fun calculateSizes(newOptions: Bundle? = null): SizeInfo { var maxWidth = 0 var maxHeight = 0 - val isPortraitOrientation = context.resources.getBoolean(R.bool.isPortraitScreen) + val isPortraitOrientation = context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT val sizes = appWidgetIds.map { appWidgetId -> val width: Int val height: Int diff --git a/android/app/src/main/res/values-port/bools.xml b/android/app/src/main/res/values-port/bools.xml deleted file mode 100644 index 1e704a1d6..000000000 --- a/android/app/src/main/res/values-port/bools.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - true - diff --git a/android/app/src/main/res/values/bools.xml b/android/app/src/main/res/values/bools.xml deleted file mode 100644 index 18932ec2c..000000000 --- a/android/app/src/main/res/values/bools.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - false - From 38efc38f93c96e811f0da75fd89221046a267153 Mon Sep 17 00:00:00 2001 From: Abestanis Date: Mon, 21 Oct 2024 02:26:18 +0200 Subject: [PATCH 15/17] Make some AppWidgetControl variables private --- lib/logic/app_widget.dart | 40 +++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/lib/logic/app_widget.dart b/lib/logic/app_widget.dart index 3c32032ac..2ccfba2fd 100644 --- a/lib/logic/app_widget.dart +++ b/lib/logic/app_widget.dart @@ -10,41 +10,45 @@ class AppWidgetControl extends Control { static AppWidgetControl instance = AppWidgetControl(); @visibleForTesting static const appWidgetName = 'MusicPlayerAppWidget'; + static const _songUriKey = 'song'; + static const _playingKey = 'playing'; + + StreamSubscription? _currentSongListener; + StreamSubscription? _playingStateListener; - StreamSubscription? currentSongListener; - StreamSubscription? playingStateListener; /// The last song content uri sent to the widget. - String? lastSongContentUri; + String? _lastSongContentUri; + /// The last playing state sent to the widget. - bool? lastPlayingState; + bool? _lastPlayingState; @override void init() { super.init(); - lastSongContentUri = null; - lastPlayingState = null; - currentSongListener = PlaybackControl.instance.onSongChange - .listen((song) => update(song, MusicPlayer.instance.playing)); - playingStateListener = MusicPlayer.instance.playingStream.listen( - (playing) => update(PlaybackControl.instance.currentSong, playing)); + _lastSongContentUri = null; + _lastPlayingState = null; + _currentSongListener = + PlaybackControl.instance.onSongChange.listen((song) => update(song, MusicPlayer.instance.playing)); + _playingStateListener = + MusicPlayer.instance.playingStream.listen((playing) => update(PlaybackControl.instance.currentSong, playing)); } - + @override void dispose() { - currentSongListener?.cancel(); - playingStateListener?.cancel(); + _currentSongListener?.cancel(); + _playingStateListener?.cancel(); super.dispose(); } /// Update the widgets with the current [song] and [playing] state. Future update(Song song, bool playing) async { - if (playing == lastPlayingState && song.contentUri == lastSongContentUri) { + if (playing == _lastPlayingState && song.contentUri == _lastSongContentUri) { return; } - lastSongContentUri = song.contentUri; - lastPlayingState = playing; - await HomeWidget.saveWidgetData('song', song.contentUri); - await HomeWidget.saveWidgetData('playing', playing); + _lastSongContentUri = song.contentUri; + _lastPlayingState = playing; + await HomeWidget.saveWidgetData(_songUriKey, song.contentUri); + await HomeWidget.saveWidgetData(_playingKey, playing); await HomeWidget.updateWidget(name: appWidgetName); } } From 7a1dee065a558d959b5d51cecf2a0dc8f8d10b2d Mon Sep 17 00:00:00 2001 From: Abestanis Date: Mon, 21 Oct 2024 04:04:08 +0200 Subject: [PATCH 16/17] Fix radius of app widget button bar --- .../nt4f04und/sweyer/MusicPlayerAppWidget.kt | 2 +- .../music_player_widget_preview.png | Bin 46615 -> 46759 bytes .../music_player_widget_background.xml | 2 +- ...ic_player_widget_button_bar_background.xml | 2 +- .../app/src/main/res/values-v31/styles.xml | 2 +- android/app/src/main/res/values/attrs.xml | 2 +- android/app/src/main/res/values/dimens.xml | 2 +- android/app/src/main/res/values/themes.xml | 4 ++-- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt b/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt index 95958413d..9c98ab39f 100644 --- a/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt +++ b/android/app/src/main/kotlin/com/nt4f04und/sweyer/MusicPlayerAppWidget.kt @@ -116,7 +116,7 @@ class MusicPlayerAppWidget : HomeWidgetProvider() { R.id.music_player_widget_song_art, // On Android versions since S the system rounds the corners for us. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) songArt else createRoundedBitmap( - songArt, size, context.resources.getDimension(R.dimen.appWidgetRadius) + songArt, size, context.resources.getDimension(R.dimen.appWidgetBackgroundRadius) ) ) setViewVisibility(R.id.music_player_widget_song_art, VISIBLE) diff --git a/android/app/src/main/res/drawable-nodpi/music_player_widget_preview.png b/android/app/src/main/res/drawable-nodpi/music_player_widget_preview.png index f6166352e27d50e3a5b54031f4267ebc1a1c3ef0..2aed8572eee4289a9b259319ab554996b8f38b4d 100644 GIT binary patch delta 22190 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

3XPs)NlkW`x^RU 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 - + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/music_player_widget_button_bar_background.xml b/android/app/src/main/res/drawable/music_player_widget_button_bar_background.xml index c28b5cddd..e30fe914b 100644 --- a/android/app/src/main/res/drawable/music_player_widget_button_bar_background.xml +++ b/android/app/src/main/res/drawable/music_player_widget_button_bar_background.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml index 832fe0b14..0bb60c137 100644 --- a/android/app/src/main/res/values-v31/styles.xml +++ b/android/app/src/main/res/values-v31/styles.xml @@ -1,7 +1,7 @@