From 9260bf4894e471049fbe7e29d5935404e0ef2248 Mon Sep 17 00:00:00 2001 From: Unique One Date: Sun, 8 Sep 2024 04:02:35 +1000 Subject: [PATCH] * Changed windows notifications to SAPI text to speech sound notifications, as windows popups are pretty useless inside VR. * Added a basic application icon and required resource settings. * Added overlay icon showing HMD battery status at all times. * Added icon files for the above. * Disabled the sockets code (commented out) as it doesn't seem to work and denies connections. --- .../OpenVR Display Devices.rc | Bin 0 -> 4304 bytes .../OpenVR Display Devices.vcxproj | 22 +++ .../OpenVR Display Devices.vcxproj.filters | 17 ++ .../OpenVR-Display-Devices.cpp | 150 ++++++++++++++++-- OpenVR Display Devices/battery_checker.h | 44 +++-- OpenVR Display Devices/config.h | 2 + OpenVR Display Devices/configuration.cpp | 10 +- OpenVR Display Devices/configuration.h | 2 +- OpenVR Display Devices/icon1.ico | Bin 0 -> 45451 bytes OpenVR Display Devices/notifications.cpp | 74 +++++++-- OpenVR Display Devices/notifications.h | 12 +- OpenVR Display Devices/packages.config | 5 + OpenVR Display Devices/resource.h | 16 ++ OpenVR Display Devices/user_interface.cpp | 30 ++-- icon.ico | Bin 0 -> 115476 bytes icons/100.png | Bin 0 -> 5662 bytes icons/20.png | Bin 0 -> 3896 bytes icons/40.png | Bin 0 -> 4444 bytes icons/60.png | Bin 0 -> 4805 bytes icons/80.png | Bin 0 -> 5207 bytes icons/c100.png | Bin 0 -> 7346 bytes icons/c20.png | Bin 0 -> 5701 bytes icons/c40.png | Bin 0 -> 6213 bytes icons/c60.png | Bin 0 -> 6314 bytes icons/c80.png | Bin 0 -> 6675 bytes 25 files changed, 313 insertions(+), 71 deletions(-) create mode 100644 OpenVR Display Devices/OpenVR Display Devices.rc create mode 100644 OpenVR Display Devices/icon1.ico create mode 100644 OpenVR Display Devices/packages.config create mode 100644 OpenVR Display Devices/resource.h create mode 100644 icon.ico create mode 100644 icons/100.png create mode 100644 icons/20.png create mode 100644 icons/40.png create mode 100644 icons/60.png create mode 100644 icons/80.png create mode 100644 icons/c100.png create mode 100644 icons/c20.png create mode 100644 icons/c40.png create mode 100644 icons/c60.png create mode 100644 icons/c80.png diff --git a/OpenVR Display Devices/OpenVR Display Devices.rc b/OpenVR Display Devices/OpenVR Display Devices.rc new file mode 100644 index 0000000000000000000000000000000000000000..87fdcef48991a15f877a4934c4e467dde1c62767 GIT binary patch literal 4304 zcmds)+invv5QgU(iFa_)8!DjXaK~Mfl(0&AP}5c*MT)AXDUotgHUU-Q*@5r3W4diN zZ3!T4k+o}kcE+9=&-|YK@qOF2&Doyy?cAm|wv?x5GiayKQk&bE4VYE!InCLnUD$|c z3VlZ3g*K&^+?>%lW5-OZ^=$&rmOZs6?6U3q4X7i&4&d&3-tv}zU>!TMU8pt2`_{BiP+GkAtOBLUIPNbUir1ocv3FL-FSmW%!%Jfu zV*d>9$PdR@{gHQq)m7}2KX#$N;kkVx_n*O6@82MI)BnZuSkx#)#~fcNl6u&^UTj3q z$90RU)2cZsb;%6?g1CQ5ABk zMgE+ST~&7O5M520*8N6vDpeci`tqy)Y?YbWID2YbQV zE%+)>g3N7>4qro7hX{}@t0O@9af&4kcC9@+EXdFD7!&ICyvAqwoX&r*V0+yog}B|K zO+*Lmzt(brETojb8|09%bJfgF^ zKEs6iatw|{N;du+C>Xvvk3p)Y9CzxNnW|V-z6q%3?2E5_=f2jOz;T9LsCQM1P8Ym0 zB%Q|x)yk@$9GnxH?&))XANRdB&d;-Yg*t5rk80u+$)H)vT$-o~ls=Ntssoy8>#N1r zA$_Rq_P8m9JPCKTs^ExHtNMrXMfozf$2+jOZ6($|#Lh95i2ebFG--bcz4VLYlnNlu z5AcO75$z?Om2JVFSAKqhr{yVmUpr_li?puaVOF~@{wb!k8SBrdi@npXh!^-vV ziicuTv9LF*P0ZBTt9IxS3;%0%_h)~4s(true ..\3rdparty\WinToast\include;..\3rdparty\simpleini;..\3rdparty\imgui\backends;..\3rdparty\imgui;..\3rdparty\openvr\headers;..\3rdparty\gl3w\include;..\3rdparty\glfw\include;..\3rdparty\PlatformFolders\sago;%(AdditionalIncludeDirectories) stdcpp20 + true + Speed + true Windows @@ -143,6 +146,7 @@ true ..\3rdparty\glfw\lib-vc2022;..\3rdparty\openvr\lib\win64;%(AdditionalLibraryDirectories) opengl32.lib;glfw3.lib;openvr_api.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + UseLinkTimeCodeGeneration @@ -169,6 +173,7 @@ + @@ -184,9 +189,26 @@ + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/OpenVR Display Devices/OpenVR Display Devices.vcxproj.filters b/OpenVR Display Devices/OpenVR Display Devices.vcxproj.filters index 1d90520..0faab5f 100644 --- a/OpenVR Display Devices/OpenVR Display Devices.vcxproj.filters +++ b/OpenVR Display Devices/OpenVR Display Devices.vcxproj.filters @@ -101,6 +101,9 @@ Fichiers d%27en-tête + + Fichiers d%27en-tête + @@ -115,5 +118,19 @@ + + + + + Fichiers de ressources + + + + + Fichiers de ressources + + + Fichiers de ressources + \ No newline at end of file diff --git a/OpenVR Display Devices/OpenVR-Display-Devices.cpp b/OpenVR Display Devices/OpenVR-Display-Devices.cpp index 580953c..128f0aa 100644 --- a/OpenVR Display Devices/OpenVR-Display-Devices.cpp +++ b/OpenVR Display Devices/OpenVR-Display-Devices.cpp @@ -32,8 +32,10 @@ double lastFrameStartTime = glfwGetTime(); #pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") -extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; -extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001; +//extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; +//extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001; + +//extern void ActivateMultipleDrivers(); void CreateConsole() { static bool created = false; @@ -66,6 +68,8 @@ void InitVR() { } else if (!vr::VR_IsInterfaceVersionValid(vr::IVROverlay_Version)) { throw std::runtime_error("OpenVR error: Outdated IVROverlay_Version"); } + + //ActivateMultipleDrivers(); } void CreateGLFWWindow() { @@ -77,7 +81,7 @@ void CreateGLFWWindow() { fboTextureWidth = 1600; fboTextureHeight = 800; - glfwWindow = glfwCreateWindow(fboTextureWidth, fboTextureHeight, "OpenVR-Display-Devices", NULL, NULL); + glfwWindow = glfwCreateWindow(fboTextureWidth, fboTextureHeight, OPENVR_APPLICATION_NAME/*"OpenVR-Display-Devices"*/, NULL, NULL); if (!glfwWindow) { throw std::runtime_error("Failed to create window"); } @@ -87,9 +91,9 @@ void CreateGLFWWindow() { gl3wInit(); // Minimize the window on start if enabled -#ifndef _DEBUG - glfwIconifyWindow(glfwWindow); -#endif +//#ifndef _DEBUG + //glfwIconifyWindow(glfwWindow); +//#endif ImGui::CreateContext(); ImGuiIO &io = ImGui::GetIO(); @@ -121,6 +125,75 @@ void CreateGLFWWindow() { } } +extern BatteryChecker batteryChecker; +std::string overlayThumbnailCurrent = ""; + +void UpdateOverlayIcon() { + if (!vr::VROverlay() || !overlayThumbnailHandle) + { + return; + } + + std::string iconPath = cwd; + + if (batteryChecker.hmdCharging) + { + if (batteryChecker.hmdCharge > 80) + { + iconPath += "\\icons\\c100.png"; + } + else if (batteryChecker.hmdCharge > 60) + { + iconPath += "\\icons\\c80.png"; + } + else if (batteryChecker.hmdCharge > 40) + { + iconPath += "\\icons\\c60.png"; + } + else if (batteryChecker.hmdCharge > 20) + { + iconPath += "\\icons\\c40.png"; + } + else + { + iconPath += "\\icons\\c20.png"; + } + } + else + { + if (batteryChecker.hmdCharge > 80) + { + iconPath += "\\icons\\100.png"; + } + else if (batteryChecker.hmdCharge > 60) + { + iconPath += "\\icons\\80.png"; + } + else if (batteryChecker.hmdCharge > 40) + { + iconPath += "\\icons\\60.png"; + } + else if (batteryChecker.hmdCharge > 20) + { + iconPath += "\\icons\\40.png"; + } + else + { + iconPath += "\\icons\\20.png"; + } + } + + if (overlayThumbnailCurrent == iconPath.c_str()) + {// Unchanged... + return; + } + + //printf("icon : %s\n", iconPath.c_str()); + vr::VROverlay()->ClearOverlayTexture(overlayThumbnailHandle); + vr::VROverlay()->SetOverlayFromFile(overlayThumbnailHandle, iconPath.c_str()); + overlayThumbnailCurrent = iconPath.c_str(); +} + void TryCreateVROverlay() { if (overlayMainHandle || !vr::VROverlay()) { return; @@ -139,10 +212,35 @@ void TryCreateVROverlay() { vr::VROverlay()->SetOverlayWidthInMeters(overlayMainHandle, 3.0f); vr::VROverlay()->SetOverlayInputMethod(overlayMainHandle, vr::VROverlayInputMethod_Mouse); vr::VROverlay()->SetOverlayFlag(overlayMainHandle, vr::VROverlayFlags_SendVRDiscreteScrollEvents, true); - - // can set icon here but idc lol + UpdateOverlayIcon(); } +/*void ActivateMultipleDrivers() { + vr::EVRSettingsError vrSettingsError; + bool enabled = vr::VRSettings()->GetBool(vr::k_pch_SteamVR_Section, vr::k_pch_SteamVR_ActivateMultipleDrivers_Bool, &vrSettingsError); + + if (vrSettingsError != vr::VRSettingsError_None) { + std::string err = "Could not read \"" + std::string(vr::k_pch_SteamVR_ActivateMultipleDrivers_Bool) + "\" setting: " + + vr::VRSettings()->GetSettingsErrorNameFromEnum(vrSettingsError); + + throw std::runtime_error(err); + } + + if (!enabled) { + vr::VRSettings()->SetBool(vr::k_pch_SteamVR_Section, vr::k_pch_SteamVR_ActivateMultipleDrivers_Bool, true, &vrSettingsError); + if (vrSettingsError != vr::VRSettingsError_None) { + std::string err = "Could not set \"" + std::string(vr::k_pch_SteamVR_ActivateMultipleDrivers_Bool) + "\" setting: " + + vr::VRSettings()->GetSettingsErrorNameFromEnum(vrSettingsError); + + throw std::runtime_error(err); + } + + std::cerr << "Enabled \"" << vr::k_pch_SteamVR_ActivateMultipleDrivers_Bool << "\" setting" << std::endl; + } else { + std::cerr << "\"" << vr::k_pch_SteamVR_ActivateMultipleDrivers_Bool << "\" setting previously enabled" << std::endl; + } +}*/ + void RunLoop() { while (!glfwWindowShouldClose(glfwWindow)) { TryCreateVROverlay(); @@ -154,7 +252,7 @@ void RunLoop() { if (overlayMainHandle && vr::VROverlay()) { auto &io = ImGui::GetIO(); - dashboardVisible = vr::VROverlay()->IsActiveDashboardOverlay(overlayMainHandle); + dashboardVisible = vr::VROverlay()->IsActiveDashboardOverlay(overlayMainHandle) || vr::VROverlay()->IsDashboardVisible(); vr::VREvent_t vrEvent; while (vr::VROverlay()->PollNextOverlayEvent(overlayMainHandle, &vrEvent, sizeof(vrEvent))) { @@ -180,7 +278,8 @@ void RunLoop() { } } - if (windowVisible || dashboardVisible) { + //if (windowVisible || dashboardVisible) + { auto &io = ImGui::GetIO(); io.DisplaySize = ImVec2((float)fboTextureWidth, (float)fboTextureHeight); io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f); @@ -189,6 +288,7 @@ void RunLoop() { if (dashboardVisible) { io.ConfigFlags = io.ConfigFlags | ImGuiConfigFlags_NoMouseCursorChange; } + ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); @@ -215,21 +315,39 @@ void RunLoop() { if (dashboardVisible) { vr::Texture_t vrTex; vrTex.eType = vr::TextureType_OpenGL; - vrTex.eColorSpace = vr::ColorSpace_Auto; + //vrTex.eColorSpace = vr::ColorSpace_Auto; + vrTex.eColorSpace = vr::ColorSpace_Linear; vrTex.handle = (void *) #if defined _WIN64 || defined _LP64 (uint64_t) #endif fboTextureHandle; + - vr::HmdVector2_t mouseScale = { (float)fboTextureWidth, (float)fboTextureHeight }; + //vrTex.handle = reinterpret_cast(static_cast(fboTextureHandle)); + vr::VROverlay()->ClearOverlayTexture(overlayMainHandle); vr::VROverlay()->SetOverlayTexture(overlayMainHandle, &vrTex); + //vr::VROverlay()->SetOverlayAlpha(overlayMainHandle, 1.0f); + + //vr::VROverlay()->ClearOverlayTexture(overlayMainHandle); + //vr::VROverlay()->SetOverlayFromFile(overlayMainHandle, overlayThumbnailCurrent.c_str()); + + /*vr::Texture_t texture = {(void *)(uintptr_t)&fboTextureHandle, vr::TextureType_OpenGL, vr::ColorSpace_Auto}; + vr::VROverlay()->SetOverlayTexture(overlayMainHandle, &texture);*/ + + vr::HmdVector2_t mouseScale = { (float)fboTextureWidth, (float)fboTextureHeight }; vr::VROverlay()->SetOverlayMouseScale(overlayMainHandle, &mouseScale); + + //printf("Overlay set to texture %I64u. Resolution %i x %i.\n", (uint64_t)vrTex.handle, fboTextureWidth, fboTextureHeight); } } + if (vr::VROverlay()->IsDashboardVisible()) { + UpdateOverlayIcon(); + } + const double dashboardInterval = 1.0 / 90.0; // fps double waitEventsTimeout = std::max(UPDATE_INTERVAL, dashboardInterval); @@ -341,8 +459,8 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance // Load config then do post-config setup if needed loadOrInitConfiguration(application_configuration); - if (application_configuration.notificationsWindows) { - enableWindowsNotifications(); + if (application_configuration.notificationsSound) { + enableSoundNotifications(); } if (application_configuration.notificationsXsOverlay) { enableXsOverlayNotifications(); @@ -353,8 +471,8 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance } RunLoop(); - if (application_configuration.notificationsWindows) { - disableWindowsNotifications(); + if (application_configuration.notificationsSound) { + disableSoundNotifications(); } if (application_configuration.notificationsXsOverlay) { disableXsOverlayNotifications(); diff --git a/OpenVR Display Devices/battery_checker.h b/OpenVR Display Devices/battery_checker.h index 925a218..0d01b8b 100644 --- a/OpenVR Display Devices/battery_checker.h +++ b/OpenVR Display Devices/battery_checker.h @@ -8,11 +8,11 @@ #include // Should be plenty sufficient... -#define BATCHECK_MAX_INDEXES 20 +#define BATCHECK_MAX_INDEXES 50 // Every five minutes -#define BATCHECK_CHECK_EVERY 5 * 60 -// Every 10s -#define BATCHECK_CHECK_CHG_EVERY 10 +#define BATCHECK_CHECK_EVERY 10 //5 * 60 +// Every 10s - uq: 5 secs +#define BATCHECK_CHECK_CHG_EVERY 5 class BatteryChecker { private: @@ -38,34 +38,34 @@ class BatteryChecker { } void dispatchLowNotification(int index) { - std::string title = "Low tracker battery !"; - std::string content = std::format("Tracker {} is low on battery: {}%", gaugesNames[index], gauges[index]).c_str(); + std::string title = "Low battery!"; + std::string content = std::format("Device {} is low on battery: {}%", gaugesNames[index], gauges[index]).c_str(); - std::cout << "LOW battery for tracker '" << gaugesNames[index] << "' id " << index << " level: " << gauges[index] << std::endl; + std::cout << "LOW battery for device '" << gaugesNames[index] << "' id " << index << " level: " << gauges[index] << std::endl; sendNotification(title, content); } void dispatchWarnNotification(int index) { - std::string title = "Tracker battery warning !"; - std::string content = std::format("Tracker {} battery warning: {}%", gaugesNames[index], gauges[index]).c_str(); + std::string title = "Battery warning!"; + std::string content = std::format("Device {} battery warning: {}%", gaugesNames[index], gauges[index]).c_str(); - std::cout << "WARN battery for tracker '" << gaugesNames[index] << "' id " << index << " level: " << gauges[index] << std::endl; + std::cout << "WARN battery for device '" << gaugesNames[index] << "' id " << index << " level: " << gauges[index] << std::endl; sendNotification(title, content); } void dispatchSlowChargeNotification(int index) { - std::string title = "Slow charge tracker battery !"; - std::string content = std::format("Tracker {} charging too slowly ! {}%", gaugesNames[index], gauges[index]).c_str(); + std::string title = "Slow charge battery!"; + std::string content = std::format("Device {} is charging too slowly ! {}%", gaugesNames[index], gauges[index]).c_str(); - std::cout << "WARN charging too slow for tracker '" << gaugesNames[index] << "' id " << index << " level: " << gauges[index] << std::endl; + std::cout << "WARN charging too slow for device '" << gaugesNames[index] << "' id " << index << " level: " << gauges[index] << std::endl; sendNotification(title, content); } void dispatchChargeWarn(int index) { std::string title, content; if (gaugesCharging[index]) { - title = "HMD is now charging"; - content = std::format("HMD is now charging"); + title = "Headset is now charging"; + content = std::format(""); } else { - title = "HMD not charging !"; - content = std::format("WOOP WOOP PLS CHECK CABLE"); + title = "Headset is not charging!"; + content = std::format("Check the headset battery."); } std::cout << "HMD Charge changed from " << gaugesChargingPrev[index] << " to " << gaugesCharging[index] << std::endl; @@ -85,6 +85,9 @@ class BatteryChecker { ~BatteryChecker() { }; + bool hmdCharging = false; + int hmdCharge = 0; + void updateGauge(int index, int value, std::string role, bool charging) { // Set previous value with current value gaugesPrev[index] = gauges[index]; @@ -153,6 +156,13 @@ class BatteryChecker { } } + if (isHmd) + {// Update global-accessable value so we can update the icon for charing and charge level... + hmdCharging = gaugesCharging[index]; + hmdCharge = gauges[index]; + } + + // Do nothing as we still haven't waited enough } }; diff --git a/OpenVR Display Devices/config.h b/OpenVR Display Devices/config.h index 09fbbb5..94958d5 100644 --- a/OpenVR Display Devices/config.h +++ b/OpenVR Display Devices/config.h @@ -1,7 +1,9 @@ #pragma once // lol +#ifndef UNICODE #define UNICODE +#endif // To avoid windows.h to redefine min() and max() #define NOMINMAX diff --git a/OpenVR Display Devices/configuration.cpp b/OpenVR Display Devices/configuration.cpp index 0e96487..9fd4677 100644 --- a/OpenVR Display Devices/configuration.cpp +++ b/OpenVR Display Devices/configuration.cpp @@ -41,9 +41,9 @@ void loadOrInitConfiguration(AppConfig &app_cfg) { // Then set the struct from config app_cfg.alertLowBattery = cfgIni.GetBoolValue("battery_alert", "alert_low_on_battery", false, nullptr); app_cfg.alertHmdCycling = cfgIni.GetBoolValue("battery_alert", "alert_hmd_cycling", false, nullptr); - app_cfg.batteryWarn = cfgIni.GetDoubleValue("battery_alert", "battery_warn", 50, nullptr); - app_cfg.batteryLow = cfgIni.GetDoubleValue("battery_alert", "battery_low", 20, nullptr); - app_cfg.notificationsWindows = cfgIni.GetBoolValue("notifications", "notifications_windows", false, nullptr); + app_cfg.batteryWarn = (float)cfgIni.GetDoubleValue("battery_alert", "battery_warn", 50, nullptr); + app_cfg.batteryLow = (float)cfgIni.GetDoubleValue("battery_alert", "battery_low", 20, nullptr); + app_cfg.notificationsSound = cfgIni.GetBoolValue("notifications", "notifications_windows", false, nullptr); app_cfg.notificationsXsOverlay = cfgIni.GetBoolValue("notifications", "notifications_xsoverlay", false, nullptr); // Then set the config to the loaded state @@ -71,8 +71,8 @@ void saveConfiguration(AppConfig &cfg) { if (cfgIni.SetDoubleValue("battery_alert", "battery_low", cfg.batteryLow) < 0) { throw std::runtime_error("Cannot save batteryLow to config"); } - if (cfgIni.SetBoolValue("notifications", "notifications_windows", cfg.notificationsWindows) < 0) { - throw std::runtime_error("Cannot save notificationsWindows to config"); + if (cfgIni.SetBoolValue("notifications", "notifications_windows", cfg.notificationsSound) < 0) { + throw std::runtime_error("Cannot save notificationsSound to config"); } if (cfgIni.SetBoolValue("notifications", "notifications_xsoverlay", cfg.notificationsXsOverlay) < 0) { throw std::runtime_error("Cannot save notificationsXsOverlay to config"); diff --git a/OpenVR Display Devices/configuration.h b/OpenVR Display Devices/configuration.h index 86bff59..1364b52 100644 --- a/OpenVR Display Devices/configuration.h +++ b/OpenVR Display Devices/configuration.h @@ -20,7 +20,7 @@ struct AppConfig { bool alertHmdCycling = false; // Config section notifications - bool notificationsWindows = false; // not implemented yet + bool notificationsSound = false; // not implemented yet bool notificationsXsOverlay = false; }; diff --git a/OpenVR Display Devices/icon1.ico b/OpenVR Display Devices/icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..5d06b9f2857b39f0b5d3395e3e7999ba6bcc3a38 GIT binary patch literal 45451 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 literal 0 HcmV?d00001 diff --git a/OpenVR Display Devices/notifications.cpp b/OpenVR Display Devices/notifications.cpp index 1eb6b4b..243e5d3 100644 --- a/OpenVR Display Devices/notifications.cpp +++ b/OpenVR Display Devices/notifications.cpp @@ -1,8 +1,9 @@ #include "notifications.h" +#include -Webchaussette wsClient(XSOVERLAY_WS_HOST, XSOVERLAY_WS_PORT, XSOVERLAY_WS_QUERY); +//Webchaussette wsClient(XSOVERLAY_WS_HOST, XSOVERLAY_WS_PORT, XSOVERLAY_WS_QUERY); -void enableWindowsNotifications() { +void enableSoundNotifications() { if (!WinToastLib::WinToast::isCompatible()) { throw std::runtime_error("System incompatible :("); } @@ -13,24 +14,25 @@ void enableWindowsNotifications() { throw std::runtime_error("Woops, error when initializing the WinToaster"); } - std::string title = "Test notification"; + /*std::string title = "Test notification"; std::string content = "nya~ :3"; - sendNativeNotification(title, content); - std::cout << "Enabled toaster notifications" << std::endl; + sendSoundNotifications(title, content); + std::cout << "Enabled toaster notifications" << std::endl;*/ } -void disableWindowsNotifications() { +void disableSoundNotifications() { // Nothing to do here } void enableXsOverlayNotifications() { - wsClient.Start(); + /*wsClient.Start(); std::string title = "Test notification"; std::string content = "nya~ :3"; sendXsOverlayNotification(title, content); std::cout << "Enabled XSOverlay notifications" << std::endl; + */ } std::string buildXsOverlayJson(std::string title, std::string content) { @@ -58,15 +60,28 @@ std::string buildXsOverlayJson(std::string title, std::string content) { } void disableXsOverlayNotifications() { - wsClient.Stop(); + //wsClient.Stop(); } std::wstring charToWstring(const char *src) { return std::wstring(src, src + strlen(src)); } -void sendNativeNotification(std::string &title, std::string &msg) { - WinToastLib::WinToastTemplate::AudioOption audioOptions = WinToastLib::WinToastTemplate::AudioOption::Default; +wchar_t *CharToWchar(const char *str) { + int lenW, lenA = lstrlenA(str); + wchar_t *unicodestr; + + lenW = MultiByteToWideChar(CP_ACP, 0, str, lenA, NULL, 0); + if (lenW > 0) { + unicodestr = SysAllocStringLen(0, lenW); + MultiByteToWideChar(CP_ACP, 0, str, lenA, unicodestr, lenW); + return unicodestr; + } + return NULL; +} + +void sendSoundNotifications(std::string &title, std::string &msg) { + /*WinToastLib::WinToastTemplate::AudioOption audioOptions = WinToastLib::WinToastTemplate::AudioOption::Default; WinToastLib::WinToastTemplate templ(WinToastLib::WinToastTemplate::Text02); // Title @@ -77,18 +92,51 @@ void sendNativeNotification(std::string &title, std::string &msg) { // templ.setExpiration(5); if (WinToastLib::WinToast::instance()->showToast(templ, new CustomHandler()) < 0) { throw std::runtime_error("Woops, cannot toast :("); + }*/ + + ISpVoice *pVoice = NULL; + + /*if (FAILED(::CoInitialize(NULL))) { + std::cout << "SAPI failed to initialize." << std::endl; + return; + }*/ + + //std::string speakText = title + "\n\n" + msg; + std::string speakText = title; + + HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); + if (SUCCEEDED(hr)) { + //hr = pVoice->Speak(L"Hello world", 0, NULL); + //hr = pVoice->Speak(speakText.c_str(), 0, NULL); + + /*wchar_t *wtext; + wtext = malloc(speakText.length() * sizeof(wchar_t)); + mbstowcs(wtext, speakText.c_str(), speakText.length());//includes null + LPWSTR ptr = wtext; + hr = pVoice->Speak(ptr, 0, NULL); + free(wtext); + */ + wchar_t *text = CharToWchar(speakText.c_str()); + hr = pVoice->Speak(text, 0, NULL); + + pVoice->Release(); + pVoice = NULL; + } + else + { + std::cout << "SAPI failed to create instance." << std::endl; } } void sendXsOverlayNotification(std::string &title, std::string &msg) { std::string jmsg = buildXsOverlayJson(title, msg); - wsClient.Send(jmsg); + //wsClient.Send(jmsg); } void sendNotification(std::string &title, std::string &msg) { - if (application_configuration.notificationsWindows) { + if (application_configuration.notificationsSound) { std::cout << "SN: " << title << std::endl; - sendNativeNotification(title, msg); + sendSoundNotifications(title, msg); } if (application_configuration.notificationsXsOverlay) { sendXsOverlayNotification(title, msg); diff --git a/OpenVR Display Devices/notifications.h b/OpenVR Display Devices/notifications.h index d5009d9..db56ccd 100644 --- a/OpenVR Display Devices/notifications.h +++ b/OpenVR Display Devices/notifications.h @@ -9,9 +9,13 @@ #include #include -#define XSOVERLAY_WS "ws://localhost:42070/?client=OVRDisplayDevices" +/*#define XSOVERLAY_WS "ws://localhost:42070/?client=OVRDisplayDevices" #define XSOVERLAY_WS_HOST "localhost" #define XSOVERLAY_WS_PORT 42070 +#define XSOVERLAY_WS_QUERY "?client=OVRDisplayDevices"*/ +#define XSOVERLAY_WS "ws://localhost:12070/?client=OVRDisplayDevices" +#define XSOVERLAY_WS_HOST "localhost" +#define XSOVERLAY_WS_PORT 12070 #define XSOVERLAY_WS_QUERY "?client=OVRDisplayDevices" #include @@ -48,11 +52,11 @@ class CustomHandler : public WinToastLib::IWinToastHandler { } }; -void enableWindowsNotifications(); -void disableWindowsNotifications(); +void enableSoundNotifications(); +void disableSoundNotifications(); void enableXsOverlayNotifications(); void disableXsOverlayNotifications(); void sendNotification(std::string &title, std::string &msg); void sendXsOverlayNotification(std::string &title, std::string &msg); -void sendNativeNotification(std::string &title, std::string &msg); +void sendSoundNotifications(std::string &title, std::string &msg); std::string buildXsOverlayJson(std::string title, std::string content); diff --git a/OpenVR Display Devices/packages.config b/OpenVR Display Devices/packages.config new file mode 100644 index 0000000..7be85a0 --- /dev/null +++ b/OpenVR Display Devices/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OpenVR Display Devices/resource.h b/OpenVR Display Devices/resource.h new file mode 100644 index 0000000..cc1499e --- /dev/null +++ b/OpenVR Display Devices/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by OpenVR Display Devices.rc +// +#define IDI_ICON1 102 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/OpenVR Display Devices/user_interface.cpp b/OpenVR Display Devices/user_interface.cpp index f40fb67..157242b 100644 --- a/OpenVR Display Devices/user_interface.cpp +++ b/OpenVR Display Devices/user_interface.cpp @@ -4,9 +4,9 @@ static bool runningInOverlay; static const ImGuiWindowFlags bareWindowFlags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | -ImGuiWindowFlags_NoMove | +ImGuiWindowFlags_NoMove /* | ImGuiWindowFlags_NoScrollbar | -ImGuiWindowFlags_NoScrollWithMouse | +ImGuiWindowFlags_NoScrollWithMouse*/ | ImGuiWindowFlags_NoCollapse; BatteryChecker batteryChecker; @@ -112,7 +112,7 @@ void Show_StatusTable() { if (pError != vr::TrackedProp_Success && pError != vr::TrackedProp_UnknownProperty) { wchar_t message[1024]; - swprintf(message, 1024, L"Could not get Prop_ControllerType of device %i: %s", i, vr::VRSystem()->GetPropErrorNameFromEnum(pError)); + swprintf(message, 1024, L"Could not get Prop_ControllerType of device %i: %s", i, (wchar_t*)vr::VRSystem()->GetPropErrorNameFromEnum(pError)); MessageBox(nullptr, message, L"Runtime Error", 0); } @@ -121,7 +121,7 @@ void Show_StatusTable() { vr::VRSystem()->GetStringTrackedDeviceProperty(i, vr::Prop_SerialNumber_String, serialBuffer, vr::k_unMaxPropertyStringSize, &pError); if (pError != vr::TrackedProp_Success && pError != vr::TrackedProp_UnknownProperty) { wchar_t message[1024]; - swprintf(message, 1024, L"Could not get Prop_SerialNumber of device %i: %s", i, vr::VRSystem()->GetPropErrorNameFromEnum(pError)); + swprintf(message, 1024, L"Could not get Prop_SerialNumber of device %i: %s", i, (wchar_t *)vr::VRSystem()->GetPropErrorNameFromEnum(pError)); MessageBox(nullptr, message, L"Runtime Error", 0); } @@ -129,20 +129,20 @@ void Show_StatusTable() { float deviceBatteryPercent = vr::VRSystem()->GetFloatTrackedDeviceProperty(i, vr::Prop_DeviceBatteryPercentage_Float, &pError); if (pError != vr::TrackedProp_Success && pError != vr::TrackedProp_UnknownProperty) { wchar_t message[1024]; - swprintf(message, 1024, L"Could not get Prop_DeviceBatteryPercentage of device %i: %s", i, vr::VRSystem()->GetPropErrorNameFromEnum(pError)); + swprintf(message, 1024, L"Could not get Prop_DeviceBatteryPercentage of device %i: %s", i, (wchar_t *)vr::VRSystem()->GetPropErrorNameFromEnum(pError)); MessageBox(nullptr, message, L"Runtime Error", 0); } bool deviceIsCharging = vr::VRSystem()->GetBoolTrackedDeviceProperty(i, vr::Prop_DeviceIsCharging_Bool, &pError); if (pError != vr::TrackedProp_Success && pError != vr::TrackedProp_UnknownProperty) { wchar_t message[1024]; - swprintf(message, 1024, L"Could not get Prop_DeviceIsCharging of device %i: %s", i, vr::VRSystem()->GetPropErrorNameFromEnum(pError)); + swprintf(message, 1024, L"Could not get Prop_DeviceIsCharging of device %i: %s", i, (wchar_t *)vr::VRSystem()->GetPropErrorNameFromEnum(pError)); MessageBox(nullptr, message, L"Runtime Error", 0); } // Fill the state std::string role = roleBuffer; - batteryChecker.updateGauge(i, deviceBatteryPercent * 100, role, deviceIsCharging); + batteryChecker.updateGauge(i, (int)(deviceBatteryPercent * 100.0f), role, deviceIsCharging); // Then check the status batteryChecker.checkGaugeAndDispatchNotifications(i, (deviceClass == vr::TrackedDeviceClass_HMD)); @@ -151,21 +151,21 @@ void Show_StatusTable() { vr::VRSystem()->GetStringTrackedDeviceProperty(i, vr::Prop_ManufacturerName_String, manufacturerBuffer, vr::k_unMaxPropertyStringSize, &pError); if (pError != vr::TrackedProp_Success && pError != vr::TrackedProp_UnknownProperty) { wchar_t message[1024]; - swprintf(message, 1024, L"Could not get Prop_ManufacturerName of device %i: %s", i, vr::VRSystem()->GetPropErrorNameFromEnum(pError)); + swprintf(message, 1024, L"Could not get Prop_ManufacturerName of device %i: %s", i, (wchar_t *)vr::VRSystem()->GetPropErrorNameFromEnum(pError)); MessageBox(nullptr, message, L"Runtime Error", 0); } char modelNumberBuffer[vr::k_unMaxPropertyStringSize] = ""; vr::VRSystem()->GetStringTrackedDeviceProperty(i, vr::Prop_ModelNumber_String, modelNumberBuffer, vr::k_unMaxPropertyStringSize, &pError); if (pError != vr::TrackedProp_Success && pError != vr::TrackedProp_UnknownProperty) { wchar_t message[1024]; - swprintf(message, 1024, L"Could not get Prop_ModelNumber of device %i: %s", i, vr::VRSystem()->GetPropErrorNameFromEnum(pError)); + swprintf(message, 1024, L"Could not get Prop_ModelNumber of device %i: %s", i, (wchar_t *)vr::VRSystem()->GetPropErrorNameFromEnum(pError)); MessageBox(nullptr, message, L"Runtime Error", 0); } char trackingSystemBuffer[vr::k_unMaxPropertyStringSize] = ""; vr::VRSystem()->GetStringTrackedDeviceProperty(i, vr::Prop_TrackingSystemName_String, trackingSystemBuffer, vr::k_unMaxPropertyStringSize, &pError); if (pError != vr::TrackedProp_Success && pError != vr::TrackedProp_UnknownProperty) { wchar_t message[1024]; - swprintf(message, 1024, L"Could not get Prop_TrackingSystemName of device %i: %s", i, vr::VRSystem()->GetPropErrorNameFromEnum(pError)); + swprintf(message, 1024, L"Could not get Prop_TrackingSystemName of device %i: %s", i, (wchar_t *)vr::VRSystem()->GetPropErrorNameFromEnum(pError)); MessageBox(nullptr, message, L"Runtime Error", 0); } @@ -269,11 +269,11 @@ void Show_Settings() { } ImGui::NewLine(); - if (ImGui::Checkbox("Windows notifications", &application_configuration.notificationsWindows)) { - if (application_configuration.notificationsWindows) { - enableWindowsNotifications(); + if (ImGui::Checkbox("Sound notifications", &application_configuration.notificationsSound)) { + if (application_configuration.notificationsSound) { + enableSoundNotifications(); } else { - disableWindowsNotifications(); + disableSoundNotifications(); } saveConfiguration(application_configuration); } @@ -296,7 +296,7 @@ void Show_Settings() { ImGui::SameLine(0, 1 * ImGui::GetStyle().ItemSpacing.x + 100); if (ImGui::Button("Test notifications", ImVec2(0, 0))) { std::string title = "Test notification"; - std::string content = "nya nya nya~"; + std::string content = ""; sendNotification(title, content); } } diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b35f15ad6941796f52f8072a2169f672afd2f28d GIT binary patch literal 115476 zcmeEu2UJx{vi3fQoI$dHWXS@Ob4E#$lVr(~Ge|llL4pVZl9VJ!&N(AU5G05sL2}MW zj_2Rp_k1(|9cSj=d3R>b|F1b~HN8Xas_y!#tE;Q`1^^%cGI0Ha08~JZ2mn}s$1vD` zoin0B08CK;5EuXNb4dW;mW2Qu9RGEmOAi40Vc?Tg|9y@N0Eop902i#U`B@$}$l^;)#Pb1o=T#7<6HLc{ax)@!dseVICVi>Bq4d5+~L zGiozhR62YuT2fp*7084+L#+WjBjcFCBjlY6v-j?VA+Q@I+R_u!(s;G{GIY<(-V;HS zf)Q^};oj(`t58<@4ARX)8VKdOq>cA z6%iWnlPYisiuMo)fOjN(qX;T~&A9e8Lrt+{x!RZC@`6fIPJ}TEPo7W`6^R}|;Ws5u zO|%@r3n7a7sgsr^)k;sLB7Sp>~3!qesd~jy&cpa58apm*Y~Igow}0H zP2;r8d^Mc;eeGU>L=*SG7cFIRd$AK@C;oX0>_(KXlStFJ=;?~jnhs{)EqNYP1kcjs z=V3{7x89ZITe-k-pJ~NMplmuo!+jsLO)TMuilidjVOU$DS{&vdqVnA0VQR*g`iRx>Vb-c>wfD=mpPWQ#WT z4~C+WDI~l&;ndXbCLDs_)1-e<*EHieyl(OIbYa?RU@P&6-UKfgH3N{8-mE)+pqkG@ ztga+LXQdks;p*etGCLExyl1#;HCT>X4z>{b#q!EK)zHZM6?sG|*_l8yPHE)c+lfhk zbLVYyy}$(XLawv4>KFL_r#Smd;o}q05glAAjRE(NW0JMT(D5QD$h z(8tF-J8Vf<7{ciMUSs?&s)f|RcVAs;-vgPgS0@;mtu=A+Dg{TYfcecUmd>MD6hKZ} zEGxR;af#X}wFTQHQ7*8{Hj^zjsyaWlb44FCKro|0WZ$!36rPEXsW zo~Sgg?o;vz@#kIQi}QNOtfp5iBTf5UNv17v==ED!q!~bXj}%`IM-Kwfj{*zV9nR3u z+|-UV$JDu$(+OgNE1lC&$+&jMbKb8v{Bm9zSw>S;v7w%{(99So9s?>s$L!P9478RU zh+9Y3Am{Zhp>bzMC@7(HuNQ7#%%hQdpdtQTCc+&jf%8=o^0{mIo-HQ@BlHnzsZQeZ zBTOtmAdH;fdPzaaVCE)^xT{`hIK~+@LR48vIvq8&!sE9d|--a>Yg*} zjY`*y0IsKs_lQBiZnXZAW_@6uUD#24aEsX^7`ltz^$EDWd2Y#+ALJ5qWp5O@ZAfC! z^k#!Pmf$6GRtsjm$kKBaz_4~F#}p!3$Ry7rV6`S0F(L+-TGp&Qp)(N5di1H?68YO3 zXIVy=q*qP|u&5P@t3cfqa+-$0A`sU1{LaAP{rW4eLL0mRr+~2MEOB-*5ddbxZ6!k8 zlPi5=oE%|2s7Ab{M!A5tSH2l0ErB?-@E01$$v})~4ktx`?JT=g;i56GRx5&?{p}5B<-M5P~0p}D{rJ2yPo2j;`F;B24weAU&gA# zx1L>sD63&ieU(Eqj?#ExYu>9Lf5_ytoXwdT)-HRNc+v>5U^Us?yu<(K#p92)AKT=N zQ0uXlo`PKVDeFYzXlTw#RNRp;2*3Jks5g_kl6}O=0KU&n>*YXCG>U0VMUG}z`nXM8 zj|pAbMn(k6R$c7M1|iVkGF7|x#A*je64-T)?IROb=+HW(Mk5s%RUR# zB~zw(QJ!!N{vJC-XG=GXGq4nxiseyYcVpK2crcMgnpJ^fe9EFuqhJL1%kn?cry+pp zZMU3~04M^4wBa227qCg*$Tt_qm?|>GktOT=v{t9RNEv{>RKJU6c=(+|i~=#VgdVY^ zaPnv$=ADR6#(8VEfwf|Jw1r{q$n7^5>@>9;R(02pOo7f4AJT{RFtQA_m&EHG`Mcz= zxW02&x?Tp{vUupNSi$}`?#yiIcK|2PCtkwK(+h3Vupe$ai!%Zqi%#xMDu7?RB8HYT zM~O{t@h!s2sU?^Sux;gR5R1Ve&RP0oe~Pu^#4<3UjvO2;&rs|~U(g=;i*=l^ql3zO zH$|Bx%abiS>aHwoRo4#M-2)DC^j0@l9BN4f08Q0&gwTZN@}ol_v!LPjFN!4B zFu2MJs8j7@2}&TaehK z1VCpf^tDmn_L%-dtg$LdopO=cW6iLB4iCg` zRr*|8qJ1K~=@{bqoiU|Ju8d}u&-J8hte<4(o${G{TW^gi8aM#<-@Ypl2%Vsn9KH;W zOb1#|C<7CU^g%7N1q*Lhp$jG5sDt_h-)|Rdwy@kWmFU&FgNihppwN7L7p7!bz}avX zA~nbm#=3RPm%uBC5)Ho)3;OTpCnUUE#vUhHx2@y1N%)DId9}1SO*Y?S)H&{+E+8== z_x;Qksv`G>rDt85Ms8%vA{63tQ+z%0UW|_KC{WwA(z~uC8J^qT+=jTFaehR(km$aD zRB$-F(}QXgmMO< zG&wqSX7k?u^G$X;j_MHn?|k-pB`I2G6R*;)t|BCA=ovfXKshh@9>kAy3&g%9$9bWS z7XRpUlylGR6EPAvSzB0A#?=R#IxDns;6gJuFHf}CcRZX($Pg_EZD-m? z$Q*W*O{KXi;h{buG14@1+Udb@TjFfigR}8&jujJe2<|E-jUj1*;KX)PAy9QPi+@?_)DLl^{wWr->Z0rwVuJG_l=*)N};! z){UE=1vzmGPZ1`PYs512z(%LXD|aK)&$DqqK1Szww^lDDaPkOXP-pTST6lfq z=Jc1{Hi;|xH*=9~NfusA#%?;X}TUb>=LipmvRo720C;>&67BJOrY;cqqF9UP1H)r&dfj z;m2m{k12+x=NajR%&GPzjuQvysbpx=OFT^G)83n$?a)tl4=mEB&W?bb@B;5-nZ2*bxDS3MH-ruyWfp^N+aEHDmTU? z^L17lb=gp&iRBD0KyJb`}9fo-K-r8rBESUtR#9uoLiKLPyDTJO*A>~Dar$W+~SXv z`$V_zWlSL7MAsCwoPOWVPwkJy(XMo=^9Y)n070XEp+QleFBMCuqT6$ZjmlQ9zO~gu zp(AE$Gjy&LzNV7DAk(63JWg)018lZoVo!3Tsn3vUPn|nq_mh%Tw6Wq>o4@DfD!ps% z_{O^~W`ZcTX{VuSIEDP8u*xn1D%QmBh{VCocgE$Mc;Stv$T&apQuZWLe8^OV#)K(y$no}f3L`J zPdL^#-Mb(wb3Eu4EOl(!{gMm9%c?^ODri|jVwVGkJ_hY&Ca~MFy9kyaG)3#k?~;h> zkm8id-6@uq=Nlwuzw!cDP2bzt7OH8Y4eE>W$EsVN=I%KO5RQA6lXQKNO6K?W9dktyik$36MX`aY_&sf z5JNJxWY<}4Uur@V%6B?BW1=#2DLrMr6HvH5m^optJ9#$9)C;Ql^{ba!(6&0Pm&)T4 zW#(Q~y3e4hK$Oy_8N^Z&Bz|f_5o9?n33H^fWMr$M@EGMVG!m%sML+Xf1v9kGKyyW% zOD4y5WNNc+X4J6*7%tSC1EIhh&~k7-Ci5qLS*^XWd#EnOb8;MSG(@9P$!JT9)lb4- zW0K^>;tidxeA>f6CsfUP?22eW9j6cB=H>CnX;oHDhf74!rQgF38;J}h2)qOy;No(- zYPD(D9%v-+l5y17j^|+(UeWO{P?1wT7Wb9y-j;AUerMu(6p)SS=nWUx|59{l<+IRQ zuA`I@i^%g3Vy{=KgkX`A-fn~nQ|40?r5*vhI)^euBrZoNzTou92w`{sy$#j<$do`U zO#`c$Gg{RdO|%cOWfiv*sfg@#bj=6(5_u{Ffc}bSJQ0KOW@9jA(phVKi({Z~J76=N zFLXvy2_XNzOh zn1~83p;e-vS)TMAbPBg7&%+lU#vkXNt<%OyhCik%N5mFaGsl&gW?_e{2yYzFm~~g} z&SkaRAzSD)pzw0BjRz$)YSEi1yvN&kXRL3jyO}{6v*l3yH0J2-A}OqQa`K@_n#A1G zSVmZ9&c*}elb7AYb2aQ`>wCFLo~7(}o%)Sal5RoEWAA_8PvEpll+B6Y@+PbJt(6dU=qi$?4Y)v$WNTf*coIm|`3%3mStzHIrQ~h+cTL?POTqY+>X2jJlltUi zGv*=h&Kw3}V){eXAp&tzbr&w!#$~>;mYZUt0N*_{(3@Vx+}gZcD-T_U8A66S1n$KD@RkCKHC zxV^I6vA-jv6{T7EG2i{Wqg1X-?-R_U(|Vi^*F1!vD;{uqiAS%16Koi5 zAkjPVQD`k1LLQ2fxmV7o{tt4*VxGyFT@J4Z+}J6#9lC^8C-Ondk@&i=ypVSrDum2TPzX)Gtgbq;F)`^ zzy((8>%_z}BcF0}SAVhD#l_QTZkC4!VrwrdI7VhdUhfpMb$;5mcCfk3Od~wY2f*Py zAmMIPvZE+`qH{kSeUe-2-MP>T`}r_2bVk9zdHcMi2RP?5Q_mI2ip@T02KgzAzrTdPlL7U9IoQ%G#5R_8vRwHl*yK~vLp58$3 z$uF=}e$OvodVc0>wFx~5i+o~_mWs30dBxcI4fXBGe%ww^45s(j>DrO$n$MT;D^N8! z-;$lE%tQtYLjA7rai;D;f44!{W>Yt$E*Pm=j>_(KaJ=Aj< zp&>4ch*=@dLD9+$yo7v#;mlspXutRFU}(0hZE)--+t)H<+cMLAHA8{(-4lHlX0rfR}qBgthjN>O3HUEnDnmDVPdEHhj=m5 z9U+Fyj5-i~$2O#3VC-xvosj5csiXwg!LM!g(eOT7LdW7M@aC{?-9}lsEZf+~unpa~ zeKgvKsFj?O?ECE%esAAN8qO8sNO?oAVtTAy7f9olX;rAl&E>Ta!%cJa*_BEE7YHjQ z1{2H)XNXzJpraHL=&A#J6!DeNZ$%(6fiuQ(*4$3QNWoZjRr9>5FI2)xx1sz{(~L{v z^uu1o3J-A{YXt`eY{5np9j*der-N^yG8L)_sP`7gZmH2Bp4xa~pB{vK^ou@Lpn^~A zIl{-hw2#tMjFhO&=&kCv_C#tAb{B}3U#kf?AW=bx5yH;s4tPq6FPw(HzeYne$?=u3 zVSvGR^Xf@V7w3K0na$80la!(GqNbw5XweaR+&Fqr77k5{SR2lrPsf3c1g&#j27H7Q z-z*HvfbVQ+H`#FGc!C!uyX|-PK6Y6S*z~hBxEi9voc!=ECd3amj;c4t&Q+qtRgMaE zC(drdW=>QHsas`E^v*WLSX*`x(@48|l=;bg8z;*TYeEbdcGJnGD7{#CCU>+zj9L3qlxB8uPj(JM_v9;D8(;tRf9otl&TdNlK$&4)m$E2hJRE`n_@XgEikYp_*pUb-JblXK6Rh``%Numu%+id|CUWa3fNAI;wlUJm zkvgA&ho;A%T_1*|J<?Et!HC+TVAEIa!QG- z+zA=R0_HS6^tdCMxom79?qb8D0Ny}jS`ywHA9<(2wwO05p0&%g6wamgOY=TkQv^_O zF5d*&x@SIGx?B0;u$Y}Rw@0nZdWdlC#m2Ky(~U_v4$*huMh0L1_u`{9?+J0?K(;$FwRB;qJG20}cFiE97fJ z`4Usg8wa#)X+snueRu&H)kO;g%xvlE$4VZ(_+$rEV_$9qgBZKFUFblSJ{xw@tN>fk$$>ro05qa(5N;gB+7^Zy~&(5+_6{f!-%9&+!x~?=fP)x_lG1 zsgXxk%?I9JYyYhoor}a2$&Iq%DeHNkuyZE&+sK4xWX}<)F&WU!&K#@Z$PK z9$V~%`mCm8mZrP)n9rVwg|&$h<)Z8!BNZuJgj=y8`$>2EeNm#WneL<&Mz2u+#3&=g z`~d^w;Vb<>+t0Es`>Po5BQR$@zzd5Mf_muP;`LZCZTRy74c|Ki;urzPePaGbRm?u2 zQdgyJJ;6h#rsu{QLt~b|sYHz8-?9@Oe8a zzp2z%qzEbmH9I{xPz@?CS8c=up+3I?fQfG_X3_lvM?44>0=AQZ<`W!BHpd>Z2!!M~ zhLdLnwDymiA9)X6mU*nqTJK)Ge{!6Wvsb%uyQ-wt&!$-NIXVoccszHiKj)3&73|{7 z0DG!$PM{f(lcz$kf(tXiSu9535!2--F)al{YOe9V{;TSwlu-UJxRO+I1R9wya^o)9 zw$w7Of&pA8uA~GL70ZpvjFyy~5XDZIbzwLuGs| zc39&}A0N~-Y-6wD8+Q!teCoTZD@(v+lA~}QP~5afj5ofx((WtEB*RVQblAyG7>s+r z98oTzG%YO_!S*fwKJD_t&#K4A>dB6ExVn6~g%HKvNi??0 zx(+WIIf6Y;f*flTjwGmQJ2KL=`&Lwo=UEPt_Gw~ah2vJJeb}@!W>ImOlC1Zhi8e3gqqKf5kh0|o+#p`NqrDAny@vL0yNNC2H zg(I=8+^TF(fjW{m*xTwm*esAcoJ}%>RHPpkuK}lR&Hmb&NPFQrURZt-61b8os(3;9 zSPkpmTU8MWo>iWgW-q%oD7uQtkW^M=pxE;()Tp45f1Cw{RA8AB>n)`0bEQlBUQsSc z`<&Y*|8oOA^j1!l+m>XuH%<~p=E(hra_=l(Kvm>%qqg`)Jp>RDLU7mJHmx2YO)&yp z^3EB!EQ9T$p)MCp;ZPaE40s^x#EMBvp7<=bguP3NX%{ilto2)s$G%U~UdM`g3tgd7 zhjqH*9HPn64q2HQMQ}KV8cTlkR3colYHE0fV7&Vx%XWX+Nd^Zh_@qZ6*7hUiQfeCF ztQ9~h!P{5!eQi!KfHtK`nQHvy$IC0{<*5$^T)-J%i&6?{Wd;WBTdaq~&)73RPAS%5ojhQ2q(-Pv&4we=(F+TDI|bHfWY0(~!OOg{-y$B-fte}Uzdk~2K>Wf1OLk@K<;PZ5I;!w=V|gx+Y=-N%8@ z5zHk)127)EyW#CQU9=(0ma)HyreU}%195#qFi)kd?c&DykwLjdyfk9icBJ;3DaCZ> z^XtZ<%(_Xv-;`ue^*&!$cp;LkfJ+6Y90gM5P;T^CoMjNaU<~7qV-3Dx%=n6Obr8O1 z;vBOnCR^K9986C>8;M{WO&%T@FiB1#|EiM|p{87{&jQs=Qs#L{zd_@Z35*&3?`=>U zs{_V>h3{`8BE`q&otPe7N4BfW*=$}&N__^6_1LYCqA92xAu)`(tO5Bqz(0&Paup>O zHysGP2Rc-$GYVNx4L*`0aFNzp2kG+Gng=EECYl83X7FP>?tyR~<`I_&2(v3ZnQn9# zg6vGx)_{uC0x`Q3-(80}u|dvCPv0`7KRM!KQjHxR6i3TV)^zrMZ-*>o*VdnCOp5Q` z31u%}_i?0QCX1w8PE`{mLzjDy=a+ zA5%`7N`~NmJ(M|uJb+e$4qYHe^11Ix7-##_*Sse0u*RA2`@XwXgnbMsfUtHiB)=4y zeraxd_0-g;HZKoMgtK|-#jeI`)Xl|b_cI_2G*m@>m0zR)P&_wbs#uzI_f-jLv?qxi5sx%Of`@K#>3AGQ0;4O7KZX6 zshE2|yz1i3L zfS6#>15nTG0zBLD((N8nhSs#BJh995>E@lK;o#()`n55^W;lDw|93AX+f)JZwcMge1ZxS73VanYA0E zt4}vJQQ%hQG;-8@gF25ioqr+LGXO1#iduo6?)F@t6T0Dc#onqrzJUef=vtEm+F~uT zKrtk;UD3iA>#a#PCMLev!ilZ=qt}oUODAB0b3@jLFXXFsbu&V1bW^{5=2_>tW7^;& zp~Q&tP#&*|IkjFH=`q~}f*EAEBQ9`HTV97>s*Cg4E_vHBMx1!wAYPJ6$Vr@_mD`^0 zE2?j{+k3R%-OiKai=J}=;(iL=eyO|O>zg?i3~Z}RSYG2jI&~-}9YH-5PAa!ZiP@*3 zJLDJizcB88kYj$3NAbEx_nCCY?aVNxVu?-IO-4dITuEoq$ta~U3iR1w(Wxul8l-)% zsW*FBMyR_Kp?9;KFVmQBRMw+o3if3`x;5R*8A|;4^9SVZYsCrx)>vkYdr(QZ<-%;aW10Q*{9YxqQiPG>+p2ft8+ID$0DD*pDduL zkW!DGejdc7?c$bZ(4-YC6Kn|PlWu7zNbd}S=BhdyP40AJkN`J7o!#o>p5UAdJ)Bf6 z=-!wjaxVh3ip~g8cHb(0x>Q?e45{$RXVGAE!YV^}j7ypZd%FWy@gM~?SF|nx;n$xu z4<6g_bCq<~FwTnaTqsV#nvD?EJZ@2VRb4xJ;HA`zx=Vs0x)b!`2I{E*O!@T7YHLgu z^Ot0Px=`W%*VuX*8(-cl%{@Wk`Wk(BT+*^key@~45DEL40>4dapp(E?S%CcYi@h%o zcJdBBV)r{B&AvK5ECXLsIIPr7g;U&7!)jQJ1DD?sU?Vx`3?y71@zCJslcR_Mo35q6 z?Z+W3Fu5n&e7VC-5faIel7oqpo=H+yejO^5S5`&`mDt}^AM|M{jDh6sh&EduF;bUqCl!92l|uqL~;sUYK2S(Pv`#q5ruC*#W&6s7ku zzmofJb#H~FrbiVqwO(gWp|zj7nA801mXy3+)5pQHWOrfF&}iD=i_cwW;n>uOkKHi$ z5Ny&r_Qgy~$L2}8=OVL!+Z(4XXbc;4E3X8MT@G~H1R;Fb89dsgK3}j4h9LM@T7K)Ohqos`#KCb@-H9Yr-fzX7gyQK&y&? zyNkt>7@6UO^8HYxYPHurCF%5$&WJa@D^-3%@1Xp5spn$09H&|p0CLqNJxC!Ls^8U4 zhf9;zYym+CjVe?#Q-uzyNuxrCu9^9Q9-4%Gc^~m^c5}$*?SM8kxKai&aUn2TZ1ruF zzvNT`*N6rIAyfrg)O*E7g6nuah45iiq9e&Uwlr#L4M;^sUPLN=?o_{EbMc*_CfIQg?3oOfmy?#dAPK+ zgybt#(iqjesO6e^A^z^@i(GKEQ|i8SIKacpBZfTNC+__L>7gC@V@;>ga*VkpQL>e& zf!CM^9XGwikanLXPZ=46L)eMiE<9f1%)aEgE6V3*md(p1AESc$B(z6a91Ro@6NY)Y z`ccQbqG7JYX0q6SIy(Hq#T(y;lKdSM)y|%w=r&P4__8Z$=bnCai1ISYVCV<>F9ifb zPmhMj3J5|!xRhLq&6rXzeDAo~;*~MhDS$=7nVN)IWo=%AlypNw#!N$oP~#qfh73X6 zp7m08D`NZc1(>%V`P!W6h5#G1-_k6|R4I_E83BN&uNQXE+NK>Y@bi~ar){t!SNU0y zP^si^zPi zngGE!Vl{V?KF)_brkZzM< z^Yd?M+6*sdN8-hf4v{t*(2F&fW?XNME&-yd<@ThIeEC7L8xj$7;aCW~)t3A>o!@>C z%y{S&SvO_xXv^rd%1(_qqDp$mNqFc)$jP&jMk0+qL>|-_&hhqSyca=-3a-XQfz)*o z9lWzWlC7Y}kI;-vr5+11mSh5FK<8VXxVQOX=HKcT=E%6`YY%D)ds%zDHFFU0@dckJ zYCL;sF*=*|5q|{b9l(9@FNpdX0^{^C^v)Q*m2SF=6yw1XW z3qQBGt#aYkIv>VOWWb;Q<{ zT_Pr__bS}tsK$i2J*}-}y1D$Y=uvgiDn=Q&oHz!fi8LU6HLqnP-%9TIfH=b3Kx-O3 z{YAEz42@OpAV;&L)F=B2(UzRnzw?3l z@olCfCHe0Z9C!R*-`HRT?h$O<(um0j;r`5SG{uUxEhnnr9}HBf6281~vs2SbCaTdT zHY{Nr%3=2u(%vcF*(v_D6J|nfJ>IR8p%Db$;YeJpH07cy%`5BvIP zN~$2@Rn=MxLqh^0JNeF?Z<#6CEs3{H)UuzWp<&hQCx7Cx|4vGT(7U|atFx-CcR!gI z8H?=Fy5YV>{f;Z%i-96trzZa#9c+1vkg5`$$}(`31_k_s2FRYi4MP_Y%y)h{e|n3| zGAhXQi&1g5*s~jvC4(GH85x2%zluD31Gcs~GO9T)q&YIAxiUn8HdRhV-xzZ6p2tpX zS|gt<0UR#Vqi2es>m7rz?o}8z75g+@(U#fB?Y_jG^b6HHEBIorSp1o@Sq+2NBzr(7 zGK7%_+Pu80h<7&X7`-^#GzPRmG)S zJI606klXA1$SUsfpO}7wMbV*(e#UKoE8kRDvFHf+T4NXl-L6MbI>;$>PO3O>Gx`#F zu|;K19tPE^`)*mdcaqTCR=5W|XQ{l!lqvrC-pZ6avHvy)C#^i*gry@Hxu?SCy}h-i zZ&x1mYO4>-QJMwZkuTl|-^=rz$k!|i;J*Xyt@?6hs}Qc@#|sO5NtPR*b-dLQu|@hc z&9>iIsU->%ffd&WKx6SllxEohy)>C%?D%vVX+e-bJ_G;8h@}JTvo3#rXbq_)xc`9* zaX?VP0b&%UKB0$6U!ER=XM;vK3D~?40%)?%q-NkmjjpZ|FX?*W4!f<<@sAq_^N zZL!r}WA7Hugg~cGI`elxt|EfK$4Qn3#mgjW-vt~qTiXqVh0A8l&p9LqrXkdA3{)PF`9ID?w;1h`tP-#sYxGl4zA5zb z_6g&(0j=Y0VdWeJE7DW~y^NkjUCLs&3yJnl?wrMSul+mpB-o8 zm|BGzSwl(!{MG=o(k2ekL5TRA8WWl-B7Xjok9nS=6imh8l@j9Lon=J~QO8e)NpRm>IJWEf57KNZkPxR zPFthiWNwl4G{mvhF|F&}Xgn(ce{m0gCH2!}nDhE%s;Qm>@{Viv_ZiE9wj}FsCYU6j zSe6GiSr)GtgiARe&^|7B+dT#g-qB@ZsQrYjK6#$6=(Ja2ma8?NhQt4y!E{uOp>0IvDkdP2cEqfqjZcw@zXg#p#yT{=(A5$a7 zl=qzyEn7xl#G190^=M`wmFF}(eQEsF>{#*B`0#H5w!*D`90j#+ww(xXK2I}@vgXOA zydYZeY~Tu6a&TWb-0FFc-12F<3MF#k^5z9ly4h$wka#JJUvt`!y%nPhMX6C=-jaym zB+sY>0An!k-GaC~;tMYx(-zNjeJwc1ldR}uB?Sf+*~i;@kqh6p38vTNy}$bPl5Uj6 zc1|r3e;U`p6cD=#jY456>y8MH&5!j^BW+ha9~emWHC`p36xU$`fYf0N;Pv^{>r?Ws z2dEr%54-k;3lv08lse0-SEv$NCPJcwkejxeEK?^)Hwqtt-*cUe$#C&akS?$~-r>cs z4RLB$w1f&Av}0vx0_=t^o(!;pqf4P)o#t<}#XX7M#)Q~5VXqD_MQp}eXTF5+d0?O2 zDDG7}UpG%nIVyS7+q~&A4F7<6ZbQG8s|vIGI^%zonUoTgU`i(`gf#wPN=OTS^0E^_j=FGk{Hmsj-S{$tH(F$ZopvpfPVOp_sn)S+s4l>gV{_ z>53`ir%JA_oQE7;i=mp*UE#Y0@tF6GICH$-L-IMw27Y^e#p&iwnXCi=(AVJh`VmX#0HFWc;o)xW?F=VL898-l zx7$jM&9u+1D*Z(x3>;HhY%C)c5?+fn6`5guY-6}OS$2vozIt=t_2FPSA{JL+*H-fv zq+T)q``~AmQ!2dZ#>AilZ%({_@ciV9U{^YUB#db!CN}w8uDz3tLe3SFWSV7?xIfA6 zYs(AFg|F|}Q@_nJ2S~8yYd`EbiqamN=>@HH#!09H z5@LUE;*HNm8y`+Qtvp8j+Nr4|o};71gg@tSl0)dkq}UDfJiy)QLd1cbm7&sxF*}Xn zZqfMRu^bvjC~pT<{A|@gsPK7;&%^%70{e)jE`gTGJ~O||%@D3$X7rsC6ka9O%&*$0 zZLh)<8IahbXB<0`1=@XW2Wx#NK5&g9vngl9RYAu;Jo6Bf(p`iN$g6IdqG+sHKFEvm zlh&qFO6b0i9LNr8#WRa`?NVH^lhji9lfaBT>Kk)jy{@~<@H;J@%TF8#LxZBlO4m5# z)E{KsP5L14oFQ0|=EhL(d&ya;Bp;HEl~f0ST4Ag5^oHiyErTc9F;_yKKmVNhzrJxs zUxXtNcOHd=r?Y_Hdjo)+%me9SN#j69@ECS|0sJ`o`s?lg`aytpY~Yvj-xvN<{YL}; z(ZGK+@E;BQM+5)Sz<)IGhic$!hA`TEnZ%=oO3BL24#V#!Q=#zF>G0oNjwgfR+g&E` zr5b7YQnl32OO+ISu~Kp$EFB9Kl0kDN;CI3Qq~A5~YZ=$Fu4Vq!HvP4>{+8=iQdc1F zEwEIBvdq8bih(PK|Mz}_@qAh!?yG;UqxBYb_|Z7*H{<`qR*uH~;T!LDevbc7bPCF? zm@SoH_@lHo3*rvqQSs+}`Bxn;R!MElmrFeQqx$mC<}>ty8#?fk_vJ{cz)$g7u9b!F zeX{-CHgIhV2g4rlwPw|y^8E`us-%uVy;=Ql`wQ~0TmpIh1^=Je-9M8C^aUA{xuW3z z;QIIeU1JXx_}90>e-o$mR!#WP#P9b7*LJW!T4VLNBi=xcn-u}^BVi>GF>3{ck#LQ1-pHZ;iuo8{eFJ{KC?IA0AFoX`nz(#F>L*N z`@c{wY4z`b`LEmX?>ZNJiswZEabNg>|6HlW-^Jxe->!Z7;i%8=w}Ic8|7hR8Qw_!g>(hCn|8_AUh`Zho?5}GuUi#~J{B-V= zhHrtf{>jwSf6NZ1K|2_90^*QOZzdDCbz7s`QD3@>ru|NBF!u;25 zS*VaO|E;$Cuc8AnFZ^@-K^^`aho55qC)$;I`Ct6{kJ$eosjuV2jW+F{$_MRo60`%i z*&=c7sa#R)$s7^v*&;D+aBg)2?|uEXuKyj+!FE>vt8o3TazN~7{|Nkl=zFbM4SqQC ze#bAoiz!jz8GOKSbx79eVKNiGcr= z9h^*t{1RvWmRRxs3HtzZME@#Wf2*87$Nu{G_r!mHPv^@uGVtwgQ}{KG|Hypsr)QqQ z_lMo#o9%k=Yo32k?!WW>--^q>itg9=|CaUN@73>e?LGKTuN4?0{=Pi&pYZ=v?)f^m zyxV8>hu@0Jzl!eH`2V&1?;oj$U+kdQ`Va93KYYZ&7q4IToL1@;{;h4{Uxn*$k>exC z=J0F$2jl*c9KfH}fxpL2mh0}rcY4g>$N%g2;7{|zFMeUv8}tk2e>=DIch&a`KgGK$Hjql&$56b5U%OO~P$@%}<2EL^Hd=K#V*!l0JU2S)QZ%=)M@6Haw55K+n z&Fh7o*)jN^m%nBQe@=6Kyaw)R|IPOk{z?AfTIXOn0*k=k!swrM50py>mUXaPx8tYy zU)#fMvG~8v2h`q&Z-49i9~`fb*IG2eaclQ?^UA-*^|#`GO?REM-v8|O%N(@crUm+k zd;j!4|Ij;FZ}{uy6TCN5aU{;Umu75|Y`!GF3ge)x#BPM`n5{s*3GoxZ=w zzs6*%(+JEddjHfX{Gk6){~rARlJ?mz`&oPa_P@+WYb|Pj_?+?Qx(AQP{RG+YeumW_ zeGMkS0tMyO{!0E|#sAs|%oP6pz2F}h{%`87@y5Tv|N7dmd0xLeaJ}z*{59x*Y~cs) zKkC24^uJ=mANPOMe~s=hu7mrOM_@ks`;aqy=c6V3IXEXzaUsHekS|ZvEQ%H$1{X}+K-?0?H{?e`T59QF`bQ zAfbicq(i8Rp(@flQlmnsfhYn|k@=oy?wyml=bm%Vxi>e3CHMFH-|7E4GiT1UV?i_E z_)o6~hiB!@`(Vb(C&c-qdwgu8>?mENF;Ad6;FBNYdcNoJ`K>=AE*+iVL*x7O4f$e! ztGZ}s2Wg}F)%kVKu>OFzUjUi``+rpjuqRl2Gtd3Lpg{K0(@t+5=3^H=^UY%c=F!WT z{bu{?>D-@m{;Su-4+m!W(7AAQd116a+hf0Q8Xx%X2K0G zFZF%rqa8WsC+IfiyWnxWAKKy5^U`mXFLU1#ADkBsPAaVS|Cu%mR~-PZ)Ihdpnrh>2 z+?`4F1oqZi>ex!}f#S^Xe1@G(a{-=u(bblwll?PRJ_XzF^|61($|nWaAkM6PMy@4t zze@JuzWGuooa}*gTmq2$AMiAEK`SWxvySkcARPTb=Dy`VHqrZezvsffWv=aSt`Fw$ zxr6I5@8`d-i2DlozR$gk+@H*St$9%=+}MP+%WVw+j?diCa?|e3d3KDfo2&W36Q8y7 zu|3--+ob9*=r^}nmQm@tYqqbOaOVCMB4fp4miTns$5AIve%4mL^Yh*R2b^EvnsfHy z(DyO8u?g~gnj8D0d@YxBf^Pq+E^wVN)ODiMn+N;Y|LpELezstoZcCQ&v5j|rUe6PZ zpLO8)(opAnn_j275aZ5+pGgO!J z1IJQ>8xv&iU+H7pQ|mkV*_Ls-Jy|B4_9yOBUw&+f(~3^;ai}90WAJb;wOhAPYKoTdbwT6^<2LnW~^xIV^_ZaXDs(W3zV_^VdT^22Jnnn z;eU2auOsx^*(qbiqvGtYSw6Hg_bs)}Z-*zh@vzHym$rcotKSrC9RTh(T;ku;CA!*; zx*c=n$MXOm!*c8kxX!EFEHl8^j%j*cmNn~NPY+~&mSY|8$$w;rA3ihwaECibSHBVV z+2hhiZ-ij~^)7J#ggo~Wcdl%X_W^Txz9Sw9aE9>ora?Y7IJ0%6tqsm>9p#hv^rnG+ zd422|p#59g|L9IXeBrjY86S1twL!HS&_Cbxt@?dEZXNTx{Q=*t0PZi*aaj3#Dx7Bf zg)6)p=g6)05SZutPi^R8YXhd~_C33EnqOW$oqn^vRoK)2&-B5UxqrEBepN2quF^Yf z)YFBXenlUBt19E<0^iFna31ecznXClFY*PrF${V%vRZk=ac_psGlF6=c`FB8ZQTp14d&UTHi z>a)fKJNumf3b)0q4<80+!bb9!U1d};SMmn;rVZzS07X*xV=)<0}A#My4u zZ#S1Shk@e}XFSzvo6CVWpYz`uuR7m(>&Lqz&z&5aet%fj7R+@dzrs8_iF4^@o9nv! z#H@eVthNigJz_3r4g*Ig2Rz5)8{dmtWqp6Jx6l0#1!8~GdnDf>Ij_ilC%8Aoug&L| zJ)P*VU*{b7z6lNF`nU_-J?E=^-1Q5az-~^@?GMf6%wgb2aj^dsa~X!W55JH1zZ`SH zyIzm;)z9^&z2l?t4832DA?5mGi1$=D+0-tbG&z1H4}0-WL!N@v8SdDrTgu7?u-jAz z+l{v>r^lhZ(|X_AdVbvxIi3nqmSANMe||hO*iZ2Nl6?iwt>Rt~X(P@%urFrc!RN4C zpRlMejAuG+i#sB*-?_1D&+NnZPiiRZ9Ot&V))fZ*Jf-Vg_rrGYIN0BDJrL#hI^c-a zX`20zFEI=3;1rx`GI_$BLY2h8@d+4 z)X`A@b@u$W#QQAAdb*yKzjO3mk;+as?k_5@or`h-*M0uepmwBPSvT>?Jv%J|i1Gcp ziy0#miU2wom(X2MCxC@+bZD2SOZ^&7_P=6RR>i~q0sH?h(bZk`{|cYkP3qa{PRMzg z@=hMo^SZY`b>OxACAa~{R%TtA!&nP)>i;j9%b3Hk|0$ck!#gIZnkybj4|2v+=Fz=6 zi)q9AT(@;#DrBb)y!Oxa**&cBI*tEMn(b{4!}d;lN@C4rf(@e&CR{r) zkHz#6{c>Foh=aPFJh-PI&XoS~^7%TpZ#OZfPggMpI+txOr`?HU_!-AE=3!nwlUbHH zh>JMG#UF9%vcvyiC^|Hkf!&Yj0YUP${Q&!oXU#Dsw#!A^0~W?Elr)^FItq`~?@nxsu0CW9C9MBd1w ztS4GsW*lXjFyJG-zgIl@t>swh%1s>X=CogXq!S+Cc+~CL!fTbD+_Q5< z*ngK^2d*>!?&MybDq86#*tqwqSLgbV(>@@_eW1Y6z`_0;2Zns6z$_Q+eG6dYb!KVUzn@*e%)#KkgDL4LsQnxCT1m2_}7Xk4`0_3%(Ov1gL&7RQD`!d;ypQ z_!#gyfMbn%fV%*(6_qpN-HmMZYP?|_TXfPcEhSClVrH2_<klhznIg{yhIx zBUs!;`NN|D>K;HFc<1JA-PePq2%O~sSuSv6zPM_+VDT5_&z%Ok)~{L)wsD%PXT8W` z-cYEaY#$f)CyhB>qVIOSFCY|Nipu0@Aimzcyn}U)OWX9xDH)s(?fMqbxZsjb;#;l$ z6dZw~+(B!AI)*(GUE1UV-qU{*G!d-;=zQdo7W;w3_=fis^#hvz!s%rn3mp#+!X6*x zmOg0lIrFVsn(_D7m^b_R=0V>#ky}3P$|p>ZDA{jnL<7LT0TTi10p9>F0Iqm}e#SA4 zd6>7sfGH7Soujkk(M|lU=bBcAZs)qSgV$!p`D`~d?D7EDqi*S9E=nxv(DK-V_760& z!cDfbN3vdNE)3Tb|LfqvIwXd&~LFhr@1onDk_fSn+CW3Cmt-b$;f5ks!xt!XeWy-vE%^w*5NTaZg5n+c%0LKC0vaee_q#3q8 zc5LhD;&Y)J^z-APt4m66${qD!v>W@=Hep+vH`||K;C~8mm3Fp+{>|?5v%ivq?$VcA zU4Wd6S;rT@*y5p?&orqw;qm*c41c(htMy6p(GSmK=zmNB*xg(|#-aaly$(VdCp>n4 z70SE_vZH_R3SBH(_HwHqbRC)f)Ty1mz45e(t8*gMUv7S&(=iY)aSf{rJo^LI0keF; zgj3&)6~mG%nC%c$IAMA*F=TF}NL*Y(B&{eZMt@pLj9Xn=j9*jQaFw5F%)`8cQ3hi{ zA6n#P@taNZOkUIv5!bMWll?p9#-_oRh5ZBG6ELbxeX*c@^RVk=;X94Qpz)=B^zXJ0 z=ntC@TTntIuPiBTOnZj{<57H{A=Lg&F z`_ITjyIb@fBTx^9Oe`bFYcS6<=A}-ko7vAbmAX=Tqf1>{*q=Jjm*>4x-2fkd1su_N z>>2Y{AN%X_1nWY zMu`cX@5#0N)S*|F@8E`Qz9AIbx-HW!x;pox#t&;z_d>93UC*ENXkF2Nth@2vpxMO* z`(9@69seUnKT$VVbpSfN2w8ey{xzgM9Byrv7x{)XuXEdo*7XM`wTZr{ z+tsaqNSFV0)%MM{XB{YL`=_ieBbKFC7Sl)nF(ms_XK4FFhqS2ecxPi?*e;wn2Q;fy zaYXBS?_f?~r(4@6JyBaEOe*eZfA;x$yDu#5pL{I*x}sQe;3hHpncA-F0CcoxWb1kz z2R5&rXX_>5v~94shCEQGD(ZC{Q)O@pVxB!ez7&n4R2XD7WMrD$UhN%UK(`q&8Ua#T~0_T z;n?;$&R6y}yM@92)3=n9_Fuf`W|7pk?q$kG87V8^gTz*KV-uRz%(HdGYqf4*KKE&- zIbF`0ICOlHc~oZ+ftM z!$7v@I*Z=U?fiwo{^X5qU%|ZH6`JO^KCd-;u>E_1?C+-SQ}2b*{)-M&>~gKyBft5D z?I+pUpYMBi?cE$-80Z;Bm;);6{~f9T?EkG*|3CUO z&%PcjTU*5ybo-yS=|&&hvmO+U{~U~uWZ2&F{m;tAf#M3<{`2-k`Pm=se~YsQuJ0VM zzvcXoI*Sv?=6YH|+Mj!W%zZ!GKh}WeUfU_4j zpSKGaME^e@XFk-k-s~>=y5dXur@?ER5}pC2Q3o>hJ|NinAG>6O1_+n^+3uZekLUhbtN|CAyHGe=Jm|=0DZ$* zto{Cxz+&e{};gN3EqA6XlH`;fNj&xexb&54VQLLwOPwC+nr(9K5OCrsQYp) zXb}Qi4X_U2{O2)!Zyle<{S}LBZ)>^m zC7=%6p1i!|HeLUQA9aCsgLf}*tj0a~Jcq%vn5r*epUya@agR3l>9S0)Hdi$Hyhok+ zbND1I!sMg@-2Yq_=P4&E8x)j_asF(K^`e~kElSTD4b0zL;cwV)aVEd*kG>*v;r@z6 zcRJ*aS%bogwY5q(TRQ|c`6;jK0ciZP_)w+cpKL21_U||cC3I0{KMl;Q^`3h`#wnJeyN7E)Tg+SbC)LFTk-3eM^Ta z8_E{l(^ROe?2efU>&lj0us7-f?!5)fLp$CIn|=@X*JXHD;FzC&#AU(V!aV5TyWzg3 z2PUs82TtRj7OY{2@ww` zhT$xDB80s7Aj$~Gu~dW%r_&cB4@Lux5NQlo$>x8g5iXVP8)isP&%aeu;G^;zpxMc zu%J0?I!O=l4TA@>gj1wSx(_ndj9mNtWxO_ z#;+8^nu4RO!kUCJOxH9J$8e5?qJ(AGuy7Smx;bnRi1DNw1mYNu%&9?fB8_3gWH7c2 z$9n{VG1H>5@t@9ylf}vrUxneEAHryAIlqW1SA4^;S6oi=RkpjBoG=1cBdX+tvsoWx zBlW~(p)kp+Upm{hY@}@Ateaqo3_%4|;Lx8&g6XmdRYfZ++ z)4W`FEpLj9^QbK_WktvO&sUl(&sfUi@YDO%yE=8@F;wCZfet? zQD(z;i(>QS+j-lD*GYi4NWO;_SM1;?mb2+3JCH;>X>cMCSVT zzHP&%J%_4~P-L|#qvY57KS!RHHWQf}UU1X{>%uStl;+{Ezqv;{<)|a6WyXAXvp^ZT_dM8=>ffyi*2UCbxc+ zs|DaU`efTzIyf+;VbJoQT-#B~M;Yno^Wywhuc2+kOPK@7uj}N}{y14b&VBic)XB+} z4+i9gynAH`>YK7C!*9MC-~Cmx)7_p}N8tG#kgmBcp4~Igke_}%{q*OL8)-SR4)n(D z_Nfy&={e)h?8AKp^>Sg?`*^mz4ZXfDGQW5UZRmOZTLF~C^+;jTE4iNQ zc5vde=OD{oasJ4555UhjT?fkkr=W|hO@9|Z?jI!O|2}<_qx@DnQE|Eq@Q-m*_mQtI zfZrdtm7hA;GcHhs6M*|pE&UF0Qk9_@!?Og=}gWIn*{ld{XG2-0e%~IBk z6>SY!>8HHs4sSBzl>AoinXO4iJ~uYk^N@GSU?Ep5)AS$m#GCTrnOU_s^FUVl{ufAQ ztF-e+_efd4ThuH^28{8goJdo=a%^ap{T%ErW%u@fDzB4^c?5BA>iuG8QoW1hy<2p( zNXTWb1My7Lf5@}YB!6#}4%y`Uzm<$`<94HM9GG&yNT1u-)pOHHPLt z=oe&sg3deSy3Hh;-}g$8enrpIrC!w%Iu5T6SP$41Lh29lSbyYc4ZyIw;=fCSswH&U zD62|Su37%h(KYsl$33dYC?5hh*Q-y z(jrZ7`R+PTR({CU%p}_`b3UZcH09}K&SMTI_v~B(Jj_vY6o5M?xmTxv?UX!2uHGiu zW}0O|dPh^9BN!*j@sByL9v*$`H z%8cssK_nr$=Z9q&=S^cC=4Ba{B@W^uPU0pF(&~@|+Bz>*{%#Gb6^C4$|Io+4@0jx< z{r{QrFn^w`rI~5xWf(G8jeq}aMH6{9n{>c&<28G~BY6jy$G)4bWM>@mz68+g3H_71 zMBi;!q|nC4*SohEdAE?~B|E0^zQcFm!xm){;v3#$SFF&*(_WAv!9tEhR`0&L04USe zqMR7ks_x7M?H_PGhpOYGzyH*T;yB;m1TX-w9&ifqix=o;+(1AR+zaH`ubJ_y@OzlgX!+ulr($jhR9;U@m>LlYnO*@L0vPw6I{2CQ zRY0VUE0BNM(@jc%w-?AGc{TG-nF5v9(~!43V5g3wcaxez-LXU(OJ8m^D78b&2j{hG ze#f}S8kNz@D?j+Z8?YJRR&H~?EhzgJg->_KJ$io`(uT|rE(0&%>6qe=yz0DrWeMt> zAIjVgF!};KN5$Odn;AM#wCvp3AKoYWPby)S#}me#mxJdN7bBM3Ad+$KmHy3p`WeSG z<{1DS#AQdv98Vs}t0q66{kQA7bL;o&z^DhqThTO>ai9S}x7 z_g9fHG15==fu9uD`3mS)_nGMKnB`@~*bcP<(k5@@5&ROS0)ndZN@gn;xE@J}t#v4% z{14R^1BTz|C;O0j_{JmZwU;kPSC?D&&szB#k^FG|fI0w=Y_ooI09G;u8#knRosy&4 z)PFUpP5tdwdKmuBAFXBge&Z&$^3U8>UQFq8x262xX$N?FZAgpSrGk|!l>8%F)w>7u z-UHpaNe@QvPkONarT)pKedK4I*Y9=At^B;#XVK>0h@^+=Uy?N2M9(D;b z?=n(;j@|M?e)ZjP+-+c-MRDRQztVO2?Y`-f+xkCqo9DaRg;ai{{_Ep;y&mLN{ssFz z_tZjuzxnI@va=l>*x%^?beVO3Zsh0P!0PTF-2L*E9Ulc15BZJfpDwfR&yD_6O z_?2ULB`^Jq9tW0mcGGC?P9;@IBN4r+vp zpMt=HXH^NAY|gP8$FGp_JnpHx3YT!6 zaZKab26qw`%IAA9@)qU2HZ0gL|UZCipq}UT?}bevLhN{V+8M8 zkw4s{B7e9qMgDlX34XXkBAqVoj_~jSTxl{o{4NN|D=L%=P0A}OpkXNk7>EIRS|X0F zai;|2^8fLkh;rvXz0f+m>pIQBMJoZ~lz<%pa z*pD1@bWRi7JqkDjQJi_0SCzAI$;^3#WKw)jJzb7Q=# zf#)c-Gn7|x-h3s_GgpS$eSVAs-z$OZD)G63)TW1zEsAAT3i=1$BLN$^uUn^;x#2~@ zdlb}JCb~TD#PdCd9H~v$VqbVgMHK!h$hB6-jTTPgsf{kKYDugQz4&2|9VD~ zmWnSoF6IL(k9hLlJ>;KfN_CwF@}FM!nz(pms^HmIWs~e9iQ>nj3k2QE2YZUF9lgZq zO#{Wrl@GbbJLZM^_K+u+ymPPIr$gJ;FwQvyszbUwXLnA+d7r)F)aqB{Jt;iDd->=% zc?O6sWuh!R6U1|$m%sj4{IKI+GB5gKabjf~OPNMKQ;Tbip8-k+lA&w#J=`DH4&%*G1<|42VzC^87sGpEWpWZeaTZVSSI-ktCr1(TPNgH z!*dy9261RcBf&GPIG4veFYW~V;^mRN8sj?npYX=BeQd-&!(!mGG~in+egnnr7*$v7 zOKBj_P4i47`LMfRN$Fjl14NtRbLQ*G4F%g6&k}m+kcZOb3A}x!@%en_f<+&-pH*Yo;$ zCw1;ATrP2w25ITEl^;CHv4NM@PFnoS8vnCZyx9fbfAK6A&u=L?=uX2qt|>UXHED29 z!E<{l{o~|$uW|jl!6o4A7vh-4Jj}~7Iu7C_ZqhK*RblWrN8_`D7GF<`KLNkxUO}Ae z;+du~fL{UXoSE)2{sQ0#U=v`C7wBgk(*l(pgL7M!@6Y53a8l#5p2mM!#Ovo2A6IE+ z7xaq(>H^*ebOZbw@FJiY;0{1(a~Tz8nl}&gvJA@-2XPT+F_qWsg1^T#-pQ-aoref> zU#=P_alCD512f+I2$L58c~bmMHPb~}G(bJWm~TWE^ttAI`5ngD9rpVp0g89>7;WYw zzVRP8_Ft^$i)&bY(1P~O1HLnu@nDUw1fVA1Wk44%(9byInQty<6~^B6lHg$=c+&N{ z=&e?mh_m=1AD_`iJBYu(hFJP?%P(;r!)PlO#bgwCD-Y-lI10E5@a$R4aT%8mpiGYY z$4Qg4$%Cd-@^+^k4~$1T&lwqGJ)A9)YvMS^u?hS6KLXCDmcP$(Z6MxN8uGoM zWEk0|zF72vM+V|F!;G%?iiF9&XCemRo7dbcXth_AduWnYloZ3}-XLanyVnn&!cUr{ z?d6}mzo7VY<05|xz)9?zm;1`cJN%VZ)9}@oa zJ7bNPYrSJuVx9Nhzxv=L4btL1deSBj*6PTt8Ac?^dCDI0GT(}(|A@t;i^pcOw7G=t^SDSyA%n#B@Z)r%VO z*nPDUQc9dx?KLqqXJ2fv{By5B>fW2PlAf+z3;X?}5}MY`^JfnDW?wG*NVZi~7ediL z%W!QQYrwYiB2Ib@HXXe4c_izPc~5e%`saQm@{e`-*Mj9E)coL`&me(s0{ium!Sc_2 zIC5{nkxJb|__p>9 zZs~_3AKL)OVs?9iXAi&I7~9aV%SivM?d7H3W#4n8Qd~HA3I+%G=Xm)$j>XKpF&v2h znOi+=R<_%tl{4@y`jF4h2g9>DFZhogzOY301a0q~l4VB99b!?}XbJQ)p3mC3dvf-h zga4n=?>}J1o1ftUGm1Tr{gm0WcUBPGAIj&El7TM6jK}_1e)rR;Gm`fsm0t3EizYug z_NO&#Yx$;VgU7vfndkVh@3EqEO+0)0dej-{y+vW*T}gv)u2uj~-66-fl*0m%VXtDHIlJ<=j|{|TVM+7s9Kx2Uh*IhJi@-OZ z@CB%dh$|7r;v-_{;%DJvR}%ImMMPxLMemnR7c*XFH;wVweWBcVhB3l7yS*9zQba@_ zy5GP}LovGPKnu4A-PLfjN~K4^T}{S&054tQkIRa>3O79_E%FNZP<$yql^k-P7v$r< zw_*Y=@zO=cDxtV?TNcVIS8mTj7`Wny4}|E)elcv*qKlnq(k0^&5nP1%1E4X$*r!$T z+SsRsy%`^1FH9EKy489y@BH`PUw#4WJ|nU3$e53%pK)0CxuDj5Ol}s|Bs)VDjz6qT zG~-&4Dt~r;JGnnX@`3#m@_Q8ABazy4!FLN|e@mcW-Kr~Hhj_)#QJ?8`X zCX0*vdw~8fqrR$otM+YhAJNiYZ8-;XnY7G2AnsFuQ1qz--dU>XdfevX+`$dv)P^q7 zJ-(#5+_S^=+cVo!#JK~X3)WZe75fq28Zz&PTRFhEaKZN#J(fa|eA*p#NV_pMsgS_!u zwhXQFv7)V9u9F_X9la+ve2hDOlO=w-r@s8yf_@ht`nvwGX3TZQEnZrKlnxM9_qaU^ znr|z*W_RDT_Ttdo4sty?V-@xlroE1}^cN)$l%IAnw@0p1^S)ZHUGErK_ifO6)=S^G zR}JCsy>YjI=FI?C>*HKI-iy62{LaYNxX+h++6en6HIVU4*JL2hn?dJRFRkx2`Qj^_GkL!y@A2e)mrNtj&p3JarT5-Tu7NTQI9}Cpg7z(5`tniEG=w*Jqf&Cln}!gm5?sNKQNEV&$7fpT*OJ-UK*A*MjF>sC-iRYS^Jpzw^%Xj z84pZ+zp62>-)BHM(XZ2Q#lY_WYru$3 z4|>-WLfup0M4x)VJEGs6 z;cn@f^MUqHtZPcYPV`gO;_ic^m47zl2{lamtmkg&hoxv%Oo(4XL2DkWxtBKk#^?t;Rw&zT<%%OcY*f( zWJh@k^m}C{?H@tAeK=^@;lLcw|I)UsU!eC3>pA_53%AbgcnD`aXA826;rr{DZBdYp zsf#pBlMv!DeV{|%h=@uUIKNBiBg8j7gjl^gE2;2fY6mC(sX2XRo^Ao&Wbh?ep84 z5q1ZUShC%-j#VaLDu?XQK1BbeVEe7<{uXU?r_`_#!$`|gK( zpK(iB9`0WOKdkRt`vAt$a(sVm*|Xy0`uD}@&4cm&Hvu@N;CbBDewL62h|=4Bag*+=1S1Yk_vnPdBQfX)E!muv0?`We>_ z<7UdtJz6Zoy+1rZa;Q&}ngcMNE2(sfe(5g2zrA2Q>zRjnS%zi3I;_zrw&n@kd3pwS z!LAwG=MQW8rbJ%pKdihMk`yHp=as%PW$2x2n8rNJi?TlF=`oJE3HvO%jci|iQ~znj z#IP|Hjd2K{0V!+Bh?IZS+{8T0tN1j#*QjMTT;V;T6T1CH!q^oziiHO%UO^vfd55l<2i(>8=8P@nuFP0SYmx6(wreXd!AuUwsi`k>~^=dJoZKMT=gS z=)Je~mtVfT|IhC^?}wQ=cjnC8Gjs2Ko_i-kM@xl*lz|ig08pr@D(c;gn7{2d(M|8k zD)r-Lz;n}6kq4AwnAUCt!k2QIasWViEZL>yts9xdRrQ%006^LPx8ZfU6j%cQ)Zf$; z}C;>#R zU;rHe3xETV1c7+}+lj{;1wx+9=V^3wbPop(xKlOs93A;)a9bYTm5A_qreYvcZ=PSq zXThbT#PN3|{YpQI-ioBpvx2RUCL&aMq4vpnn6h9DWYMrdWYXX% zz?Q(V|C$`D*p(M18s%(SqsPyZ-w{R2r$A0Y!K3iw#S@rRpA;*k#c9fL&vn@@@G=Jc>Fy4n z#I1{1L{}4P>fS~0YUsN~)y}^o&c6kgZBG~eem+q;@1C>&;gOgJ?ejPBkwg$)SN{~gfp+hn z%zkGsT*mCIIRgXB=gv@NSO_0s0DgmYBtrcf<6m)uNSwt~P^QO(E$gbH>J#@p3Eo^Fw>s=oIeI zv)-khb!;T!=A`!*VwVx)xWi%Lw-_ea=%T|NT15=7#CM4yY`D1C%}mF;QdayRFg6=C zV3lZZPrw3k4=-)lhMf0&yf%OOC!&!_1s5U$PZx1?p=vM>K$oIMX-kj4S{j?xc1rj= zr%#XB)UacA_I|Bo#>NhJtu1{lx;WX%ujHC?<#1?|1YtPby3j2^bDuR%*vj?hw}A>H zcfaXxw*7je0Gyv#uIqzWZJM&F;T;3u}s#V#l zsHS$1@lqiMmZ;qBE^Ba@7Uz@d-Lpm2Me&oF61rL3wvD&>|Cr6=HC9kcWof zEax*hFh$U`l!fJDSZ2y#ERQ5{K$6*cOTK#l2iZW2PSsgl*%z4Jis54ZL(}S4RBP~g z&UON>R0URFS+UtS>{5HD)kQ8$DN$URz6tfmo`sm8&`=@~{C5%*i{;?0*(QlM)Uqpq zOMETf(c{;%(rFT2f_n!zU!+q;wo0s4kL7uaK!bs+*d>zwDasx!lV)mSKNsH$k--}s^2J7Fl;%&Wj9dJr(2^c{QY!@e1X#k|yVO$1(6O+@ zcK55JvEr@5&gUny0zg*7*#)@)>61&8{SGxgOeBO8Vpv)1z%VDCDem@oYpN!8DAoOY zu%F#Q`{GNtSR&KWAkNoiAwE;uy{8Vq6qNNM-8#%Ao#yk0>ERVrN`>a<k74y~?^@;&{Uh0BHm)H!hp`{Qe=CW>+tiF@sX|w7atv4WE=_^C*d{q>APFeu zQAtUOgZbLD#Mx*b$lL! zwVukH=D*DDmsK#ESY2#%IlPRY_VPctLz?IOMJ0cau;31oou>nQM2gg>GZ^JKgUV^X zzX!7ampiDoxlOo+esyIfdVufD)LEglV&l))MKTG#=9>b~f}PX1uFo6Cy*^8f7ip!> zAHH4z3_rY_JN910bdly!IH$L@f|1TqeZZq=E7N9#fAxtUy~k;cmOsl`8Eb^staljB z4VM)#bQ&?RtDl*UaW%=-63sM}7Cg&*J9t{7Lj4*&WIyS2MdMuOeDy))7WM%VOawq4 zh@iW0%9-b}erDChkoh#40BT14VoyIA2g7~Y-|8bB5&mZfyz>cPT!}z3QvAEceqsy- zcU{F=*7AGQ3{WPtLoPbEB`n{yv;bUGE~^xX0NmKsQr_s#i_CdYlEJB2|3Qt0yhCXLXGQ`;+!kM^IlN>1$6%-tE$krIPF6YqU~j-Opfg z=!m4o9qR0#o|613EiHYg9Vo<@aa9V=*e0niYFY2J$Id<0%pX1+V8oTeCwB?$Ea6NM zg@|=}x_nSU5#IlwRt945BGgt|&r6wK3}i@Ey3F#7sxPZOnI7$Xe*nuDUvD&ArT68( zK2<%Wibnpr0~}X9@!yJhG8~2pYJ0edx;-~wIT3VNJ;|l{U^d3&@+w=bO$i68kzp8Ipx8x`N@{t!66qGoe)YYO_^k@xW#bLx`DeRkUJ;B-w?hQd-m zC!a{>i?v%LPf@q^02+Y^CZ!%1!r%EUoA-LO_LXPeEpwB^hfG_j$7QoWbz)4r=1VgsLmv?6x1 z)RJ%K)EqVM9$ViwAfn4x846i*xjn~7Z**#_H2|wf$fj`vKq&GPEpfTG?G`j9cXs$<|E{1^tNYue zjK4!pY}c;pHcWgh3h@&OkXGb1&n~N@5(IpEJWK_j`8;n?-nnz#WS~|nI z12g9s-)8Q+xyaiwj2{TFboZ&Aynb3yA|$Et3ZhB!?CvwfGm0qh43qV(@|-z+wGK&X z7W!2A8nF6_s&52AT9&^$@mc}@Vh2Dj%c$~Vvh!?<)#biSxirVX0SXK}yW)*bmieJ9 z+IK~};oWbIoz54U`7UokCQxUvV#pF@LNv8s+wBq2d^G&dUV$+m6b=rR^ns_WZf{do z7d^0n^JJ(;cYK=_7P&`3{_8hwjf&~eIyqfe99AJe+?M*o3$<(R0=vUy^a`H{*RRIN z?u5+#3jJ?M{E>VUhChw;lsh`<4~xg)u34>wbX|8dGQUg?j&^=Mt$lXN(>@f4AdiSw zFXjH@P4{X_b?vNwGe{MMIPdv(VLg-ik=;`i;KP=k?8NrhCGo5DPHPv^wOg5Po;Ok? zrs#1`dW@b!fhK602*rwd0ca%*LLe84y%+fEBZVQnYs$)s72SK((nLC<@bufiLd2j! zz4%zVr~W_ij>!J22QkLTG4>GiVjhbB#F!_(1iFzbj7GWpDvDPxbr}9(sMRO`DkrDY zat1@*#Lvja3e!?0&!2|sqDs`Rqd9g{e+t{ab9^*cv6tc-9F~HMSyD|iF*RL_jv*#v;g|%61R*%`I_qqvm={;v z1_}~86XBqRLnU<0&o`Zq>ZF8)6}fgMpM#ulTucY{)Ve*u<(@_5vF=VK;gN9HYRd2; zG*hJE8QLy_C*%ZX!u8QPS6?$IO|39rjT`L%9ZpT9l=^zGxBC3K%FXR}VPLe@%MNxD zWo6}&iZs+)WH152`np+kd`og5LZh6}=KYtS;>mg@e{z6zTaYF3YLl0HK1;8cPoTLr z%l$@al6~x4+uZ`OFO>R8h&%B+dGMMYijSkYD1Kmnzv~%mUu-#8+R%+^5i{EvaDMw} z5k-X57p;x!ZR71@_u{d(#_WFpX+u?VxjC%gTOo{YMM>N;UjHC(ev>W{bVdLKa}qgq z=;7&5sv<#6qWa#vV&?^q8<(TPTWDjflC}8@o~E3n_9LPN>i-DvFH`;vysih$2N=?t zm&VmV_giCPH^5ky5Z66iz>nWzCY$#Q`O5vs z;z2%n2kP=mWlwJ{)L}d@x!E~W`&=Z$_bvSoZL!k?p1594$9JuY9a(ePxR8B2UiJaH z?%WUZ9oX-^q_o{oZenK!78S93r$;eZjc(T?awJt&Sy2ZKxx{kZMn^Y7Mz;cOWv#a6 zJhptaM;#SV^g#Qv;wR+ZYEIdk*o2R(@j=`A^yyl+c<5O%w9Ps>O^5F(jLL41rR%sX zhpI4C();Lq(ITA~C!OqX7@D~p0iB(HDCKdXk7Ws{m7$LLS`^}U?*3J& z2=dLYN8aa8StiM`hJfLmZ`Axc-wHu{=YpC9!+i<|##V5oV_8$OR)%CD>Fp>o@{@-X z)k-JQ&ECDRG0&Frk8ggnW@HC0NYc~MWhq6`6gmU2+}76Rd?s;X}hW(cliza!R*;ZXKgIhIo+by@@<|6&0E&f$t-&0Uk zWo3aCO2j9!3;VzYIoy15JnSan`RlpYnAg>8In&_mtd`%9@H7USA&eozB$hTk_tmd; z7-qfsBKbiwez46FH6<=d|EYd3rM#fUMW@>Dyr3x?y$ky)He5|(~+1KP0M#-#a zR89ZXw!rh=$1e}syjeTE=Xc-;5!CPr?qX-ypI+1I6*5`CG|%?bdbqZOPgpG{D7n{H@IgyK6&f7h=?#dZvI`K0iJ@nlUj8hxmAO^a)uuk|j3Q9kCA zIc+R<%cLw(2lr}y6xF0JylCG}15r?Ui^p7&aTR81pd6cDN58q)s7=B+6#>+f(Ec^X{ z($C03Q3|hcCa|mQmPM0~$kzE@X<9u*F~chnQQ;6x%red0d_AI%3zhWW=7v)tEQ_lS zSFKifC)R+?I{oN3{H3I`X(EoR%V^-(EJ;Eu7>2QMn&6ejomxSB4(%pBYolDVGdrYg zFA4OcX!&!J_>6{199>G*sQ#8hvLnlMVzPhhr~g6Q|B~VVqX~H1-76VO00=6Pg;Kxy P(*>w0X(^V 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 Tr-JskU4bjs&Q^66x1RhDjg)X8 literal 0 HcmV?d00001 diff --git a/icons/40.png b/icons/40.png new file mode 100644 index 0000000000000000000000000000000000000000..9391fe6f20c79fc326b78c81ef9f8c5157e12056 GIT binary patch literal 4444 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 Vtozf99H>_4g`Xg>e| literal 0 HcmV?d00001 diff --git a/icons/60.png b/icons/60.png new file mode 100644 index 0000000000000000000000000000000000000000..b58e5e3f541b48f3ed12609ea9c3e3aeae8ba76d GIT binary patch literal 4805 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 literal 0 HcmV?d00001 diff --git a/icons/80.png b/icons/80.png new file mode 100644 index 0000000000000000000000000000000000000000..12d3736bb1f1e2969ad0e532f71de1bec9c18f8d GIT binary patch literal 5207 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 literal 0 HcmV?d00001 diff --git a/icons/c100.png b/icons/c100.png new file mode 100644 index 0000000000000000000000000000000000000000..51131e799e3292fcf88a1ba55f0d1e5732cbc999 GIT binary patch literal 7346 zcmb_hWmHt%yQiC>yGv497)sEgW2hli1O{mt7+`3SZiYr0$sv?fk**PtkVZjr9J)o2 z6feH-|I57}|LcC(XRp21UgtdP*=Ik$c;bz~T9jn0WH>lDlsek#Cb#q0-$6oj`}E~f z`FK0wdYfoH#Hkx&-@aWCI6W|UfP>SRLVgV;yj_#RwI6xo-~jsm4qOHy-7p*+b}b$C z2M~Yj{X%jC`)t5qw^GW|>`2pHw~=#LB;{N>B~W6Dct|)(O^z^Y1UOBM0NKtU~fbClXnCfQP84-7GdeRxck>w^vowVa-W-sk43{ky zDr<|COd@h)kC_ZZq9s`yJef7|m7m%YnY8 z+ep3Sgvx*>Jzo=)8y{ne(huL4a3dah$BlKoQyVY`q)Qd3EEKm{dP{8Hy$?&>+c8gz z9tDAPQ>?HQS|(g<`G+m0xhS7?-QqY+s*V;Y(0yB2=*9Q&5|Hkraf*1LS&bCro?Rf`?t0-9Q6{LsPPLh$4$&u% zg@W*3;K5ehu~jm|@Q;(WyT5HRh^aUsSwX|^FjB_GLj)xo#y^isK(WQOwFVk^BDz`m z&X1>>g-a*pB-;0+onbID4Pb(1bjxq@4~B7DkRQRL1Hyo|v*Rtklqyg1T?PbuuCn7N zm9|#zjT&caO+wv6uZjTKyDm!*ztVknl|cH-%d6r$#$^fc=;C`5eirrCl)GPQBU3`Z zUwQ^a%mK}a-pB1PwObVC$czC&Pv=R8i!UU-(lbhF8A`TVws#Dt*Y7L}e$!$&ogjf0 z)=<07ueK8d*u&@q!BwTpFN2zU1U;_XJ$*`VU)5LXe*JFIYg|Rr`-_;_OsO4}gSu|L z(Z#2G01gk!g0dvtPQu|_qIX;sZ&LIbMPyeGmfA59eweBIJr-OifKMk+62DJut0;2>rhVl$f`if2wuTX3j1c|dNc=10$ z#2*jr)<^bSG+OFEE$L+rR&E`ju?9ER4JUy%Ua17h$<7!UV>>%LcUr3NYYw(JjdQlF zrR%L$a|L(Td^X(ZJb@K`C| zLxp~6k`cIvmY0(gnKlZXnf?0u&W`K8+T-ouQ5xcajZM|qM{gY+WOQJ#yL&6$TwmTi zq7##9wd{VOf?(e^8o!XdfMN-Zn6et!D3NECmzX|s3CMH?a@YMFXnkLO`QX7>=>Bd7 zs>^~zyhb?6?dfD`f(v3Z_}e>|hG&BSxN_y{*mB^4)B4ZPR}s}aYM&OLLxKBTx}hQ! zZB!~}^M{Pea�rAwRde!0)P>*Iyk*8`k|-sQ=x%LqD%oE7 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%0D$@`X(PPZ2}p6WIbnOgWdN9 ztlNU+Y>##m&3i!qF@G3#H~j<3Dr?$jpixI#^ZMn`fpggJGr{a3)Z##!G_N?!r=bjj z5H!v!G-p_4Tlw@PTCH*&*bQQac7v$Ec}yaYGNUF&M;!*cmxGNg`;cu<;!Nvc(~fqO zW+xQ_-nXv)=AbarTyMG67SKLQFa8vK!-Xi!`>%3N9w{Jvm!aQ4Qr_p;_si`r)-5n~ zRc&qaR4vWTMHY#}{q`KO<0jSn9BVU1N>|>cdBtmgz2_ko5sMe*_o;7O$Kr|q+Ilj# zKcPvh;#5Qp=JAq^@7Z9j5$s_0UB;GEwIb){1_eQ3Y-;W?WhFtxRn~Q{t2=fX`hODW zu9;m|3Nm=V!@p&w-jjWEp)LFGHqQIh2Tlp~V1@h+wA%|7oCLMDdmLl24^fK#6$GB$ zLUV3|A4u_Q%j>QimMBfIA6pLbq5h&v^Z(`{d?D97xN02CZRK<1gj`$y09|c}R<(wG G)c*k$NPqctGBFOZIwlW2%>j3ES9xO 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 S<;(j808CLsq5Qc;*na{01ro{t literal 0 HcmV?d00001 diff --git a/icons/c80.png b/icons/c80.png new file mode 100644 index 0000000000000000000000000000000000000000..7c755fb24fcf2f1591d8fa92cca7816ade58161f GIT binary patch literal 6675 zcmb_>XEDyW0!_4@0UD4jd)UPTH&uOA0N`U9$*m(kc1`4`Z5apvkbnL=aA^5;q5uHKDxkWm zS%}?XacDXVC}QOGs?vy^m2Hm8M2_&76|lR>CEE6>acWZSrjhEWRBGZxp0Cfz%}>}J z20kS^kfxGlZ0ZOFzTt|C73RS6$MN@P@FTweWKUI=p5CHOVBh6p`|22}cQtW*)wNy~ zEY&#C8LZf&)% zjyplZ)?IpXHmRNBm8)4ga(4c5h2uXUuP>2>^G<1s@|DyG8$0cchyMG6ckDMEVF3pg z8NN#^^LmnQ$coOuU7b`^<3uP?Oq9)1r5L{dc1c{Rg5Q%Mz$Wz4->LiT)IqDJ8kQ*DiIJ6xVyV25?}Yoyq&n_ z5lM40u~~M^sgW9fI2(Du*~1# z`M>dsaEHIP-6?q9bwSP-nSI{%9kH>x49doc6YtU#TMlZMQ$ESa<1NvgWs~>&1=tqo zsG=6ZGGX4z^y_Eyw2lbho?VXKQD~V5x0UvMx*pXuf0KUoX5OL3Dci{v<<_sq=acQF zz#wGzXtclQKq+~j-ja}&-t{Mr{o~`M14ZPbh!%6Me%TOAjg&{wjpeLB8*~EKc5~BCg1UxmL%J2<8Q(5@_Z$f$HxOV#qMdYtoxH$TTh8TbKJ&d4F>S!xZ#!$cs zNch!oO`&vp?ld*13oDLtkl@^xFWRM;-M2})=)Y=n`?=Em-LBPXgq$g3O{jqi$ZKw+ zu^9_(>v(A3U^R)-geU(I5vsNT4hpyxd5Z0tC?gR4X$HmemAQ{OzUgMG)dc06#W(bv z>MVb7#PbgSEeSCMGaz&_9E!f(?~q^Io=qQAp%xcqe#W4ye&ZA?1gA1JSr#+ud8YVR zSn;eIt_8!zZSjPKg}>|JSEN`g+xMl|P=^)QhTz;QoqtW(J4;hGX&+4Ruc;^*zMjqP zhbv=XX+~{j(aYbyL1?ul@@#@(VCIRBzy;lgc80AyJ4rqX@&q_g9Qj;q*G}0!OQ-VO zY%!SaM@4AhF6!eP-$4K_RjDZT>nMl>l8^m1E9~}UWN(<+cb;Bwx=2oKYHG?!2Ffuu zEIxP^l@!(NIyGzF3!(r%sJVlbRqX1X*JOW3jr6@M3E3pF>J4i}Dk2O^7b`zLI;85H z`LevMV`+NFq_Le|_x$E(2*;^X#nbe*9F|&jGmq}EU^+b8rM`?=jczz|j|lhU)|bXU9?#Odl} z-{~FCi#~s}*mmr*DFe;TGnY*YKPrj&QCS_IzN|~AGeeS8hUTf>WHcV(`K?yR>e;ra zlH~zjq1jsSH`aZv>3i)$EvVBZS6n;|U3c*DVz8qxru}vO*p)$8pSrp5aK9oZZ`|)f zSI08KnzYb@GudqF&&*e#*J9mwNhVp-DXGta)Auu9KSm@R(TJfm-C@`_)vHg`n z7n7$|Q(OF6k)K`<(d%zyo|1m#mY-~lt^l^=OS+M>Dg?b;&e#0CL8zkrDzaY-WU8NS zPMq$M`;a!upVKaEkEbi(`{x%I>hk!=5+z*{I-!|~xwnWml|w&g0lRLhE$w;AlH05L zF>*p_z;M!+)<8txdyafHiDd9Y7L`bw+@3kw>67#FhdWF;)yi*!C|1CLVR1i*dKiq< z#C(E`3xib+}8824rc)^3|CJ=V(3FM_YwDtv_%4DpfDr zBZuM*>&?FE@+5-dMd6E)1Ly{10nY(j00*4^wGHHhCXa6fq7C<4n$PTo@W~H2-B2YSzFWsSt+gfVlkVP|oPHyP;G>G`v)uzq1DB#!WGtck;d1Nw zWN@4Qei9ICV1s|b5MfoZaXD9)Lp7B+&m_2U?dVzJEFEtW{?e+NDzq$$_P->s0M`xl zLDT34<+FRp3GSs#WY*74i&B2T{STlbtcn!9#0ruFV3VgtNs}0+F^6Rt?n9;)?;8C7 zOMv#&Jb3|RL}QZr;$Ju?HZmti#ar_owj!K~w<;rpHtcJ>Yc10Tw-JHFPEHBv?R9Y?_ROJMznLPdEUkBD}PDhe@! z7?|L)iCd!lN~Df11*52L!g5q0+>UQ(B2o4NcNi#?Y-JvuLl`l?xdWlqXHNKbHWEvE zu{pm$TM?O!?ja>JiYHjL8%GdUr88F8)Re}XxCxZ*Z9mxweUox^e- zq+@_7{wl}2(x2zHVdl0#(Va$w&jO8)vOz#6i%YYm_tEs)#T_Lzyv2DkkkZpLcL=+}chlSgtx79Jge3qU3|EuZcoIFkOY8IQR5JSH z9bGPxy`R@95Pb%7uH<@IuY?=`JPCiQ6zxy-h6%hwAW~0e0?s_;cZsRbOW36)9D34$ z44MhG$I12ECxvD{j46Hcq{eK2RawrfLtu`nv1+uZoPYOy5vbS|!DmCVPXx^b%r}Z$ zxWD^QRO=p0P|_7&>z-N-Cz3c2L`)0F_B%r2yi}D`ccVTv1#bK~rY21Om9Hab1~gza znEK8s5cy*^TT!UGJk)aOGxML$O!$IoiAhiC^vzg<6)I@eCgFy$QI_9!^?Qvt<-ML9 z8&~t~Q2!jeDIJ*HjDQlMgZ}d|B%UT8BEhOJu;#;IU8aAXwd1l{lC);6=L9YQm24gk zrf;tyG8BVa7_18mcQtnHpOiirCgEeRB6y+_E1lAs*ZO8d2^Xz4kQR-s)m`8LTZo9p_CyN9uXPe&B1m_fF-xk-G_ z+lj3gw%m=_dj|cK1i}r)EW^f8}*Sq+*(e_u%0 zObwk%Wsd&6`5()Nn<;0g*swt2Q`#v{+DgVz=JRS3t86-f;0<~aZdbPAemNb1h75tu zJ=4J(e5;<+g+a=S=r3=CDrqCwn58yGUAZU9;2+nqG0q@6D`%q|$QD;J!icG#*Olx{ z=4A!+gx&ri(61OMlgz4oQY-~}D0-_Wb}}Hl!0D8^cQVE;VCj0!aQF|5KFQumI&h&n zw$?3o52bve08I+H6kY5K5oBM`VuN()gKH*D%Z3D*E7kH{K$;k|6To6XR(f#jWp84w z_MvA~^9Qr$FAp=OM;zZdekjD1+47p#e(fibCHX#)NRM31pjA69Z&aP-jwMx{gHd9@NE?6?kr(sOK$9v!o9!H*WSZB3>G37IudJE65f z(599pkBUBV^@3S1d4HT&4n=||E7wH|yMg9)X{YlOl_Al(;ich?Da1!|7Qy_81VnFE zFag&#C+#!i=mN76R}4$NAljqT2HdcL^5s_>>9oxTshJtwmHlp38&iC|vGhD3A)4;E zZkzm#4#WdT0s8~-;Afy(8ql_@|MUE@9r2}L?vlJbPV<(sfwEXTyxtPeN86R-eTLOK zjR%AHKe56YWX)6I7$--Thjv1bVkPM{E(X!Q)$nWKmhKPfm;@0%CbTxl;_MmO6e=J< z^4T^QnGo4RAYSW(CtAMb!z66QGS8Le?^^BGWjKhwY*Ng8>$;rXzIF=d4|wq$pfo>qJEcKG}-8`1cD|`2>vK}*^!idD=N%uq9e;H*h9dcBqrjk)Y zxkT7&>0vip^v54Vg71QFyYQ zn77)RxJooqv&zzGn2{4Z3tX%hLo|$YYCWbT5(!F)#NW;|nzXEYyr&kNvQ~er3Xk%y z8OmP&;XEd0=--J4!*J$rp9K`-bWQG+=f7mBeh*BuGV=TJA+vI+qu1;gx>t0?_Zfa& zl>feVPH_NZy93kqk-p4Z#pnq6(HYq2HA+1?9+%upy3>C=1@h4(UEclgUgfU+-P{ zk!g$ljV;o;pjPf@gY3^zIH&*Fe=l`tJayhxS_z6Fz|_y_t&(fSg`jIJb~*VNKi$AN6?8|?4s{`hG{98}*Iv?h6&=>CY{MZ#_*?l@{9$as$vgctUBFYU+{QvI_44^3oxrXH&`rIE6z{I)x zE+Z3hBR1jVvkS*=9b&yxwgjlKP#P(N6LPn}e=1#8M{l}SjcJlt450p+< zgLxH#c^R;9o;B`;FF4{7DJ2RztR6UUwp*lquIwv}dbE+q9ZQkZ|40sHQgZu@g*{8>%xDfndZr`+7}$#5|Cb+{${|J=&V{gKKm@rP^S6GiQk@0EP_UA zFmCxc*yvRtIuJ}OO*1YEv-EAtjM!xIzSmYAfFaZ!X&%U6g-vzeJ7uKp-SJZ`^5)CecaGDa*lf2k0%=|`ck!bY`@Icj_KmyxsNdn5lR&qFxu^){293F3k`kCHOaje}|1CZ|7dfN?azaea3 z4+=u;E%dQUiCjhdpu81RZhnap|jZ7&;5fh2-q@dbiqTm^5s!GWYxx%x#1tEhDoJ<;=5dizA`m-vbj2Cxt9^uT>JZ zh>?(%yVqH@J(47@FiD+p-Zs z>@MA2yh7MQ4pR#IwOLtNhf)DR`uwy)4|%*T_3+>9M-X(^+jBUO7v>3MXZBdQSei48 zymbou9avf_vtt>t3aP2?ObUohJ&iUzm4yYcVj^~xt=fHTTNci-NAq8gxI%rxBLw?q z?#X4Gj5PEf$uBp#kVJTHArL*GKH(GA^MCGcAPU2zNPhgWpI@8D0+qtTZY2MaBZX3L zsq|rJwYn;|KO=5g;%8P?>Ii>X_l0-LOgC*meqRyFw%%i@Qg*iN)d+*S3!)amBf2ze ztzPu2{v)iYMS$8y&IgY(x{JNH%pTjVOZ&!8T)u!j4zzixB*&`qw9;5m-`0X|4y6Kj z^psSXhP3|CiLZhrkJ*=|Bscb)7Rbc4>@6=ZgB3Kv%Jv)7C0|7K7TaY`&u}@-XNn{Anrsk zRjdFiRO?F_qu^cLo$P!QbhHfo*6xi^SZa*(=X59{zFl~=SXFv=j_8WuGS<{_3}jWC z)zfhw13U3l55tammg@AB(_Ku>vtwQy_uaKzB-Njz($?+gsByN;fW1(z706Y>d@8Gg z``&D&ykxOFM92Oi%^Y-_U`7@gu{^ic^pyBPCX&i{JD2J5=T|l5!XJBxb`++2Y3Y_5 z>!l`!TmRVKV4h^1x1HoyT&9w*e&hAv~jScHAg z?XR=m{1^M8?-oPFoCB8ku74jP>nxk$ohL9Fu41`Yyain26_Vfy;r1Dl{*bbxBy#LY zO`z1fW1%k2@8_lgO}yRB!QkOR<$p8vy?Q kP7~t4)yRnQS3AFV2|6I1UrisuHgW(!4FmOtXAUv{2LxfR9smFU literal 0 HcmV?d00001