From 08aef521fef46112c5e0d9e8ca63028513d8629c Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Sun, 12 Sep 2021 05:39:33 +0300 Subject: [PATCH] Update image, add save-window-size-on-close feature, start separating mplayer controls out of the in-app controller-class that should make application architecture more solid in future and give a chance to add other back ends support. Start code refactoring, adding copyleft banners. --- pom.xml | 4 +- .../java/mplayer4anime/AppPreferences.java | 31 +- src/main/java/mplayer4anime/Controller.java | 296 ++++++++---------- .../ISlaveModeAppOrchestration.java | 23 ++ .../java/mplayer4anime/LineRedirecter.java | 37 ++- src/main/java/mplayer4anime/MainFX.java | 42 ++- src/main/java/mplayer4anime/MplayerSlave.java | 170 ++++++++++ .../java/mplayer4anime/ServiceWindow.java | 24 +- .../Settings/ControllerListsSelector.java | 28 +- .../Settings/SettingsController.java | 46 ++- .../Settings/SettingsWindow.java | 30 +- .../appPanes/ControllerPane.java | 117 ++++--- src/main/resources/locale.properties | 2 +- src/main/resources/locale_rus.properties | 2 +- src/main/resources/res/landing.css | 2 +- src/main/resources/res/pocket.png | Bin 32120 -> 34719 bytes 16 files changed, 563 insertions(+), 291 deletions(-) create mode 100644 src/main/java/mplayer4anime/ISlaveModeAppOrchestration.java create mode 100644 src/main/java/mplayer4anime/MplayerSlave.java diff --git a/pom.xml b/pom.xml index b59426b..206b893 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ mplayer4anime mplayer4anime - 0.14.1-SNAPSHOT + 0.15-SNAPSHOT jar @@ -16,7 +16,7 @@ mplayer front end to play content pairs that are mostly used for anime (mka+mkv, mp4+ac3, mkv+srt) - 2018-2019 + 2018 Dmitry Isaenko https://developersu.blogspot.com/search/label/mplayer4anime diff --git a/src/main/java/mplayer4anime/AppPreferences.java b/src/main/java/mplayer4anime/AppPreferences.java index 3114110..47d54db 100644 --- a/src/main/java/mplayer4anime/AppPreferences.java +++ b/src/main/java/mplayer4anime/AppPreferences.java @@ -1,14 +1,34 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime; import java.util.prefs.Preferences; // Rule application settings public class AppPreferences { + private static AppPreferences INSTANCE = new AppPreferences(); + private Preferences preferences = Preferences.userRoot().node("mplayer4anime"); - private Preferences preferences; + private AppPreferences(){} - public AppPreferences(){ - preferences = Preferences.userRoot().node("mplayer4anime"); + public static AppPreferences getINSTANCE() { + return INSTANCE; } public void setPath(String path){ @@ -96,5 +116,10 @@ public class AppPreferences { preferences.put("RECENT_PLS_" + i, ""); } } + // Window size + public double getSceneWidth(){ return preferences.getDouble("window_width", 1200.0); } + public void setSceneWidth(double value){ preferences.putDouble("window_width", value); } + public double getSceneHeight(){ return preferences.getDouble("window_height", 800.0); } + public void setSceneHeight(double value){ preferences.putDouble("window_height", value); } } diff --git a/src/main/java/mplayer4anime/Controller.java b/src/main/java/mplayer4anime/Controller.java index 49a81ef..eaec6ba 100644 --- a/src/main/java/mplayer4anime/Controller.java +++ b/src/main/java/mplayer4anime/Controller.java @@ -1,9 +1,26 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime; import javafx.application.HostServices; import javafx.application.Platform; -import javafx.event.ActionEvent; -import javafx.event.EventHandler; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.*; @@ -18,38 +35,33 @@ import mplayer4anime.appPanes.ControllerSUB; import java.io.*; import java.net.URL; -import java.util.ListIterator; import java.util.ResourceBundle; public class Controller implements Initializable { @FXML - private ControllerPane mkvPaneController; - @FXML - private ControllerPane mkaPaneController; + private ControllerPane mkvPaneController, mkaPaneController; @FXML private ControllerSUB subPaneController; @FXML private Label statusLbl; @FXML private Menu recentlyOpenedMenu; - // Get preferences - private AppPreferences appPreferences = new AppPreferences(); - - private ResourceBundle resourceBundle; - @FXML private CheckMenuItem fullScreen; - - // Get host services for opening URLs etc. - private HostServices hostServices; - @FXML private TabPane tabPane; - @FXML private CheckMenuItem subsHide; - private String currentPlaylistLocation = null; //TODO: move to the constructor? + private final AppPreferences appPreferences = AppPreferences.getINSTANCE(); + + private ResourceBundle resourceBundle; + // Get host services for opening URLs etc. + private HostServices hostServices; + + private String currentPlaylistLocation; + + private MplayerSlave mplayer; // If application started with playlist passed as an argument, then we'll try to load it (if it's valid). public void setPlaylistAsArgument(String playlist) { @@ -79,150 +91,19 @@ public class Controller implements Initializable { subsHide.setSelected(appPreferences.getSubtitlesHideSelected()); String[] recentPlaylists = appPreferences.getRecentPlaylists(); - for (int i = recentPlaylists.length-1; i >= 0; i--) - if (!recentPlaylists[i].isEmpty()) - addRecentlyOpened(recentPlaylists[i]); + for (int i = recentPlaylists.length-1; i >= 0; i--) { + if (recentPlaylists[i].isEmpty()) + continue; + addRecentlyOpened(recentPlaylists[i]); + } + + mplayer = new MplayerSlave(resourceBundle); } void setHostServices(HostServices hostServices) { this.hostServices = hostServices; } - /* PLAYER COMMANDS */ - private boolean playerSingleCommand(String command){ - if (player != null && player.isAlive()) { - playerIn.print(command); - playerIn.print("\n"); - playerIn.flush(); - return true; - } else { return false; } - } - - @FXML - private void subsTriggerBtn(){ - if (playerSingleCommand("get_sub_visibility")) { - String returnedStr; - int returnedInt = 1; - try { - while ((returnedStr = playerOutErr.readLine()) != null) { - //System.out.println(returnedStr); - if (returnedStr.startsWith("ANS_SUB_VISIBILITY=")) { - returnedInt = Integer.parseInt(returnedStr.substring("ANS_SUB_VISIBILITY=".length())); - break; - } - } - } catch (IOException e) { - System.out.println("Can't determine whether subtitles enabled or disabled"); - } - - if (returnedInt == 1) - playerSingleCommand("sub_visibility 0"); - else - playerSingleCommand("sub_visibility 1"); - } - } - @FXML - private void fullscreenBtn(){ playerSingleCommand("vo_fullscreen"); } - @FXML - private void muteBtn(){ playerSingleCommand("mute"); } - @FXML - private void playPrevTrackBtn(){ - if (player != null && player.isAlive()) { - playerSingleCommand("quit"); - while (player.isAlive()); // TODO: remove crutch, implement bike - } - int index; - index = mkvPaneController.getElementSelectedIndex(); - if (index > 0) { - mkvPaneController.setElementSelectedByIndex(index-1); // .selectNext / .selectPrevious - playBtn(); - } - } - @FXML - private void playNextTrackBtn(){ - if (player != null && player.isAlive()) { - playerSingleCommand("quit"); - while (player.isAlive()); // TODO: remove crutch, implement bike - } - int index; - index = mkvPaneController.getElementSelectedIndex(); - // TODO: add 'link' button - if (index+1 < mkvPaneController.getElementsCount() ) { - mkvPaneController.setElementSelectedByIndex(index+1); - } - index = mkaPaneController.getElementSelectedIndex(); - if (index+1 < mkaPaneController.getElementsCount() ) { - mkaPaneController.setElementSelectedByIndex(index+1); - } - index = subPaneController.getElementSelectedIndex(); - if (index+1 < subPaneController.getElementsCount() ) { - subPaneController.setElementSelectedByIndex(index+1); - } - playBtn(); - } - - private Process player; - private PrintStream playerIn; - private BufferedReader playerOutErr; - - @FXML - private void playBtn(){ - if (mkvPaneController.getElementSelected() != null) { - boolean Audio = !mkaPaneController.isElementsListEmpty() && mkvPaneController.getElementSelectedIndex() < mkaPaneController.getElementsCount(); - boolean Subtitles = !subPaneController.isElementsListEmpty() && mkvPaneController.getElementSelectedIndex() < subPaneController.getElementsCount(); - boolean SubEncodingDefault = subPaneController.getSelectedEncoding().equals("default"); - - try { - if (player == null || !player.isAlive()) { - player = new ProcessBuilder( // FUCKING MAGIC! DON'T CHANGE SEQUENCE - appPreferences.getPath(), // It's a chance for Windows ;) - "-slave", - Audio?"-audiofile":"", - Audio? mkaPaneController.getElementSelected():"", - "-quiet", - fullScreen.isSelected() ? "-fs" : "", - mkvPaneController.getElementSelected(), - subsHide.isSelected()||Subtitles?"-nosub":"", // Turn off subtitles embedded into MKV file (and replace by localy-stored subs file if needed) - Subtitles?"-sub":"", - Subtitles? subPaneController.getElementSelected():"", - Subtitles?SubEncodingDefault?"":"-subcp":"", // Use subtitles -> YES -> Check if we need encoding - Subtitles?SubEncodingDefault?"": subPaneController.getSelectedEncoding():"" - ).start(); - - PipedInputStream readFrom = new PipedInputStream(256 * 1024); - PipedOutputStream writeTo = new PipedOutputStream(readFrom); - - playerOutErr = new BufferedReader(new InputStreamReader(readFrom)); - - new LineRedirecter(player.getInputStream(), writeTo).start(); - new LineRedirecter(player.getErrorStream(), writeTo).start(); - - playerIn = new PrintStream(player.getOutputStream()); - - /* If user desired to disable subtitles but populated the list in the SUB pane, then load them and disable visibility. - * It's should be done this way because if we won't pass them to mplayer during start them user won't be able to enable them later on. - * There is another bike could be implemented such as passing input file during load but it's far more dumb idea then current implementation. - */ - if (subsHide.isSelected()) - playerSingleCommand("sub_visibility 0"); - } else { - playerIn.print("pause"); - playerIn.print("\n"); - playerIn.flush(); - } - } catch (IOException e) { - ServiceWindow.getErrorNotification(resourceBundle.getString("Error"), resourceBundle.getString("ErrorUnableToStartMplayer")); - } - } else { System.out.println("File not selected"); } - } - - @FXML - private void stopBtn(){playerSingleCommand("stop"); } - @FXML - private void volumeUpBtn(){ playerSingleCommand("volume +1 0"); } - @FXML - private void volumeDownBtn(){ playerSingleCommand("volume -1 0"); } - @FXML private void closeBtn() { Stage currentStage = (Stage) tabPane.getScene().getWindow(); @@ -312,21 +193,21 @@ public class Controller implements Initializable { } private void addRecentlyOpened(String playlistPath){ - ListIterator iteratorItem = recentlyOpenedMenu.getItems().listIterator(); - while (iteratorItem.hasNext()) { - MenuItem mi = iteratorItem.next(); - if (mi.getUserData() != null && mi.getUserData().equals(playlistPath)) { - recentlyOpenedMenu.getItems().remove(mi); - recentlyOpenedMenu.getItems().add(0, mi); + ObservableList items = recentlyOpenedMenu.getItems(); + for (MenuItem item : items) { + if (item.getUserData() != null && item.getUserData().equals(playlistPath)) { + items.remove(item); + items.add(0, item); return; } } MenuItem menuItem = new MenuItem(); - String fileNameOnly; + String playListName; - fileNameOnly = playlistPath.substring(playlistPath.lastIndexOf(File.separator) + 1); - menuItem.setText(fileNameOnly); + playListName = playlistPath.substring( + playlistPath.lastIndexOf(File.separator) + 1, playlistPath.lastIndexOf(".")); + menuItem.setText(playListName); menuItem.setUserData(playlistPath); menuItem.setOnAction(actionEvent -> { @@ -334,9 +215,90 @@ public class Controller implements Initializable { setAllLists(jsonStorage); }); // Limit list to 13 elements (2 in the end are separator and clear button) - if (recentlyOpenedMenu.getItems().size() >= 11) - recentlyOpenedMenu.getItems().remove(9, recentlyOpenedMenu.getItems().size() - 2); - recentlyOpenedMenu.getItems().add(0, menuItem); + if (items.size() >= 11) + items.remove(9, recentlyOpenedMenu.getItems().size() - 2); + items.add(0, menuItem); + } + + /* PLAYER */ + @FXML + private void subsTriggerBtn(){ + mplayer.subtitlesSwitch(); + } + @FXML + private void fullscreenBtn(){ + mplayer.fullscreenSwitch(); + } + @FXML + private void muteBtn(){ + mplayer.mute(); + } + @FXML + private void playPrevTrackBtn(){ + int index = mkvPaneController.getElementSelectedIndex(); + if (index <= 0) + return; + + mkvPaneController.setElementSelectedByIndex(index-1); + mplayer.forcePlay(appPreferences.getPath(), + mkvPaneController.getElementSelected(), + mkaPaneController.getElementSelected(), + subPaneController.getElementSelected(), + subPaneController.getSelectedEncoding(), + subsHide.isSelected(), + fullScreen.isSelected() + ); + } + @FXML + private void playNextTrackBtn(){ + int index = mkvPaneController.getElementSelectedIndex(); + + if (index + 1 < mkvPaneController.getElementsCount()) { + mkvPaneController.setElementSelectedByIndex(index + 1); + } + index = mkaPaneController.getElementSelectedIndex(); + if (index + 1 < mkaPaneController.getElementsCount()) { + mkaPaneController.setElementSelectedByIndex(index + 1); + } + index = subPaneController.getElementSelectedIndex(); + if (index + 1 < subPaneController.getElementsCount()) { + subPaneController.setElementSelectedByIndex(index + 1); + } + + mplayer.forcePlay(appPreferences.getPath(), + mkvPaneController.getElementSelected(), + mkaPaneController.getElementSelected(), + subPaneController.getElementSelected(), + subPaneController.getSelectedEncoding(), + subsHide.isSelected(), + fullScreen.isSelected() + ); + } + @FXML + private void playBtn(){ + if (mkvPaneController.getElementSelected() == null) + return; + + mplayer.playPause(appPreferences.getPath(), + mkvPaneController.getElementSelected(), + mkaPaneController.getElementSelected(), + subPaneController.getElementSelected(), + subPaneController.getSelectedEncoding(), + subsHide.isSelected(), + fullScreen.isSelected() + ); + } + @FXML + private void stopBtn(){ + mplayer.stop(); + } + @FXML + private void volumeUpBtn(){ + mplayer.volumeUp(); + } + @FXML + private void volumeDownBtn(){ + mplayer.volumeDown(); } } diff --git a/src/main/java/mplayer4anime/ISlaveModeAppOrchestration.java b/src/main/java/mplayer4anime/ISlaveModeAppOrchestration.java new file mode 100644 index 0000000..463e840 --- /dev/null +++ b/src/main/java/mplayer4anime/ISlaveModeAppOrchestration.java @@ -0,0 +1,23 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ +package mplayer4anime; + +public interface ISlaveModeAppOrchestration { + // TODO: implement unified interface for mplayer and mpv +} diff --git a/src/main/java/mplayer4anime/LineRedirecter.java b/src/main/java/mplayer4anime/LineRedirecter.java index 30879db..4867d69 100644 --- a/src/main/java/mplayer4anime/LineRedirecter.java +++ b/src/main/java/mplayer4anime/LineRedirecter.java @@ -1,27 +1,44 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime; import java.io.*; public class LineRedirecter extends Thread { - private InputStream inStr; - private OutputStream outStr; + private final InputStream inStream; + private final OutputStream outStream; - LineRedirecter(InputStream in, OutputStream out){ - this.inStr = in; - this.outStr = out; + LineRedirecter(InputStream inStream, OutputStream outStream){ + this.inStream = inStream; + this.outStream = outStream; } public void run(){ try { - BufferedReader bufferReader = new BufferedReader(new InputStreamReader(inStr)); - PrintStream printStream = new PrintStream(outStr); + BufferedReader bufferReader = new BufferedReader(new InputStreamReader(inStream)); + PrintStream printStream = new PrintStream(outStream); String playerOutput; - while ((playerOutput = bufferReader.readLine()) != null) { printStream.println(playerOutput); } - - }catch (IOException e){ + } + catch (IOException e){ e.printStackTrace(); } diff --git a/src/main/java/mplayer4anime/MainFX.java b/src/main/java/mplayer4anime/MainFX.java index 409722f..a386294 100644 --- a/src/main/java/mplayer4anime/MainFX.java +++ b/src/main/java/mplayer4anime/MainFX.java @@ -1,13 +1,22 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime; -/** -Name: mplayer4anime -@author Dmitry Isaenko -License: GNU GPL v.3 -@version 0.12 -@see https://developersu.blogspot.com/search/label/mplayer4anime -@see https://github.com/developersu/mplayer4anime -2018-2019, Russia -*/ import javafx.application.Application; import javafx.fxml.FXMLLoader; @@ -55,17 +64,22 @@ public class MainFX extends Application { Runtime.getRuntime().addShutdownHook(new Thread(() -> tsih.interrupt())); primaryStage.getIcons().addAll( - new Image(MainFX.class.getResourceAsStream("/res/app_icon32x32.png")), - new Image(MainFX.class.getResourceAsStream("/res/app_icon48x48.png")), - new Image(MainFX.class.getResourceAsStream("/res/app_icon64x64.png")), - new Image(MainFX.class.getResourceAsStream("/res/app_icon128x128.png")) + new Image(getClass().getResourceAsStream("/res/app_icon32x32.png")), + new Image(getClass().getResourceAsStream("/res/app_icon48x48.png")), + new Image(getClass().getResourceAsStream("/res/app_icon64x64.png")), + new Image(getClass().getResourceAsStream("/res/app_icon128x128.png")) ); primaryStage.setTitle("mplayer4anime"); primaryStage.setMinWidth(500); primaryStage.setMinHeight(375); - primaryStage.setScene(new Scene(root, 1200, 800)); + Scene scene = new Scene(root, + AppPreferences.getINSTANCE().getSceneWidth(), + AppPreferences.getINSTANCE().getSceneHeight()); + primaryStage.setScene(scene); // Make linkage to controller method to handle exit() event in there. primaryStage.setOnHidden(e -> { + AppPreferences.getINSTANCE().setSceneHeight(scene.getHeight()); + AppPreferences.getINSTANCE().setSceneWidth(scene.getWidth()); tsih.interrupt(); controller.shutdown(); }); diff --git a/src/main/java/mplayer4anime/MplayerSlave.java b/src/main/java/mplayer4anime/MplayerSlave.java new file mode 100644 index 0000000..c552baa --- /dev/null +++ b/src/main/java/mplayer4anime/MplayerSlave.java @@ -0,0 +1,170 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ +package mplayer4anime; + +import java.io.*; +import java.util.ResourceBundle; +import java.util.concurrent.TimeUnit; + +public class MplayerSlave implements ISlaveModeAppOrchestration { + private Process player; + private PrintStream playerIn; + private BufferedReader playerOutErr; + + private final ResourceBundle resourceBundle; + + public MplayerSlave(ResourceBundle resourceBundle){ + this.resourceBundle = resourceBundle; + } + + private boolean playerSingleCommand(String command){ + if (player != null && player.isAlive()) { + playerIn.print(command); + playerIn.print("\n"); + playerIn.flush(); + return true; + } + return false; + } + + public void subtitlesSwitch(){ + if (! playerSingleCommand("get_sub_visibility")) + return; + + try { + String returnedStr; + int returnedInt = 1; + while ((returnedStr = playerOutErr.readLine()) != null) { + if (returnedStr.startsWith("ANS_SUB_VISIBILITY=")) { + returnedInt = Integer.parseInt(returnedStr.substring("ANS_SUB_VISIBILITY=".length())); + break; + } + } + if (returnedInt == 1) + playerSingleCommand("sub_visibility 0"); + else + playerSingleCommand("sub_visibility 1"); + } + catch (IOException e) { + e.printStackTrace(); + System.out.println("Can't determine whether subtitles enabled or disabled"); + } + } + + public void fullscreenSwitch(){ + playerSingleCommand("vo_fullscreen"); + } + + public void mute(){ + playerSingleCommand("mute"); + } + + public void forcePlay(String mplayerPath, + String VideoFile, + String AudioFile, + String SubtitlesFile, + String subtitlesEncoding, + boolean subtitlesHidden, + boolean isFullscreen){ + try { + if (player != null && player.isAlive()){ + playerSingleCommand("quit"); + player.waitFor(500, TimeUnit.MILLISECONDS); + player.destroyForcibly(); + } + playPause(mplayerPath, VideoFile, AudioFile, SubtitlesFile, subtitlesEncoding, subtitlesHidden, isFullscreen); + } + catch (InterruptedException e){ + e.printStackTrace(); + } + } + + public boolean pause(){ + if (player == null || !player.isAlive()) + return false; + playerIn.print("pause"); + playerIn.print("\n"); + playerIn.flush(); + return true; + } + + public void playPause(String mplayerPath, + String VideoFile, + String AudioFile, + String SubtitlesFile, + String subtitlesEncoding, + boolean subtitlesHidden, + boolean isFullscreen){ + if (pause()) + return; + + boolean isAudio = AudioFile != null; + boolean isSubtitles = SubtitlesFile != null; + boolean SubEncodingDefault = subtitlesEncoding.equals("default"); + + try { + player = new ProcessBuilder( // FUCKING MAGIC! DON'T CHANGE SEQUENCE + mplayerPath, // It's a chance for Windows ;) + "-slave", + isAudio?"-audiofile":"", + isAudio?AudioFile:"", + "-quiet", + isFullscreen ? "-fs" : "", + VideoFile, + subtitlesHidden||isSubtitles?"-nosub":"", // Turn off subtitles embedded into MKV file (and replace by localy-stored subs file if needed) + isSubtitles?"-sub":"", + isSubtitles? SubtitlesFile:"", + isSubtitles?SubEncodingDefault?"":"-subcp":"", // Use subtitles -> YES -> Check if we need encoding + isSubtitles?SubEncodingDefault?"": subtitlesEncoding:"" + ).start(); + + PipedInputStream readFrom = new PipedInputStream(256 * 1024); + PipedOutputStream writeTo = new PipedOutputStream(readFrom); + + playerOutErr = new BufferedReader(new InputStreamReader(readFrom)); + + new LineRedirecter(player.getInputStream(), writeTo).start(); + new LineRedirecter(player.getErrorStream(), writeTo).start(); + + playerIn = new PrintStream(player.getOutputStream()); + + /* If user desired to disable subtitles but populated the list in the SUB pane, then load them and disable visibility. + * It should be done this way because if we didn't pass them to mplayer during start then user won't be able to enable them later on. + * There is another bike could be implemented such as passing input file during load but it's far more dumb idea than current implementation. + */ + if (subtitlesHidden) + playerSingleCommand("sub_visibility 0"); + } + catch (IOException e) { + ServiceWindow.getErrorNotification(resourceBundle.getString("Error"), resourceBundle.getString("ErrorUnableToStartMplayer")); + } + } + + public void stop(){ + playerSingleCommand("stop"); + } + + public void volumeUp(){ + playerSingleCommand("volume +1 0"); + } + + public void volumeDown(){ + playerSingleCommand("volume -1 0"); + } +} diff --git a/src/main/java/mplayer4anime/ServiceWindow.java b/src/main/java/mplayer4anime/ServiceWindow.java index 91340cc..7e42bbe 100644 --- a/src/main/java/mplayer4anime/ServiceWindow.java +++ b/src/main/java/mplayer4anime/ServiceWindow.java @@ -1,12 +1,30 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime; import javafx.scene.control.Alert; import javafx.scene.layout.Region; +/** + * Creates window with notification + * */ public class ServiceWindow { - /** - * Create window with notification - * */ public static void getErrorNotification(String title, String body){ Alert alertBox = new Alert(Alert.AlertType.ERROR); alertBox.setTitle(title); diff --git a/src/main/java/mplayer4anime/Settings/ControllerListsSelector.java b/src/main/java/mplayer4anime/Settings/ControllerListsSelector.java index 9c2683c..75175bd 100644 --- a/src/main/java/mplayer4anime/Settings/ControllerListsSelector.java +++ b/src/main/java/mplayer4anime/Settings/ControllerListsSelector.java @@ -1,32 +1,42 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime.Settings; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; -import javafx.fxml.Initializable; import javafx.scene.control.ListView; import javafx.scene.control.TextField; import javafx.scene.control.TextFormatter; import javafx.scene.input.KeyEvent; -import java.net.URL; import java.util.Arrays; -import java.util.ResourceBundle; -public class ControllerListsSelector implements Initializable { +public class ControllerListsSelector{ @FXML private ListView listView; @FXML private TextField newRecordText; private ObservableList observableList; - private ResourceBundle resourceBundle; private boolean isListOfExtensions; - @Override - public void initialize(URL url, ResourceBundle rb) { - resourceBundle = rb; - } /** * Must be run on start * Set list content diff --git a/src/main/java/mplayer4anime/Settings/SettingsController.java b/src/main/java/mplayer4anime/Settings/SettingsController.java index 938723a..5600412 100644 --- a/src/main/java/mplayer4anime/Settings/SettingsController.java +++ b/src/main/java/mplayer4anime/Settings/SettingsController.java @@ -1,3 +1,21 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime.Settings; import javafx.fxml.FXML; @@ -14,16 +32,12 @@ import java.util.ResourceBundle; import mplayer4anime.MediatorControl; public class SettingsController implements Initializable { - private AppPreferences appPreferences; @FXML - private ControllerListsSelector subExtensionListController; - @FXML - private ControllerListsSelector subEncodingListController; - @FXML - private ControllerListsSelector videoExtensionListController; - @FXML - private ControllerListsSelector audioExtensionListController; + private ControllerListsSelector subExtensionListController, + subEncodingListController, + videoExtensionListController, + audioExtensionListController; @FXML private Label pathToMplayerLbl; @FXML @@ -31,7 +45,7 @@ public class SettingsController implements Initializable { @Override public void initialize(URL url, ResourceBundle resBundle) { - appPreferences = new AppPreferences(); + appPreferences = AppPreferences.getINSTANCE(); pathToMplayerLbl.setText(appPreferences.getPath()); // Subtitles should be shown first? If TRUE, then set checkbox. @@ -72,16 +86,15 @@ public class SettingsController implements Initializable { @FXML private void Cancel(){ - Stage thisStage = (Stage) pathToMplayerLbl.getScene().getWindow(); // TODO: consider refactoring. Non-urgent. - thisStage.close(); + close(); } @FXML private void Ok(){ - this.Apply(); - Stage thisStage = (Stage) pathToMplayerLbl.getScene().getWindow(); // TODO: consider refactoring. Non-urgent. - thisStage.close(); + Apply(); + close(); } + @FXML private void Apply(){ appPreferences.setPath(pathToMplayerLbl.getText()); @@ -93,4 +106,9 @@ public class SettingsController implements Initializable { MediatorControl.getInstance().sentUpdates(); // TODO: implement list to track what should be updated } + + private void close(){ + Stage currentWindowStage = (Stage) pathToMplayerLbl.getScene().getWindow(); + currentWindowStage.close(); + } } diff --git a/src/main/java/mplayer4anime/Settings/SettingsWindow.java b/src/main/java/mplayer4anime/Settings/SettingsWindow.java index 2da0141..98c7744 100644 --- a/src/main/java/mplayer4anime/Settings/SettingsWindow.java +++ b/src/main/java/mplayer4anime/Settings/SettingsWindow.java @@ -1,3 +1,21 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime.Settings; import javafx.fxml.FXMLLoader; @@ -5,7 +23,6 @@ import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Stage; -import mplayer4anime.MainFX; import java.io.IOException; import java.util.Locale; @@ -29,15 +46,14 @@ public class SettingsWindow { try { Parent parentAbout = loaderSettings.load(); - //SettingsController settingsController = loaderSettings.getController(); stageAbout.setTitle(resourceBundle.getString("settings_SettingsName")); stageAbout.getIcons().addAll( - new Image(MainFX.class.getResourceAsStream("/res/settings_icon32x32.png")), - new Image(MainFX.class.getResourceAsStream("/res/settings_icon48x48.png")), - new Image(MainFX.class.getResourceAsStream("/res/settings_icon64x64.png")), - new Image(MainFX.class.getResourceAsStream("/res/settings_icon128x128.png")) - ); // TODO: change to something reliable + new Image("/res/settings_icon32x32.png"), + new Image("/res/settings_icon32x32.png"), + new Image("/res/settings_icon48x48.png"), + new Image("/res/settings_icon64x64.png"), + new Image("/res/settings_icon128x128.png")); stageAbout.setScene(new Scene(parentAbout, 570, 500)); stageAbout.show(); diff --git a/src/main/java/mplayer4anime/appPanes/ControllerPane.java b/src/main/java/mplayer4anime/appPanes/ControllerPane.java index 64a3a6d..0416fe3 100644 --- a/src/main/java/mplayer4anime/appPanes/ControllerPane.java +++ b/src/main/java/mplayer4anime/appPanes/ControllerPane.java @@ -1,3 +1,21 @@ +/* + Copyright 2018-2021 Dmitry Isaenko + + This file is part of mplayer4anime. + + mplayer4anime is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mplayer4anime is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mplayer4anime. If not, see . + */ package mplayer4anime.appPanes; import javafx.collections.FXCollections; @@ -10,28 +28,23 @@ import javafx.scene.control.ListView; import javafx.scene.input.KeyEvent; import javafx.stage.DirectoryChooser; import javafx.stage.FileChooser; -import javafx.util.Callback; import mplayer4anime.AppPreferences; import java.io.File; -import java.io.FilenameFilter; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.ResourceBundle; -public class ControllerPane implements Initializable { - +public class ControllerPane implements Initializable { private ResourceBundle resourceBundle; - // use folderToOpen same variable in all panes private static String folderToOpen; - private AppPreferences appPreferences; @FXML private ListView paneListView; - private ObservableList paneFileList = FXCollections.observableArrayList(); + private final ObservableList paneFileList = FXCollections.observableArrayList(); @FXML private Label paneLbl; @@ -42,8 +55,9 @@ public class ControllerPane implements Initializable { public void initialize(URL url, ResourceBundle resBundle) { SetCellFactory(paneListView); resourceBundle = resBundle; - appPreferences = new AppPreferences(); + appPreferences = AppPreferences.getINSTANCE(); } + public void setPaneType(String paneType){ this.paneType = paneType; @@ -69,12 +83,11 @@ public class ControllerPane implements Initializable { } /** Select element name (full path) using index recieved */ public String getElementSelected(){ - if (this.paneListView.getSelectionModel().getSelectedItem() != null) { - return this.paneFileList.get(this.getElementSelectedIndex()).toPath().toString(); - } - else { - return null; + File item = paneListView.getSelectionModel().getSelectedItem(); + if (item != null) { + return item.getAbsolutePath(); } + return null; } /** Select element in pane using index recieved */ public void setElementSelectedByIndex(int index){ @@ -98,33 +111,23 @@ public class ControllerPane implements Initializable { return elementsArray; } - private void SetCellFactory(ListView lv) { - lv.setCellFactory(new Callback, ListCell>() { - @Override - public ListCell call(ListView fileListView) { - return new ListCell(){ + private void SetCellFactory(ListView listView) { + listView.setCellFactory(cb -> new ListCell() { @Override - public void updateItem(File item, boolean empty){ + public void updateItem(File item, boolean empty) { // have to call super here super.updateItem(item, empty); - String trimmedName; - - if (item == null || empty){ + if (item == null || empty) { setText(null); + return; } - else { - trimmedName = item.getName(); - setText(trimmedName); - } + setText(item.getName()); } - }; - } - }); + }); } - /** - * Open file selector (Open folder button in UI). - * */ + + /** Open file selector (Open folder button in UI) */ @FXML void openDirChooser(){ String[] filesExtensionTmp; @@ -166,30 +169,25 @@ public class ControllerPane implements Initializable { if (directoryReceived != null) { File[] files; // Store files mkv/mka - files = directoryReceived.listFiles(new FilenameFilter() { - @Override - public boolean accept(File file, String Name) { - if (Name.lastIndexOf('.') > 0) { - int lastindex = Name.lastIndexOf('.'); - String ext = Name.substring(lastindex); - for (String key : filesExtension){ // TODO: add toLowerCase and validate whatever registry extension noted - if (ext.equals(key.substring(1))) - return true; - } - } else - return false; - return false; + files = directoryReceived.listFiles((file, Name) -> { + int lastIndexOfDot = Name.lastIndexOf('.'); + if (lastIndexOfDot > 0) { + String ext = Name.substring(lastIndexOfDot); + for (String key : filesExtension){ // TODO: add toLowerCase and validate whatever registry extension noted + if (ext.equals(key.substring(1))) + return true; + } } + return false; }); displayFiles(files); - } else { + } + else { System.out.println("No folder selected"); } } - /** - * Open file selector (Open files button in UI). - * */ + /** Open file selector (Open files button in UI) */ @FXML void openFilesChooser(){ String[] filesExtension; @@ -213,9 +211,8 @@ public class ControllerPane implements Initializable { lowerAndUpperExts.add(s); lowerAndUpperExts.add(s.toUpperCase()); } - filesExtension = lowerAndUpperExts.toArray(new String[lowerAndUpperExts.size()]); - List filesRecievedList; + List filesReceivedList; FileChooser fc = new FileChooser(); fc.setTitle(resourceBundle.getString("SelectFile")); @@ -223,16 +220,19 @@ public class ControllerPane implements Initializable { fc.setInitialDirectory(new File(System.getProperty("user.home"))); else fc.setInitialDirectory(new File(folderToOpen)); - fc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter(paneType, filesExtension)); - filesRecievedList = fc.showOpenMultipleDialog(paneListView.getScene().getWindow()); - if (filesRecievedList != null){ // TODO: and !filesRecieved.isEmpty() - File[] filesRecieved = new File[filesRecievedList.size()]; - filesRecievedList.toArray(filesRecieved); - displayFiles(filesRecieved); - } else { + fc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter(paneType, + lowerAndUpperExts.toArray(new String[0]))); + + filesReceivedList = fc.showOpenMultipleDialog(paneListView.getScene().getWindow()); + if (filesReceivedList == null) { System.out.println("No files selected"); + return; } + + File[] filesReceived = new File[filesReceivedList.size()]; + filesReceivedList.toArray(filesReceived); + displayFiles(filesReceived); } /** * Set files using lists. Used if playlist loaded @@ -250,7 +250,6 @@ public class ControllerPane implements Initializable { if (files != null && files.length > 0) { // spiced java magic Arrays.sort(files); - // Remember the folder used for MKV and reuse it when user opens MKA/subs folder (as new default path instead of user.home) folderToOpen = files[0].getParent(); //System.out.println(folderToOpen); diff --git a/src/main/resources/locale.properties b/src/main/resources/locale.properties index cfacac3..b245891 100644 --- a/src/main/resources/locale.properties +++ b/src/main/resources/locale.properties @@ -1,5 +1,5 @@ about_line1=mplayer4amine distributes under GNU GPLv3 license. -about_line2=Release: v0.14.1 +about_line2=Release: v0.15 about_line3=Development & maintenance by Dmitry Isaenko. about_AboutName=About main_tab_audio=Audio diff --git a/src/main/resources/locale_rus.properties b/src/main/resources/locale_rus.properties index 09eb876..aa4b42e 100644 --- a/src/main/resources/locale_rus.properties +++ b/src/main/resources/locale_rus.properties @@ -1,6 +1,6 @@ menu_File_Recent=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u044B... about_line1=mplayer4amine \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u043F\u043E \u043B\u0438\u0446\u0435\u043D\u0437\u0438\u0438 GNU GPLv3. -about_line2=\u0420\u0435\u043B\u0438\u0437: v0.14.1 +about_line2=\u0420\u0435\u043B\u0438\u0437: v0.15 about_line3=\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043E \u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0414\u043C\u0438\u0442\u0440\u0438\u0435\u043C \u0418\u0441\u0430\u0435\u043D\u043A\u043E. about_AboutName=\u041E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 main_tab_audio=\u0410\u0443\u0434\u0438\u043E diff --git a/src/main/resources/res/landing.css b/src/main/resources/res/landing.css index e0b9134..cd0f187 100644 --- a/src/main/resources/res/landing.css +++ b/src/main/resources/res/landing.css @@ -97,7 +97,7 @@ -fx-fill: #000000; } .tab-paneSettings .tab:selected SVGPath{ - -fx-fill: #f90000; + -fx-fill: #c30000; } .tab-paneSettings .tab{ -fx-background-color: #ffffff; diff --git a/src/main/resources/res/pocket.png b/src/main/resources/res/pocket.png index eea78aa4b2aee2e2041edf6052e59e74d71a2a3e..912a54f4477612b006149da8c95a70fa1551be0a 100644 GIT binary patch literal 34719 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 QVE_OC07*qoM6N<$f@Tja&j0`b literal 32120 zcmV)@K!LxBP)WFU8GbZ8()Nlj2>E@cM*03ZNKL_t(|+U%Wom|Ru) z$3N$m={wtd$(AIWUPwqIfj|OEi4;+abP*L46{M)3C>B&eK@k*{B2s<`(gf*J69^@Q zkV*>ao84^R*`0Fl`TcS4Y<81PvSoH=b~Equ+-G)XXU@H+e9v3Y`>LcUk)!}BpaB9f zW7xLKZa>!Trl=1jQbQ1T((HwA0+Fu&kUwtMd_PP7TpOWTz%;-QWC3pbcip}Ygn$;H z5!fme7Ekx)yt1^VZuNfdtJ%Lv0WJlwVa27Q;0Sg7$GMr~3m~LlXia1QIZ$Nyv=Q90{^J)XMHqTUX$<1Dk=x4n=!*dS=xNZ|`2y zydR)PQh-a*Pz04D3YI9{P^{C^L8dUqc?w)*(oS9J`1zQC8z^m(L z?Z-Hhq7=oPV<`Yvj#{L-RmZu&8hh85rxs3?Zya&OkOWpw*A3Mt${dF;3bx&8YzJhqD?{EmX3?+#RZrLRvoDtma;m!;M;@M&U7f!dM^ACI z6!pt^(W!SRLR?E&nj2xo~<$nRu&lb86e^C;fQj=lJ!f&jaiR&I6u}j`JZa79Gmq%6FyD zsSP%*6ha*Pt1&01z%@Yn*{9DF1Sa^4vw^1^iuQ+b>BUjw$04`g4n+_KmLsECr6l@}nJ6+)NyT;KJ4u-jXoqw8E)8wBy4R z8U~4;Jp2;AzU%=S!hyyzPxjH91G|?UN+1)57`V(*oMW~Te9?rGJ0_mV#UDSMLO~p; z!sTasM{~rbX_t0HB6oL{B!)AohZ49{)LD&$U-4`1{Ex<*#DY)$m0J06qVGn6yqh~t zS<_l`qAG+g;T4;cnJIt`ePf1^?sCm(kAz>W_U8LH1RKe$U7cF>ai+5awX{_nE#7X} zI8Q^#G?C9@Ma>u~fDKJ@0O0~x#@yWbBiU{lIU|`7SG(x3RXZmJO}7Y!5cE zJKRQNxSf!U5HTYNA<%_}Q)py3JY;BYik#_G`f?fV&1HhWn7MENKItdtr=vc{uRnbO zhg5#sj&ZfU8HQ2-8$vo)0gj`05_+N1lcTK))FsseZm(Rx15Pjht6R&`hD|g_I%3+s zUvqJIW;ye7MsrTEjiL=NC*34nRdEb=Z2BKgDSjHjxPe31AwA?M1MeIlP~px>nsB0r zrhQc|%AX*$J;`UfU5XG=7mCz{A~pL`gs?7z6!xVcIzNwoFZw$>%6*?p6N+4vKS4e; z?W@Uk1ZKn>2}lRp_quG3DN1J1Fq6zGU`JUJfa}Q_-;^ihPmsEz?X&20p<1AzXHX2} zQiy_8-S@tVCQrzpAfKG^&7=U?nT69N5OJcNo&s5t8#OY~Gk~R8x?9%eR3~iFTr=`> z(yKYUEo{~1HewI}b+AidaXWP{?&;N>@|uyKOE}1m&K@a&CO`Vr6u^>{bCr>e zN;-=nnGWwMiV*V3k@3&!bVkv%y>uRRP(;7M5GA#}#K<#>rX>VmFU-3}X6SCIque=$ z?0u5BrYLb1L&lE92ZU#5R>pNve6#$>PLWR_q$(6Ck{nb$i;&pQzNatWEI%^-*{sH% zA{8ObG}4Yv>0?R6y?{*)MT^@)xM#|FGIvi}GpP$jG6Xo*!7pL=#d@FX@X33ooEKM+ z&B?5gSO;H8aj_)eUcg@g`TCqIoe`_mbcE zNC7@7b7c(rgr8D4xtr5=xC5&vM|Je?Qwk@?$#g$j0!{MV7gHQ8L3BA_yfpi}gEq-c zz5+SMSJ0{Wi$j2G9mtm!?f)2Gfo$>>3_8f{dq0|5>Txz~IH45SbZ*JaL7Ut+=3d#E zpIto!xz_%!=vd@9eDaOCgRA%6Iq^&hv^vq|rj~u2M8grDTtyS=HMtI-eBsC+4$8zn zGX3IiJ9i3L`*O4B-;Yeccu+w$!B;4OXICEkn?o{jP9n_mKA?H9A`fn#a7O1M+F$T& z>aq+yQJ~#E;fz5vE?pQcJh31JusHa<6x3f9y3%ER#)z0t<_|_4-)#YMgRW6 zsKF~XI6r%o1fC>Sb#w6jUIGz1wdk;zPvVcqERqhz@@t6{c>3fs6CfRmDt|mk<(z&y z@hqteHInZutV(gQ!F4MC$))HqpTIv)IY&AaO$t)RjQ#^nkq$+Ze;%ZK{*(R168OKA z^LcQo{gi?!F)j>#rF1G<%9s%&PY$&14BiYjpoj~;Mm+T zF>QE)H*KunF_Y(So%rQW z#XO}u4W7{hd#q!riyf0QS_0crkcb_ZodDF|HR-IFOi-&UU1sW@P7`wq41;IB2V|!1 zk*%)um;r2s6$lUkj!ub)vC+T2;8N6#vo^dMlLk-l=Ft!iAV}$5gRPGV1P$Q;CwTK> z*6yekkC3Z-RN%WQfDMea@#!Tl;J8KklZ2~v=YSi$Yw}lkyM8^2P>?Bj#Q|gzMJT*o zzn;4$e2;*%@UqYj0j=l@5G9#fSPS9s(}l znd9@u$7ILzsQR!sY^aLTnU68qo=p>~^r=qyw-}}G{?)jXC9nY~BuVoqCOZdn0dq&E z6%V+f8%G^azz8FTxkLHV3%-EI?L;P_UoRpJT8$u&Z+$l=?M=)ajS9uUR8mDF`cC6r z8PjqdKKbksSH$Y*c~b7|vAPx=GegSex8$FGepwQqhPG08KRWB%G2vpfGRq}!V+t*O zH*NsjS?wFRbNR}ug~R@QS7lj&-1PcAa`$@=N!hYk{^_UROzP)7FGi^zE-pJl0`CC+ zWE2yVRYWua1e{dn&KYoHx2%83G8qq3*)S_3jfZ}JH5q;{s;07g&1YP4=^6a>SC=R4 zGvB}U9ojO=2i(rsj0$w2P5{zL!g|li3b2Umkcy_LMJE(a7*Iohn($=+)M4uPO7psT z?2aE&U0JfnI;1HyZ`sM&Up|(<{_@+XYI03;)V}$L{0ReYYk}^e$d%zK)LdhdQ4dQ- zi?s$sbT~^>9S=4d1FI@p;mTlpM}vJfB5_V zy}-`8MhqkIn|yRG{F;;6$iR=Z%*!a}-NsExd4wftt%zYbTN49&yroB8LrbIsRVc#_ zTm`wAJbm{K`vn((5CX5;$rTr!%42`}5etu)g5T#!0{P#Xi{?m>x8{6j!0nZL^ANBw z8P{|&0xY`4&X}7$YCsMBee+`4j38o|xt1qZm-EU4zhcsu-svzx2*y;E^0%A5%bAOg zMAs63!b7zk;Ww{)X~1nAom-7tb(Bac6_TuwdQt*RUb$WavQI7;*jb|Gjh|skNkkgM z23%*HcqGr?dm}~pS$+Pk&*S1}-#v%V9eEforz4>Yz_bO5XKOzha9bBG`v*=%Q-u)6 zC)>JCHh@`Kqi(4>2~aQm=)rzB^xE93+1lQ~K*h{tA(zv^Z9o1xfBwa{@VK1=YUhDl zzt59@xt^(GDv=2asgg)kdv2bXe#wB_b1E9ZnO*ew6u=HZCk?cL#r5mh8EhUFy4S2J zV|e3{-*EnE3u4yh%qe4d_5Xgu-*5U3g}HmUp_+jH-M4x1fZLdwF#=%TUTQ`PVEfU( zrXOw%Sifm~^LASl8M*-Tx?TMGnhSaM?>8{2yeP&jM1pB@+6i-6`|91?b>n5^W~5^f zKhtt_ZeH8HX25NIE`KaQbdXY3#Dh@jQ8@!MaIA{K*|9{@!Xu{e_P=iC>t`L0q72?N znGpjcVsPHs$FuJ3d->&+=ac4h$4yLBgusv{9p3x_we`*A{|BH0hbPn8PC9^jpaSsC z%^KP7Hr_t!I@Yz;3`y%@RaqhT{^oo9>y95XqBw8R?r02F}PfO`D9clEoCovk})jC2esU}gAy+;sH?EP3n} zPC0INT<|+K9O+g4~+EI@PM)=;9 z=hC?BQGRpnh2*6BdsJ)&DkVs1&C{o?H3RO)yqu8$RVjcSm_|hgH zL{b(0cGGvr%}P($GYCLP5D^ekpsEV(p$N4bw-OA6x$3G5Sij_cZo29Max(qho_(Mv zrzH|01Oa2<{^9xA)c~0nGA(IRYbPVXMojXT45)#%G1v{`Mc+L81ZGaDPW*!ido|d2 zQ51ng)945Wsok&*O-io0_Chu;`3Jwb<|6z)4~Ai4NE1a7C`$iNuDPQm3 z4WQk_`$wbz)&pf_;RkZYr43BM-qgN(NPw##Ho; zHPA5N=N#k96TswT(ZiAnU?xxrxF*)E>vtn<>1CbzS2DvZFFS+tPCJI7Mp4l*7z$Ch zX(yq^R?fZf6h3+F?<|}>*-AFrN06CFf@YYV!NvhU-_-O{fbx`x*fSNoRb4My-~R~f zk0+jfK<wK+n`1>Nucqm@HiFoRjA>97qU(?$BvzY$d$2mKUD*U8lI%TTT{@ zW@`<%5BPZ|So*sUD_|i7u)Qd|$dx%DCesiJbc%@kUlfV$WK~%q6{Q6XC(<>Qrq*_7 zYv-l=e_;csx7(TZy>JYU6&?G|onR%u8JhxFm*=>aYZaiP$Tcv3P+Rl}y4b%Ck?8o} zg-1+bIFhbw)YjBfF}0eno__2>H@dyah|$EjRZRz~QvmDo9Dm~`50I7b7#P4h%>D0z zs-j?;i5C(V%$dw^B~8~cYa99cdG?7Taq#huej`>VA4Ym|6<|aPU|p!zO1qVr>r5L^ zJF*8cLs60|repSDV}~uk6b0HkIw%`Gf`zjuA!YAHaw%hDRj>5s3icdbNde4$j%*+! z+c~gmG(zlqWY9DvimG6ki4RZ9%gz`wzOVjIrXXL}nLj(qsYNg6E;h@t%$)^Lnha|^ znT#B6RS0LA(?6g_oJx0qsj6yEUUG1;$~YP~5@E~{!U~(}h!~8SI1;BrKj^rNF29Wp zz%sEn?3@(9EQ$b`e$D0b>jUFpUd`D}ur~~&^L;Xy=qpMS>!OjSL`s2F6wnlerXn;I zsVYcCbgp(OC8m@;S^{PCbJ?>gUP=fX5k^;)QdL^eYYrBx{3(SN!2CAA604IY3BXLi znXbE)tO0IfnVQ?ilSJ4!Q-s(9v;miF%c;jxU_)YY z8@JPe%kSmQ_g3=UOYgAs!&Pjr*-bDMLDyBhZWnnu85HDXP+D5R=+PsXR9(T?5e2BZ zSs+at2LcR}Pd9Akzi)g%xT%%PEK-adXyXzvQWxme3IjQ&N!487I!; zsF{=SdEA|%T}MZd9lIJ>yJ;KmulSUAmaS#oXWP3OFrpyI&&gnXIKu6>-p}*@dykEq zw)3yQ{|wEk6OM#2rRCQuF3!X4bPzTo?9Yg+AW#*RJXdTEo$4KpWM@?g*j11M7${J$ z0TsR&a4>)zhnKogTjyDYWUBTUFIRzSnmBYFms8`zk5=*Mb8q7JdHDU0zQ&i&I-bnj zOlWC?aM;pT1qekTbsd}z5DG?XfNh($@%)<~@X*t*vE;)wbOf!F$2E10Jox0R2qCB_ z$>*_qe#)FlqcOr^LbfyCG);=~vv4^bL;@!JJ3S%*m!eVPjvd3vcK84)&#yRAxo_j^ zkf5V0NdhnwAj_x524LmxZ0bU7sCE^PWJ-n{HD^1Iyk_{+Te(He5H z{G9oP`CR_BFXH#QXsK^ON)tsGr zu=TJ*7GP13xm{{(#HZ1|Jl<>C%pUV_@*u3awJk395keqC5rhyNJ!c9Fjy#N_vO=1+ z)?h>o^n-}1QLABdQwv6Y6N)16`aGO|#&Mi}*5@G@vc9D2wAVG#u&W+LQBV|RkHlaY z{86e5NJLQs^KNk=eDV0RM$s&?=M*_|eNRqb@v2RlLpx9#fj`_b=2 z$5~MnOhc04^`L7S#(vM|2}~*RsIk>e{SGf!elTYu0hSDoW)skyit5eKV`D|Ca_0i@ z&s)FG(|`FfLWrcOiv_Twwjq8uv#l2$!El0R*1+d>qN&P$#dKl&wnunl>l4m)rsGu9 zG@FB&hcdtb6sMwVS&rBMEI+LPLYDvMi0R|l^5%Wq^^0$lo#{__M>lO5+9|#Jx^;S7 z4vV`<*<(D1ih?Q>W@T2!^wwD}A70hzu{qcw4X{XcTCv-qs9JW60Cwc-zhbm6k9+_1 z5<&>vE(gaRF_};P_qT+nNZYcrj!48fH1H)&G*#V`KA?xNDiae`D4e3jR>H`4`thm` z9fy+QV1ZCefi6@fD@Kk+fHA%To_qbhJxZRc;#LIzx%&pL`TFTG3oPv`8HUN09kquB z2a^(1Wxr!B5E#;`6EM{@{&NGnO?5F`b_T20fXD=OnZ{cp_LtV%0j zdrkNJh|)089U9ku<4Zhp`!y8iWhJD)E7op41h8cX1gm1d0E?!0n~@p&^ck+!owyVS z%}S^&k!wBC08;?kWS~@6G%|O76uTWPdlZd3T06N$w@H_9+`PkB^4P6hXdi8lCoNyS z@sMF)DC&MQOhrFGuVm(++~2M0V0PxJKXd^WipVhz5!>2|pL^?fl)5vy{l2GA)$ZLC z_Qa;AdHCIRU*q|EZ)9{uaojrn(V+q`+cdBC05AcBv2@X|EW3a30JbM}z@ZB;kU6>% z`{Je5X+=Ey>e4-vx*vbo%qi8p{_wB4{#$3_bq{{sfDcxDnpELi`$5M5O#^n~S4DKz zV(tnvO;N#sxfxZ1)&-9h+gh9i3q0ZEAB z+qmG13kS8TWL-luYc_04PGFfP2!V8{m`)X<+`m7`f-Hogs6A|+_D5G$A2(=S$#VKo zgvd_;3@V&z?2mEGf9qCS8UkGQlRw#O=irN^AUBiWUw;WN-T(7JHR-?k-Y3b&u@r%s z=0<7?N^1zMu>&Fo(xYQ~9DRy7>$Gbqpr~S>O)eZUP*M22mB(;UDBqcmCY0z2SMyK? zSZpCV?m&YDp@2^ZQaOqYG0r!X7 zNPl7_{wG$F_Vg;!ANvH~e?LX9X+e7RekA(nQrf8Ni-hl196hMrDs^X~3pMKdi5#*3 zQ-yG5JH3O__K(&)O-)@R7hHX-wU)YosyDu{`LibRzlUz(-rsyLrrCJkT>43J=wTA1 zZbe%7o?U}$$reN)1WpB98YrM`YsB~5TAV9ukPemJ=Gc%nSKM3Nj`sVCaLb@}t;m&u zDimGL|4G6M@+BHz5qppG<>+aHc9RQBXS3wPHT@qXMd6gs&*7bCZ|BZaPo^?`;OCZ- zMh{a3XbNf1u0`G13YjkG3L-@TuMWD3d+}EEEsdZly+^MQD0>;OByd{cWOBB?JGgp> z393+(Ngv)*c&Gx*v<*$(Jon%M?5-_~si|w^`rkjW4;Sm*Q%X#q6aTUrzEM7wHQ&3O z2TnVU@wvG}TMv^G)1%}1U^_}p3#2>2=pny?i3KVZ-0y9(3?aQ9L(#2fSoF`+2Fdr; zl_oCz6RJ?y)KN1kQR_V^L_~p5a~x@ddXI08n8(9Uz1B@k={3-F6{V#E=c--cccP*2 zl}VHM_|i*x>a4SvS=>KM@N4gUoLId}(@@&NIM&uen#%&$f#f}>hEm^-wxtQvsrSyZ zCDQO8=!`N+1j0;RpzUl$gd&!x z*bA_r2wa;QKwZGV`woM~>S1B5_RRGf;&NyXFRx4R1Ih!aPT>eawDwFFqUazn!8 z282LsXtyh%^a5Z~TFFWq+YyGe^s|HhM&Ncj5J1QXGbXKoOFw!rZoPDC4zMbx9&$RE z0?-->jt~f@zJ1%E-|+HXD;ep{;i7APzbBc%!Nf#cX%L~Xy`T=vagHb}f05ljGXWJnNKv z>7i=mpgz=^ro`#!h__)QUmbB2|9)XH?=4^3dtF5e=!`~CdNrz}va`8;(Mf#r+TZ#8 zb(icn)^X|bb%`5%fh8K6eHnj=RMg%vJk#QGY)+L@S zuu5Y=0-Vjs0I+dNoX-q5M+xh<2PNTdepR&T-gbloin1u5@R?&yvSX8C8afD0K_N$9_rL=+^9(m+B z9)I>Vo|$=RLi#wunFWxrge=Ktj<_KJ03ZNKL_t&lFn_F)-Sn2`y?Ha2R?X+9w?D`y z>$V&iWQsru8btDZm<2uvgb!?S6V@WcsS_NPi_#w6#~4siTEKOeoyiAJ-Nx-d`9^}! zB@khQNVXRda7~s?hRb-=dge{}ben@pW*}S8U8-I5n=VuFL- zWdUeUajol61z3K8EB?u7Zd(5m6WoP-@v@&2G!J6%kU+?w?TB(qxeuB9UtCf^Tab>! ziZI=pEmrPl@D+u!qQr49BoHxan^kH#kHhBvK_-Cq2p!|{F#HZUP@Y3+qNKU`=`Zi5 zV{Hp}ZeNnHF3w&341l=U_s7aatocL&EILE^d5*+ndwMUho!Z()&b;jBds)8rU0g~> zm`H}3wgr{Y9)gaD?H5w^T&9GU4#L%WbWF%Y355Dr1y4%Mu+e)*xMAAg@4JyhX%Ay$ zx(FOQ(n==U-b246&>SXGmO*e*0ZPc&Z@q`4_-dp_hn9{#S93cUCc$aN zw9OlV2pjzZmrw+X%Z0ZrAJyf+j2M{VFlIP{8Hrf$J3k9!8V0Jzjk_cl&E1b^cSWGI zgb0>r(sI%`%nT>A1iSYu6ect=m(~RpNM-+ao^U8kPE|3lJo6^syx~rMUVSP@zxf-I zgvKUf%_l=)z8s6`%w{go^!yPaTiGtr@MZ z6%2`)<|JH_j^TG9I>P-j2us66al6^}_{&5ZTdDZ!$@nTQ^S&7jBO|6&C|n2>hmPvh zk%me8wi?#m{uHjfZ1Rtrg$#$GFP2$FptOdG%sYUg7! zzAjFB_snOBnyrA=J9FUt`~vh zY^D-9BmkD@^^V!q*0yS6)dGsvznl;mwGr5jmAw4txs!ORb~(5F;HzBp<>R92P|sPB zr2Wrs@{$r00Yppl5@~4Wwezo|=9Bd}yG)kcYvKYxSyd@Vy?7^}5Nd4cOzP8b!$%+b zWtt|LMY$|q`U#6JxQ?-*Y+i0juB1LEJ9#1S_h14ZpcQxr zcp6v?)BqhoyQ0%!hM6~G0>8ZRTZ~TkqC50K&C#*%s+H)OX+)aaSbFgdYkE%}Hqef@N%n{WUVr6Xjz0eyPH>IovD!~aMp|2R7%$bWk-$xdiVha#VE4LI{rn~)e$_t$ zz`uc8fYpG}WgwKj#7BvhZR+z2W^(F+85}mYlF~T(t)yWhG!;)#E=Dj&%j(Yv)i>cP z$iX+N3?U_fnmQ|1H%{OWMIyKz8or7W9=iMAoPEV_`C{P|9^A2vWThvkU(A=^`)f#^ zzr-ubY2u=6<@p!%L?C9XLh6Y;f zQOeKBWbTX!9C_F{j+!-*vZCDhZdi582Es69ws zLo>T}H&RpANNs%+4Na{WLZIq8&%XFJOFvr6(V3(9LBm?I0Y6sIpO@q*JO{A7@)#;M zykcUR>en6$0E^O^Mfnp)|EnfGCwrTLzuDX?T7JO?90ttwcsN7X8Pn2&u%i_IU0uzs zJ9hA1OACf=y3ffRaqfvUiUuPg9k}A!?eo)#ZuRjQeqe;4b81= z*u0aE*KFdWRU28eaVs^ojWjm55(h z9H(jgprnMyckgCbC`9e%vu0U{A;(gw5vyLwnyZmb%vV}RMf zEMTN9E$H!IYr?*LTq$7ylTS%Sd_lOXy#;Z(Ul>>qtg`hk2XHuWF|fce&~4*^*h{4J zL?ZlQ>sA)!=kvG_JSHWL_4Raggjo6MW>&4=!qYFmLv>{dld3D2I=+%IRi%^^Kj{n29(2rL)R%#6taNrZZ|DL5DA3{hrAfb!gsX3 zWEt>z;3y%`?I6DWO|~f|$L-w7LZ_3Hva;B!DExfN6l&J5N4B)EYj+d7b~mx)!`0+u z`l&1{WMXwWlgCytc4R4~1vzA<`{HZr-w(A0I#{u06R*7e5w9*;&YBHdX=!WU2UH6k z4rVI~s;*NU3gHogA|c4IC4pukh$sqSAqWdWNLAUDmPUtRAVVR-kqA3XlVwt}#^!RX zZLqxxEC4P5W)L4!cBwN7~Juf7a| z4j=>{XJ%3(1b-?m<(b-ABHOojJ5%LyI!N=nDa_5JYD5uJ$5%3STou)o#pGoA;|{i9 zD9nmApYiN#@A1mp%h>SQ4qDoSn0rOVkMjGuMpZeksfipR5Q>5;9PVaWReD%FQV4>& zjv*z|G%-z+fRyYMg2#p6ccw|J{aa}pmgWQ3+M?rN)0u^n`1g+G@5JeLNuh&HBaVTW z&A=90JapRPN>M*WO{8ROeLZ7@;PB>V%y5{OrcB|dPABWvts~gbKu0h{M=(TPLo+Ma zZ{g*)mywl`#>f$cOc*_aspG2{Q&~buVa}jdbP0tctXjW?XJ1{)OK&Y>?S`$iwg>l# z)F0*dbAzsPY*Q0H(?l~(i>nz1p}pEP_G9f-LZNOG>H@N)q+AG;^mKmK+>9wDDprv7 zo4|uuDW3*gjv49AhdrqShBd&VTjq!|cZQ(7F+QS^t%ygLRXWx&*Z#6_X)h{|y}O^f zY#FBmL5G98=gi^H&CS$&_8Coq0ES`E+!~;zt({FBBb+=GB!l$2Y=lRz^;F(w6W#zif1cRaOrZXX!qpJMe?PgAUJ8E-t z=l^4w)Z1g4T;AT!XJuvFyJZW~G!gckya}uTjvjP?K;mH(jvSa&D@tZ<^g2;vl86SOaEV7Ugd^PM79TN^)l^;PR{RppV%lX-LZZfYAF zS?u$%qqUWAAV5bj#HMY#*tBgIuP*tBtn@T0%L*7jY6O$VR4{&Y86%4G$VyM!uL~g1 z9%RdoI^KT&6P|nReU>g?OJj3ecWxvEg&q&{91bo{Pv_W8n=raQ?;w%^Ob&-R%`o_b zrXeC06X{@I6aQe)kxOoiuJ^J-0br$oe_UEY+-?|R&lv?B%NL`@>Au*y%o!hiz!?Be zCoksbvpy1`J{02dkt6x2zMe>39j0MW*U(H|Lo@Gvybiz5LvcY46RSrsclvl{P8ma4 zk)=wscZ8^GXyUUiyZGRfPkCqAT2`#t$gcWkD>Zmm5y|c5i>k^on#R#>ZRiaRaRF9W z4)1Pjqg2z-bR7|iVA^xi5nq)kt|yxl1+ejed%6+dELzb8=fDcu6~SVD4qSnBsDA889szW^5#atF@JIoVZp`!6xW+}DY_U_{i{FJHN1IrO%2t+;h_*08V1+SpU;EuyhB@C+n(=7 z3_jah!$bdmg=b$}f?=2h+B=9C#=hwZolbH}O1Qw|;j%SrCgg8Q9m7`RQd zlWQsVh8GX2@Z>5xgRRAf0>G-Oz4?j z1OkD5%;}Mc!S2SM3)d-%!o;d7e(Q9yaK#EjUHWV$K|dwn42RLWM0`X;s^SB%92Pfh zEE>)LiyDu{j`bH3Pk?D%bgm98$MfEyQHdlW1R*JTa`I$;5{a;L^=h&Jx2mG5DlREe zrKCj&R6v?0Vbi1mXtzP=_INm^q=aK%eYG37l7%E-8U}`8bc%;gtU%zn0L+^WP+V4q zWAkPr@z{3~0k9lk#F#i5IHD8j>LQ+Pu}3!<5<@D$Znv9n7Zvg7x^;+PkaIMRZ)h4L zbe%LQ@dpARC9OUmrX5w^V4B>mDEzU#ot8+1_CSD*>(-I1Bmu)N-WLU!7c1I6E|xV{ z20+H<&17R8Vjq?qtQg3zbjLU0rpFdVge@L!wSkrl=a!lr4t|uI%cGk&V4 z4B~EU!>|`-*nV|2?(rLD09U1@@n&WwZ`RdenkKvI>p|BM;V?4E0A>h5vy@;vngy0W zGG6sv3tU-Xolq*Ug%~p)3qIb4w2~~{omT9Rt0;^c>v&33A898+W#@Y^yzB(-F$@TW zI5jViD_UC60s%tyX3(|dgxTc^0hui=RApqK>3S!34(K|`7{f26#Ag`zq(otl%{*QJ zOLL{83B?2C$4f0uM8&^xWu9#HsMmiL*ZX>bY`en-R_cI2GAueFs7+7Dv^md7!Qh@a zz+RHB>z#Fwr4Sg3Lb8(C#lYbLCd5$(8@2Tvid^ZA;R-MfaG7vag**OAIFb@vVXXMWDCGiEh@Z)MKxdrnZ_Gp zQOD};v@}+^-Mp{s+%j<@N^2`khQYH=C!sz9q$3bOnxFm|6t^kJ1MWCajGZ~Io*P){$=>WD^ z)A*~DY{GK%kH$Lm8t;gj91CD2wpu=H0Hy)78=*6E9KM81u!?1^DzQb9An*e4UOz;# zzKVekU{^r_*O!%Xk*0B)uJhQ(AJevVD+IcjT2z(h_I7?D1Yu1>wcU>Nt6Y!{MQmJW_M`CNVm-g;#W@hrOk`mtCzMc14T994h z3!~)E&E*?@KQkK|xW_Pfw5bWF5L}~a6ssyyRmlv6ti&>kLaVN`*z4t=io(l{jqJ3! zpOli7H8q@BT+Fw}kLUai8xZa735`G0gy2`I$_IAzJV3P#utWr0mwK|u)VZORr$QnC+E4{G7V&r{k)YR zC)=-iAiY9J5p7e~WoAiR{Sg~8j z0Ou$Q6Ku|-2!Rj+Q&9-%I>LUhN{Mb52-{Z`bUJBsxoA^Wwz^!r<@fV8ux|HmcJJCn zI27t}$N79l26sjx6t%YQBd0{89R4+92KQuS@WK1HAJqc{K4Ib@S=g2>$=OPf+n}ct3`?KEVsVXPvIzI$P)z=g5#kLs&R(m`&ckJiP zuW52;Ai(KqX-p3WyKyB=N-hWlI7!oZ*X80aMPXZWGaFW{;A9~v^85J;Ff9Mi-)8T0qz6N3nmd;-37dBUmLK}X*Xd-8U$>>1?`77x?J)AR?4UodvBqz!tLf} zDLK(JafU*@Haau_k2@S(5f0OF0H^pVBS-Scr=K1W^kE@r7lIZcxWzQNUrMW76M(Mc zaJwmSxtI|QGCdIB7{eeB2q+2>RV5vWC<=z65Y{wI+r8m54DvfV2m!A-oh$>McRE?z z)YO@GLtsU0{0J-AYoY_J|2+8|ez@Y%P^%Gi54Lz1FDq%?DTR}=AK9@ysbp7^Ju!)` zSPsx=_NnH*z!rUt=Jt?XfaQ#u;<1YQt?Oc*nv$E#UCqtR2#1OEGR9B>zXg6p@8Tsj zU1zb&#iW*&gSIPxh!AXXIQWmEaAz>cR?{TdrBAvLjKPX@Z&wryA@JECH5G-3qFCP* z0^Kyp35N*+%QcN%h5?aC=faY%6T-(${Ngo`) zLEw8>Rbcu;v(nOdDG)$6j9&FIS^+VjX{_>kc~nZCZf&K;vP!h|z ze9U?ZBtXf`Vj?Oz01Xu>FIpd-cBeOWP2n+t6@-! zRXC%ihu1aAuV%G`4m$1s1W+&O)9hp_hJM|lC*b@V84mp6yV}GWJ7k|9@>t%Bb zZ{PgpumV>Y_yqU|R>jP1w#ZcIa`9`wpL1(!IuA+qhTg_1Uez>!XUb4jmMaSR;c!eh z5mN}7Rh7S`rSaR24jO~OPJ@qbbEYyZM}C(5_XJ>~{kNKg^Y_5i3%K~h`&i&F8u?Q5 zw)KMrvccwHX9M@VdBl~D!{54P*nq3a76tFasuU8i!8JWAi(6bSj@-75U>^o|J68Ry zoiUKfzvp)I^Y->Zi-CK4^l0vAY~(q^pl$bVbgcScC)m2ccw2WH3gi|7Q_4qxGrJh% zh7`aaD063gWnG-oW5_j*NUCVx~E?g<1?+S|#-vJ{?(Rhp=r_@!g(FMU2|G_TgJZMG%aK{G@Q203i~ z_J~FKlZTDIwG6l!xD6|C)dWf$4sO>pZfg)Nx%uM|G`P2e00>8Aa2LH4-qhzMy|00w-m%WvJq?Ng$~@N>s%NP5BhNl2{h_D zCskGP{_538`~C%3^}oJii@&ZUom>03%&S<@azlcHDJK?9Re<9sq!kW%aCHFxv3KTY zyMQZQ)40v;=8V?Xee%Hfc47Y4=7fV`fcbqm%=0eSpq~p9KxR11o2yszooUlh6s0pQ z-a}Zyet(J@fs&9;FPs7}<&Ltsp228;Fbq8Ux|W?8z^z{>nB+gPY0Ho{W;_Ah3cTM% z1NQ1VSLfw%S#2%-)pUZuPq0o^_hmQiEns#7??ob9q$r&wat9k|3wP|mGi3^IHZ@_` z$5VCzA7Pc9Eyl{jkxVIh@+N$l`?tQMKijlL@-uckGY_SEFsr zxYgFZqV8K=Rk_jc=eq6N8EEKNU()6@Bp zUHV51aNyH{NBanzzTDHqDmuQ%4t0u0RDr`Z5s?T_`uzm$U|($RzsVLAN7~#hSvc8- z;=@_iyw&GJe=LOAMhyL7vF>A3iaMpzn>QrE6|lv^yX?i;&1&QK^MjTaLNO4z1aK@? z5%$5PkAUw>+2=$$edVk=Rt)3a-Wk(D-a7D08=6|&pK{psV9GvX);fX}{$&s-)aH27a%0ak>z;etE zrkDuUv7D!)0lI@AvN(Ys&zZxC>FIp8riLe4S}=P!V&eoRV<42`iD^2wSZ-@kPxwo@4&Q>Uq1GV>u;p0R!sqC@>f(%?9DXbWvzwam7zVB$0&7Ex zLP${vI20q6|0PY|t*he;_D&qlqUyE563tWc6$bE z4zl~jitDTdo^&`kr=w#)yQ&m|h@$XRRTbY7f?dm&SveW^A{{H|;WR7<(^0nWm8{Vn zQ?n{~VB5PzX->z8mS8Amrteq*EE*_zHsH8z_xd5ny@b81reU20i}b+eMVFn##5zA# zdysa+U}b}fMA%B-q8nrkK^6w?Gz`w@<02QfL8is!qB$Jq!D-X@O;Z!~>(^WT+G{cS zu)?I~+Q6EIl~GwF`TQ?%rBmk465HDA&$0K}n8YTE7z6B`Y=?Ko_E6i9G;nOSx!8wT zX8Py?j~4HXzU}~?iUZ(dtuwh5g_VjzVV47u2fDuwG`QU?cRG2hxR}4Uwb8g~(>~vI zVOa&oW2FU{V~d2oAvXUf<&5FQy45vUXGDnwz+%P0O!<}nY2u&rCx5SU0jz#%NCK<` zI2SmbJ@vRm7h^^AwUnVr(ln`axhOn94oJ=JXT;;-&b&O{ZEfX2kB88zRo(O}1?yt@tK@i$t%0p=8y6fR;+H>7L$|CvEX1)?sX;b+hFob0|TP*Sc!2G zA;J!nqs66s9G-Az{keu#AjEZuH*IMFz7F6-NB8*BzW;6s?P zviBDP)fWyy-&b$xjs$~?0dlYi@Rr+6qpo+Br0oD6FDM`{Cx;7bYuVD!Ku08k5f1kV zE^Hk&f_3gpABOXMZ2ouzBD2a{FoqbE@s1S-`!;ZEFgZ#d$DCU29V9fw`%&a@FdJwO zh4|FtVM91fq#p+}tFYoT9m8<0cNb5mbo&Pw()TXJgy8ZQI`1c7Esms=hx`xmD**&zza*?x&ybnG4=PF$8P)m6gqZnt0?^jT`-J zOyV8kpY>I>51n*w(3Kc@wv6=eTZ;J0Tg1Y+YaMJwx?gC03qg5?VSG0U`7Xd+9z*RY)y z29g3k0ur5m&WP;_{?3ZJe}!Xx-@>onZ|_W>3Zs}7W+MPza|91zh(fepXt}s(HP~j)$79F?rXkKBD<}I}+JHLtFKiC*H-nvBbn{nPq;(Tc-4feL zUn*BKki_=cH*bjspmqb(yw#@P`g`**{-V+Ht@fK6 zz4JjK1)L?a3DDU8)zsB%4_4^@?r^{9X72n^oFF%OCqW?OvnIu3lA_Fck|D-bz`=LCo^t8IRE!qDBan`gA@zfC#&y4Z6BVz|I*Wf3?~_yI$vq0OO| zJ&IBBqanas92 zj{JJ8zq3^BM*sDN&YQCCF*nYEP(dzEX4LU|Q0qKprG$QIT9;Vl_e7X|8y7Qm%$U_6 zlkB?SD9G5FCrLY}?P2jKj|`Cwm`wSblAgfpYrT#1`*~OC*ZimDSeyG5IQa@>T_&$D z&HTkGh#>s0*nV(X9WJXPetWO&rJCDC4N`g?4jTIv9I-+wwAo%GJ46X_2b0yh2$Fw} z`>a}gRv4jm?;e=tC}^@jOIr`tY^pCf-DYni3?jqRA2X=;5Ah&E{Y+om&Z+{oC|HP@ zQS5})R#po6GJE_(RS^nZN(^g^PE@UFonKYvRTPt(8Ho;{$=kkR_$$kOosn6(VC+ z^p~T-;$>i<@ZEXEz3mGcdD<`;@l=QKvK(tPy3XaG42HMea7F^2fPeB+2!@2YzYw+U zN2eIV3Uv&+-c2r7C>aU3nznO0pd{AdRi*-4&u(aZkTU)Dk zQDwi@`=m|o>~0UF{SZ`>l=MAdjE&(P_w||0R%@6hHU9@m88@_}ozw?qEUe zm-XuqLJU2c$2^PmoFyH~d+$#)vqF8a$DWvRxv;Q{nItw5$I%psZabpQR>5jk9GGdJzgobNm#f)@{ z4&*Cp$Q_*aF?$hofr0trJ2~e&?f+qV9I^;S1NRK@LSzw$+SKaEWdyFE--;+``un6Q(MuUWMvqo9aSN*YRGHVKW1 zi5Yn+Dkz9eND#HRXVB8pBBP`ySXoXb}BR!ME>i^UBBW8^t(_YkTI#hAxGChLn$w zKx=DjL2_OtMVRzWIoA&2D<-x!4fKS2d`9YZr=~xhMZdOad+7pi`$=Z7~ zCA?5WkEH9d6;+fhMuic>ecUt6m(HCj-_o-1f4$I3GBP(GugfT{?mt1Jl;%`Th9ZqV z-(M;;YyHI|Fq9M(g_M<1Inog#2K_5iNx8YXz20wzjYw1I#?dh_oR;<6;`ZH&Mvv}x zUE5ENk9Rg&ozK@ABM@*oYCNCpad2=H7e_cJ?G_HtFQw@J2!6H3N~?*(vUL6ghC!t; z0wT08kvBxD!Gt4Axq>cfEHNFyXwTC-c7@F+F`0Fjr3dQJi(| zcjjB}NBFK+TXK?;2kS^(D8&AwZrk*xjw!z#=V7GM;QtIEz(_%r1rTHPa1qr?q!ayV zgn?AGU6bAl-(fu>m+re=voWmQ@%(tG+3Yb96VTyhWQ=LQY>Rli>dv;BFEXmtd?k-5 zD|2ymotvBMo6VQ(rx__LQ`XV>&o_nV#ipc$E?Qq;C(FO5q@)nAK8Dj)?fliy-(~cD zfqQs}tMqJ@PH#WiC0q7>GIIa-*ND;fd%9~KM{drMo1i^kprsnUb1ydYILK!*>;^Z# z%`3ec>(68CD1{`Yrz?v^yK#RC%+QfMmvMTBL-^C(Ydmi+jAs%N5#n(c6@bJY7W`yJ z;=f0RgoONvA3u9gR#NI6io$ijXk7k%QkeX_6M$4wRt8JkdwO=p?Q)F#_IQz>mzO6w zKQu6KkDX5@JyItN^xC6S z-`d)miiXB`xk~SRwLYY&iNndsNlHQC$}I~O4K0jb+mqXF(>?p^VKaxKx=#GJ_w*skX+?&-ELeVa`+A?Bqis`U{}hVy(Lu>-068>2@u*?-8&9=vUT32eV@J-vQc2ZEN53oSba7KxRWjgAXJf14FcQ0>vz_XLkETZhrHj zV4KjAcs4Pq5?a<9xqrGR4igeORMRT@f9!<`)^El;&Ys=1;Uy;e5`%w<2o7sNtwBdX z4vmd|JW+csB@dVKOG;b@3f?1+9ZnLjM@9pMdg4l&wZ@Qc+uoem*x2A*)fE+ymP zdhM>ePOVH}IJmek!16yI=f^nkWP-!$$;%@?0e%Y(gYKIr69t`fN_s?{J8M!10nUwN z=9+V$h4+UA>x-kQqi+UIs3F{+-!{%#-M%h5=mfr(^)n?`g)+5Ci9~|0RGM_8+8UFl(Hl!#Pb49OAryskCCUMdOf3L#mg%=YR76cq|DolJTnjXmP0_nA&X zL4la9?N#K$K(l5np||SD!dxLS_Wb^|w`-hLNq-D!45Vm{`~3OpQdwYwpGMjW7)Mtp zF&QQiIc5I)=MxpL8)7@2TfqpqG%6e>!@+5J^$?F#aQOTQAUH572_rHT&bszL~GgdTXnY|nFQ{&hcQc=tH^LxQ zQK@nb(rW!EZJmg#`e{YCb0K;fk;?LbDS4?MB4gvCX}p*(uV3w ztMwL0)DCrYXeP0&j^I&@$a7?5WK5oqw&$+Am6dT})AryvzR#j{>eWL}FGnTNNO|h2 zLOQr)WJG4>B$H`DE)R<%v>GI4Wh@Gfbp6BH2>T?U(?P!YV zo>NXw;fLpm)O#g_=Xhro6Y;4hf!?ejEe%6gcl4Kj<7wGg+ZqRoT(~8NfUAerVoL0M zXn1fC1((+)KvZ05WNM0|0z*b#o`RkImy|!SQo6dj1FY8u+|E!BJ$~1tlSC}5%JV(m zzVt)1(B?(2j{hFv{w@VU+=0Hh%Eu}ec!*_*C}(W7o^ig&v5_XWbB zY?dHEFf%g)xWKr19ei%(*RNlo^fb9c5yLV2v+S~pU z?5F@~K{ntAVn&3<3^Rh2Z&f4a#_5&?+eImzY`njOG`@QC_*xSuL(h2hA{s&>uqzLg zLsBZtt*&Cnrluq(OZxkbg`IU7nS(S^sj3y0mWHvSM9%4l9wFh2&@&?8j=FYqX6Xph z70bYEjkVk@$fIs<`WrIy7yZldlNH0v>(cSB>IL!fI2NtYcbhTTGK$)Nouu#h> z*7}#mu2kw?QbtoOpP5%%%S>c6H8H`aN~V-#1~@Cs*sp(gFI0?-SKKlf2pMySJa`8l zA3;d1KF)CXOFQ)N<;#-_NDocuH~X@nGt9A2<1x)EbSFLrT)CamR|JGx*ha~NV{XyU zzt1Iodye4kI9{NyIx!oi1>G+3fN6uF(#=juky2KUHv+@2qhobFU-|Pc5;H6cfTYRE z*-8?^)7D3BJ-)|$!Rt&?0o|lsHNLmY8#!6a>a!RAO&rONL8v^`9&sF5-z?mpwQ=N6 zA9G*73=v>1jd)t)2j;sRH{PG7mEHN+%JeHM4qiGv^Eq|_{G7q%NJ7*N0R16Fiag(7 zX`)XJM@L6hk$dlnflf~)T3S()7d*zJ!*1WCV(2RNH-cP-gdyF#hJsF{y8aW zYvU;9h$fk#i!&!e%}3n82LWm$pDlpD7;g_UtopYN1&UX-I{Ck*6F%0wXBUv9uN9Ip z6{PLuSJYv;%>fX?Oy%YjL;98^V?71GBcl4|B5d|P?`NQ8Z7Z>7d(!M+HZ-z&#@e%t zuW)TbKDe_h!t817VusNij@R~Yc3gN664b8lUXCv>5iNm3fpQCri{cmPt|f zmsNn~LiKj0O9KN-IKYN6uER{KT4qnFK&gnaD%tMc_#N>*{cg_#<%R&0(biLd3^ZbT zzNp3_BthrOJ1yYnCjxsYjOy8$yU%cRiF{L885<|({N^VAecs##-pr6o!H#QtX-Nr| z^4sb1%Id0BsH0%F3A8ox-zwGY7@&F7e`11oGrY1m$jSWTFq`-lI*#^!`%kV)cvTB> zBGQ}vpiGf`<96&|tFiNu`voH?aI0i_nL<{(B;e=HyD`yzg!KM6yRFoEF-|-=ywv>> z<*me_1z6I5P6#IfCn&>hZ9M(YhWgdXCd1K?=q-SSfE|I4hIn-EZ1}wRDVpZ@cfISN zIp#Ck{ptNbi4~0s-?Xl-2?<|9ZOWjl3a*AT@p9I;pTMx-G%3piY!VDEy(2nPRaX9@ zwZXcE#NTlp1P*WU4f_jT8VW}yKyt(AGCT7H1)0=F6H;o=Q;^sG%a6$uSoNrU$pwSV z%*+H}>ab#QnwnZ6fJEZsQEzW=p&kYgh|);{adiYK|H zQ^T!p8@vB=!OP33s{|BNgsxOzi17(gpKUpY*ZBs{{&*1e2uv2s-%vd}nUnKVFv;g` z89)mmOM9PC=NZn->*2PclyUqUj4SB~nr#CpepSpAhLrai&gS6Kg56y1ky+{NfqB zPUX&1tpUMINSJh*J-7eHp*JcXJUVT+yE0=0Ke=**q}UwZpB?o*FW7&`$UsM;nwy)~ zc|2H);3*pqM#L@a;2dlERbYQKJFLyIHu z{oq`h9Y8ojs&(!A?xNkF%&xzpEPbM3;~-|FOpgIaO-)T_(3O$>en45F+gi7+3<4B5 zc6vVDE~qHf0)cAD&lyC>kbYq+E9$Z`7QnXwaS~&hR(3|l1mH{oHUzK{vs+sPi{7;q z7L@J@$#YbQT)~i9(dGgl&)X@>Sh|OCd1db*WV`B}sClF+g+W{VHNLo{v`fCXZQnRb zQWqD;F3b#Sd?!q&D5GJ<#SJ{2c;9FdC0$q^?sS)Roe{QQrre%;k$igQ3T56V1CNi7 z4et&o`9ALFy*^)#f=ds0(bv}3xqaTb5JLhoGVoYfSQu_w0SuVJ>&C!pF-1m7nt$|) zk0?2Si306lr;I_a6=d}CPQEy-`83LyI)~w<93=j5OR1HsM^)nHhx)~J*FDulHRtA~ zA6#z}dvLk8m9QSG_7|UfUbN|H1}$mzNh5sShLj_&wzih2EypQCID*OZ(PS zWnj(@A@rcgD1bnG9+7D6ruUPjF!8BXl`)x+E89VpJ#%yiIG!=jtIlDUG z%4lg}1Md?V87WY>X{trR!I8AEpjua7&+Tzf_4afX^US`EC)Y69W!2-f)N8E1ul0HR z;_F~=;%X}4N{?$6geqJ^VOVJoCkr)#IP2Y3cF5(q^d9;3yl1AILHg6TzN9QAU~9x2 z{g}W0HK42vD58kQ=N)=|ID5GrXC&2TWztnt`x_n(+ho5v2E_ARZkHQ5sd!6NY|YSI z$G_@JtPdJ_lr!+(hcOxJEheY^Va?&81Q92}Oub=JKuNkuRTWhUzclZux4FB5nu~P@ z3C*`B!WL@#oq6(+vz~tQv9YnutgcFnh=^oYAOI}i`URj3@&5i`OVtL`!-T#QxuPL? z%6Js2BO@a_KzMk#r1R5kwa)A#3s*(0v6${zv9P&6til$tE22wXw{N%U3Gz$Ag50;8*zuNbhf$hcPLlDA3p_svuRkSkTv#kRdj(G!L zSbqS8+b6nT#`c25AHSQ4_;RO=8h+6Qrx z1V#_1iyv8CuC2Q0-@n(oUTAaJuJn|u6kA$Zg;|q0K*hQqU2&(*b*m*VZB9)TIZs$o z9Su1f)K;{aj;IzZ8s=9xB<#duO3hv!Fc{wGkM{kuc6qe7-czQM$CVVdMZIX^TB~q$ z(Ke~&(6}BrVMM4MvoJMvIIC>F9U+ZjvRSI|;Y>R_J$=5*{+eK&<`XpwmER4%OT%E$ z9hvrdWL2-!Ui|q$n>{^TB$xjCFx6tE)dM8AD=Ig;RejkbzP{;QWjqu|2w zayj5dTGGzu1EPun3({z_T<87v2>R4MH$UHcl;zp-xMqXkb|5MVkXPH!L!6q8 z*57Y#Zh*@;%FD}-w4u`T z?7Kf)0aR}x+d-FB;ERna_Gu*r(Wm~3GFDAp`eo=GPS1Cm*z z1jL`so^x<;FkneS6+OtNsx`P!CK*RQV)eq+zU_np*u&hG$#G?6G-KoA2ucYi4I`mq zKg(r^WF+w5Rp#XUA>p&9C2eeIFD@;0m$ty;YhQc*Pa2V);s9&=M{Y5!CI!esRxvcmLg;F*}$k=!<_9`kWN<2)NM>U5l zZ!|n^XSfg>NMVoK*9hBl5>yI>`L&=gEZk6qrGmm3czN*w0)k02B_xJoBLc{z2L=Xn z3t|EWY(r}U2F<17vE|g?TN2BOeta0CRtQq75HY}@vJ!J+D&Gw_XW&z}B5?QE+LN;H zB#^;G45H4YBx>>|VK0kr{W!J_OtQAD`qN~6Yzblkor5Eye#u19%YwdX%7)XMr>w2o z^amCCrqo~7>LoS{Nm>gzo5U$!57AcdVPGC#QE}wL6_*Bd1>n~mxWK~UhgQ*1PoT&l zho*vW?t1nEr!Xu_{{*wnxL|0P=azr(n5vGcfCuX)lB~;1kCY%;aVN@)GOBcpO++xE z2$NjV>nKNPxk0BX* zTFOr4!SN;1^@=l*GpwmR>Jtq=(k-Tt8+5}W@|%<(2nb%wf4>nRWWv3WB(jg4ySXre z&%<9eI>EJ%LMJ@iYF0oH$xC`ej)6;7AUXswk_D9-6q`XlLIG-z*{~$ENnJt{9L!?* z6C^ug{BUCofBVy1NbVd+8^Eja=%}e#+t`4YEdqS`$Rga)&0rG3LQ>YB`nN!i=`<+r z`N7Tz1-}88kxZzB>fpmWMQ^-Qpd^R;*goLfLGvZVB}?dg5pnqD??#Ad&6zSXAN&bX za>ThIm;_3T;Aie7M2}Syw`Sx>=a8H>&1XD&XiI9Q@H{5xL-->3%(b7p>2N`<%3K1mS%Kj>=I--M3fTzNpAK#&SBwJFfWa6d z`(lZT>YWW?%TkE#!5|xec>_oR#1g;E^^3!WQkCG_UKa#)z#JcpCO~W4V!*AguA-x( z*VrsG2ue&ZD(VVA}9rhX_o6t+}Ln+Vm09}U2dWRkx(+=b-cQZ=Z<3fi-cOfaET zqrlf3=(qg8xctEH^dLD9aWoa+$I&ga^3>EXI4Q@>@69&yAsnphr0 zSPYR~FsUi1h(*S3YzJ52Nk^_O>@t}iZWm>nA3tD${1gloTwYaGGyr7!|J`!qA^r!w z=1<5tT(5(JUmdP)qAIZ?w|vktf@k%H6je-21zbk>E$7$l%0aqc|XWi z@q(kR?r3W@ZUA?jDf1Irz_P353$1iO?qa5G*}YCv)@_hf(I z@LY+jsR2Y(X;syb23w#=_(Gtx_=Bf?zNZpLB ziADHDOvZ_Wak=J!SCve#VG`Vkc?sTj-0EEXN;i!zA{wTsNLf(&Q-U4PU3Kx;jpsK*;pb{`<=v;B%0$k7ug6V;gF=BHV=k898wG?EBw1zcM)0 z(SgaJRiWcPQ8xFT=#lLG4tq9wy*MLIL5ZGk1R*WkOlOy?NZV%!@e4n7Y3#qLRBRx? z>qq+(61fBdB0{pn~q%PXos)Q+03-EtglNk1iU_V7v@UGLI<}VgIPQ8X`i8sOG_LLrGZp$OA8C8D>U7}mSW@JKs+G?TnTXHoI1t;(IgN|gy0#txp7h|WZ?-{n}4@%Q2Z3yb=L}R5liVnH{YOQ5htM$ zCFbb;cxTc&N-BSHjbuPbiifVZ56rOoc+=ru8%Izh@5?3VRa;tGa=PB>B~Is+iVs}0 zW>?L-3fhM=6)vr;{CB#>0f!A00|$JQ zshJrq@ILrDO~N{tIT4dYI*fqNf2f43imlq`^$O9_tUb6qlRnvWhp;*+=w8 zFyX7Km{bxHCD8}+yBCPwHPQMbr=1>94!bqB5{&v)+lg$!Y#1~OtZ3ajx_ZN2FaRZS zSblueTTIuPPXb0*MDcNPKk(55tL(X$E+Vm9TEmb3Ibla$E-CLKpwtKA3~Ish&Ct{T z1KK8IBtT~DwB4PLXtbkG79JF^jqYz3&D0DG1d0)(brT)#cP$@}>!TwhOo>)pzyK~= z_M?Sq^#QMJ;nS{Kyktx$9mO9{csnuB zB@UDk+EPLj-I0b9UA|&^xJs}6H;_Cpt*F3@H4O_3+W^8IzUv-vAmhYw`k69lYy_Yc zzW3|?4TpXN@Jl;@ldkpo@YwRYn?z2sO$d6Sgsj0Dt7H1AhZT2vq#{iz=PcT-1#$Mn z#r)I25+3l%ZHz=}SfGG>!c_|zD}i}__@hJ+dxeH45#Z__KHuHZ#f|m`!akNdPd~Q|MsIR->OW>27yKOpuO}vtYTN+KCMfk-amJdHC!Z?^ zc1O163qAeY(n`;E^~%6a;=F-KD32MSQ`dcPj5EM7<^Uvtm1+gjahBB7)Qw-udb++J z4~c*ODygatSY&$-wf#El(`M%6=g$N>U#HV;i5+KXj|6r@Y<&D&^>$$y4L}$Em+S8U z1fFlxze=lg_>V1dH2_y1T-qr zk*u=$g5qsM5TC-S0XIANek}Vc>FZB{Bk}d@4MundYA#!Pj0o`ZrdL$Z0eJntiU?>V zf&+jZGh&54n#vp({FoPfa0!?lpVX703+eA2O`z1OH%GYYxI;8EGt0%7_2QA$rHZbG zU>`mWHKoypxU+egEd}|-bCwtM(a+-2$k&{6PTsyUVOts)PTF}k@$J7HE0C>MP*OtS z-12`=pA!4W%j6|vso=%kCF zyG$(~7+Cxpd@dVbRt6B!{{P7}>W8Xo*@I1@)9SlFnFmr?RgK>oYOhPG%c;)pyT7BgMD$yQ)X_=C!Emjg- z#nS{k&?6pRnpCPRrJ{d+B|r}$buG^>*sEj_}(lSl`7QX;B#z0Xbukyp=z$k)-yGw07r^B6L_I< z%r-4yGRKy+-cyQOXhx*SgX}Yf-c@j>506k7r|tpkfOG1;0ol>TF~|(02o4oBc5AH% zln;G!bv$euU8w!TQ19wpmn26v;nn0BC0^szaJJr!&I2&2`OYbOqFn4s#Scs3lzP#O zP`L^8VO4+j?`9Dtv&_zgB`dIxi}_A%^8!cIDYWsm`zU(H6-4gnH6NN#CrYBz-vc@OJ9|&E<6Wvb$`#xo zYUT4*_=1_MBDAx1!>V70{~^Hl<&MZEoC;1)jgEl+@6HJeOd%XR!7PkA~)5B3$S<9cv>6g+r4D&dTbi%aBT5(-AYmc(6!F1m;w zX$gUXs37SGG3tw8rxIGUNhCnYvNAkiUTxyVEz1gIrLw84EebG0*RY$oQ0VcjY;>zN z5>dHozmIj}sbhx-nbO5W-0jCM8w6xRaN+K9ztb!bmU!g8z~fn?R=UDg&%OJn#G%MF zg{ko|XjN<^B*T7Hl!|*7S4 z8mjauD-uGWno2;`8(!WP#WRlJ=s32PcxRY6q#KGBj4I~Z5HaX1pnYAev;TFTM6P%T zR*6QZE;7>cwLYFMK58CTER02?S<`#{Y;bgQ$r>fhr2!V<=n|?q{g}{3938cO$e$j= z7*#yW(74FbD=vfnhyE}{SZupEEe}Q+#ic+t6``Up)L7Ra=aAfdbCBwez#AA5xjoCzl=erxh31@?0DI?jtF}C6h4|doxOcFn)w4&ZdXx&;XM? zIa|Qb33toOJFu;%N0L2vgj(KqdM4+v=u2=8pZe+c5&4%4E?X*oke!B^B)>0-2qUn? z)QDra_?sXrv6^WG?TvOiSnJc9h&WBArhW0u{ZSWcVSW0Pc){STk=zo=;>LhNfE}dQ zXZ_I_h)uzJO=r(yoKBN?-c`zIUYPEsY^^oz(hTgJP+wu0zmNdZ^9D)8z&t%$cDoFp zu3lP^b9e=6j0|acJL8S1M;H+;kxr0A-B73nxjOO~MtNsdXVFTaMErMQA?fgm#`gA{ zlMX34USFx_s;rTv(``^)?A$9HI7@7$W>7-waSVaL@vJpr)3h7>=wo{I!LA>J!f`w4 z9Qu~^8`ya?YO-EeqsNMHdND=y_f`4KU0o(;v)Z3)aLn|lkXN(p-`iXh8b!R;>h=Ft zA6fJ{>w%-ds)_x=x0_K#{4U<-Z&@D3Rr_v6j|y>iOpYl;tL@7qKA*=fbjocwWck<~ z+#tsrsG{fgV?kGpTDCf4#eViq+ zv3MK0PGclnVVL0<=!-PY(*ZYCG?-kZ224&KrK4@0WlUNIc&Q07wItcMVVhiAt$Bw) z;#Uj=)Q4w(fnAx__8gUUf6G$TC-LoI2i^fs_^#Q@1yg(Tl;q%R9;yVIlf( zp_0!LOJt5kI08l&7dWFb22^?rlXK*38Wud|I&nu?&){#~!xWYUDzB*1p#}4kd|rK$ zw=Lr6_3fgzv<=H)6MvhuQ9e(tA>BfV7N`c|z9CnXJPq67RJZ*il%4e_!j~kTB?Hum zr*{`ZGM_1mPTj7X8e=aWVsuaW<1s~fKtM$nOmkm6h-~#Vxtr1e?*gunV~I3Qf3oB5 zcpV(E7IS%#f*{)5uDVL=e3`p((lPreo?Ff#@S0OvaP8^rTqs1IiC@)V7Jj~e^X&1M zoY|~wWbe8yQ2NC3eDXfA;hx4O@>}A{USo(v6PDfGG6rQv z$7UZ*-}6HSmwKx6_k>f z%i(XA#Zq~E=TZqaXv+PP9ScR9UZgy}_>C=5lzt2yM|1S}ORU9o8uED&eKXA9wo9;= z52yFXM&N5hZE3HpZX3=yk@uQ!XVl7VTd1KxROFkG%o!7mc^}zI?8>5sH2xDO$Q$dU z45$KEnsoM13AHjs7ovkT3zqe>W8ps$eLX2ANR_;nNi71HJ8;eiF0>jjd zWGMcQc$=y}Fj5$%^S=!xJy;C}x4$P#;`* z`p3Qq2LXO74v)cUh9Q&xJ-|aG?B)5`s33-Ugqise4~2G~$uK}uk|;5oi6Q;@rsc4Q|Y*!90=-|!X$OTh44ny!~nPICr*hL1oL9@2USbCv+6U%3X^?x%*C%YILAfoy%*uC2Fqe6 zHSGZ2uTRQ!E(We!(xuK8y9%n_N^IRNa5s5z3qx=yLkTUo&%x}L%p3N|9)tzT^9v~3 zY+Sj+Wa4azaBNIxweHh|z%2qK=b$P1=9`c~+!6cZxBrQL3T7rERKzG8vZ0WL4`fl` z?5Czb81}0S-TD0_^{uG880R@JbSFKPd!m)iND+cIJ>*y=^>iC1=fRl>!r9713%sNn zin|1gsX0Xs3lY_OtrIFxT@zf_t(kLRs3{9Qs^U7O;uZa9{yA)AmhuicG1#|QM6veo1YNKvzP{D?d&%I;A%}(PH)c*Z7hV z0s}>&BK9#2q7i1Fy`CYB7A)30jUW5#A=_K8ut=zJ*#YKp`p=u12QCj{V0cH6i@ThE zDicLphds?L2I6a$#H$$6)nbt?_RrYC~<&x<0TYedVQw3I`1akf&tvs3D@O z&Fa8c38K5}9@3>Tu|XxwHltk7u)o7f8HX;EC|WXQcVoP`cK*L_JXpQ5EqGD}@?oQVLX%vsgux-O;5SuH^3ZjKiHw9Wo()ZvQE^!+cRVZGb?4`IX4h~TD;8nwE)m=xf?MIaM zpo$Uw6zdICTuVYaj!Po^o#~PaO)nRT>QXA;v-9hM zBCpb%&5YTINtg5?y+r;ra^w~Ey3m`03qU5Ns#q8&?qG=7+ex8W_Q!$kaX;Ki>L!nB zb;~F0O`s)Hz(=VXkCL9emu3sr{p)(W#Kr%+b@cDxcwjR;HQYoX^2<u>ZbRbNAZ`82`!Sv2UI(&IAL!osDWYNV>?<{Iq&7Z#vQbrIiaa>!cn9~5 zXVq;D`i2bhKLiF6%Z9Iqcj_=z%y(yUVt)<)(178-gnHoG87(sz1xu2yI(^S5LS#iT za{_(;=IFqEE^b1H(joAjOW{fh1dSrk4{C>@drjg&bQtUKni97^RMUbi|uK_sXUYD~>EwO2-zq=G!wo3eE#=XhA9W zybLQdsvm)BbQeU`{K)q>wB97DjevR~M2A9ZL<*8`NQyaHc3C4R0z9FR(WE5Y6tZGq z8enhVRE8uPylddP>v2&=nadN>LLnY455i-}TJy|E%5X;ILF$h$+->^AT4ejZqI6NF zlVT2=61zb4;7rq;3`t~D5Hd*oGnMk}NKR+e9{i=s?a&Nx`JmBJdUJwNWW{_{l!R5U z9KmU2-I-8C7C^V>4(P0*eWPMqP3J?K@Kb({1%)ANNp1_BH%mOIcB0Ht=%&GbN#@Ka zBA^lXgy6L1>4PpC$KvLJegE^l1?tYBC~P-h>F$hPf+!^pLTejj15VdyEG*23Vd1kl z!CL~^nsjv%q&cl9FU)8URE$f1h$zk~zp(1;7aswO*`QeL3SvjFR6nci6G}v{eLO*% zAegMUEovGQGdd6QM+Zn-BpXvc6q;=szFv6A53{}j!-(65(0r<3T0HB8`6vdt1i=1< zoAx<8gV#h+6^cZ0pxubL5KqN;gR{E)+%rxD=d`NZWrxA&IBmB4T(LE5qgJ4J-vOnt zo({GvrHS!R|8^}pAkhGW#&anK!8svzgKQLZn4UTbJ28x#CQBuOsXb0boD83_l$D%r zGr7EV)dp3&ZT9@AnNRJILpY<0RKfP|+y;g+HssrIOt`*&K0QnERZQlxeM49^lB%82 zrk}9rZ9emeBeCvU3T9+cx-ALWZ-NyzoQb~K;{d&qU%be_FuHus--^SMBeJ@yu4CyLt&RF8CQq))2ioc^CET%Jc zW5Pmu*=FRoi!?0n6+|zP$lPY4i;|(jHfc}Vyyt?jE;vOtuLD1y9py^ kP%7_D35a&3VDK+O92Th5;A-*f|9${nT3lYNO2p9re|yai(EtDd