From 162f301be97a5968f8c915329396eb1d2a96d05f Mon Sep 17 00:00:00 2001 From: NaamloosDT Date: Fri, 1 Jun 2018 13:37:15 +0200 Subject: [PATCH] Art radio buttons, full disable addon via settings --- foobar2000/foo_mediacontrol/Discord.h | 301 +++++++++++--------- foobar2000/foo_mediacontrol/Preferences.cpp | 58 +++- foobar2000/foo_mediacontrol/Preferences.h | 16 +- foobar2000/foo_mediacontrol/foo_discord.rc | Bin 6212 -> 7626 bytes foobar2000/foo_mediacontrol/main.cpp | 2 +- foobar2000/foo_mediacontrol/resource.h | Bin 1644 -> 2380 bytes 6 files changed, 241 insertions(+), 136 deletions(-) diff --git a/foobar2000/foo_mediacontrol/Discord.h b/foobar2000/foo_mediacontrol/Discord.h index 6b17a54..d7f4ac2 100644 --- a/foobar2000/foo_mediacontrol/Discord.h +++ b/foobar2000/foo_mediacontrol/Discord.h @@ -31,166 +31,201 @@ static double start_epoch; static double pause_epoch; static double savedlength; -void UpdatePresence(wchar_t *songname, wchar_t *artist, double tracklength, wchar_t *filename, wchar_t *album) -{ - savedsongname = util::wide_to_utf8(songname); - savedartist = util::wide_to_utf8(artist); - savedalbum = util::wide_to_utf8(album); +const char* GetArtType() { + int arttype = preferences::get_art_type(); - if (strlen(savedsongname) < 1) { - savedsongname = util::wide_to_utf8(filename); + if (arttype == 1) { + return "foobar"; + } + else if (arttype == 2) { + return "note"; } - if (strlen(savedartist) < 1) { - savedartist = ""; + else if (arttype == 3) { + return "saiko"; } - savedlength = tracklength; - std::time_t result = std::time(nullptr); - start_epoch = result; - - DiscordRichPresence discordPresence; - memset(&discordPresence, 0, sizeof(discordPresence)); - discordPresence.details = savedsongname; - if (preferences::get_show_image()) { - discordPresence.largeImageKey = "foobar"; + else if (arttype == 4) { + return "kirb"; } - discordPresence.smallImageKey = "play"; - discordPresence.smallImageText = "Playing"; - discordPresence.largeImageText = "Foobar2000"; - if (preferences::get_show_album() && strlen(savedalbum) > 0) { - std::stringstream ss; - ss << savedartist << " [" << savedalbum << "]"; - discordPresence.state = ss.str().c_str(); + else if (arttype == 5) { + return "think"; } - else { - discordPresence.state = savedartist; + else if (arttype == 6) { + return "anime"; } - discordPresence.instance = 1; - discordPresence.startTimestamp = result; - discordPresence.endTimestamp = result + tracklength; - Discord_UpdatePresence(&discordPresence); + + return "foobar"; } -void UpdatePresenceSeeked(double seek) { - std::time_t result = std::time(nullptr); +void UpdatePresence(wchar_t *songname, wchar_t *artist, double tracklength, wchar_t *filename, wchar_t *album) +{ + if (preferences::get_enabled()) { + savedsongname = util::wide_to_utf8(songname); + savedartist = util::wide_to_utf8(artist); + savedalbum = util::wide_to_utf8(album); - DiscordRichPresence discordPresence; - memset(&discordPresence, 0, sizeof(discordPresence)); - discordPresence.details = savedsongname; - if (preferences::get_show_image()) { - discordPresence.largeImageKey = "foobar"; - } - discordPresence.smallImageKey = "play"; - discordPresence.smallImageText = "Playing"; - discordPresence.largeImageText = "Foobar2000"; - if (preferences::get_show_album() && strlen(savedalbum) > 0) { - std::stringstream ss; - ss << savedartist << " [" << savedalbum << "]"; - discordPresence.state = ss.str().c_str(); + if (strlen(savedsongname) < 1) { + savedsongname = util::wide_to_utf8(filename); + } + if (strlen(savedartist) < 1) { + savedartist = ""; + } + savedlength = tracklength; + std::time_t result = std::time(nullptr); + start_epoch = result; + + DiscordRichPresence discordPresence; + memset(&discordPresence, 0, sizeof(discordPresence)); + discordPresence.details = savedsongname; + if (preferences::get_show_image()) { + discordPresence.largeImageKey = GetArtType(); + } + discordPresence.smallImageKey = "play"; + discordPresence.smallImageText = "Playing"; + discordPresence.largeImageText = "Foobar2000"; + if (preferences::get_show_album() && strlen(savedalbum) > 0) { + std::stringstream ss; + ss << savedartist << " [" << savedalbum << "]"; + discordPresence.state = ss.str().c_str(); + } + else { + discordPresence.state = savedartist; + } + discordPresence.instance = 1; + discordPresence.startTimestamp = result; + discordPresence.endTimestamp = result + tracklength; + Discord_UpdatePresence(&discordPresence); } - else { - discordPresence.state = savedartist; +} + +void UpdatePresenceSeeked(double seek) { + if (preferences::get_enabled()) { + std::time_t result = std::time(nullptr); + + DiscordRichPresence discordPresence; + memset(&discordPresence, 0, sizeof(discordPresence)); + discordPresence.details = savedsongname; + if (preferences::get_show_image()) { + discordPresence.largeImageKey = GetArtType(); + } + discordPresence.smallImageKey = "play"; + discordPresence.smallImageText = "Playing"; + discordPresence.largeImageText = "Foobar2000"; + if (preferences::get_show_album() && strlen(savedalbum) > 0) { + std::stringstream ss; + ss << savedartist << " [" << savedalbum << "]"; + discordPresence.state = ss.str().c_str(); + } + else { + discordPresence.state = savedartist; + } + discordPresence.instance = 1; + discordPresence.startTimestamp = result; + discordPresence.endTimestamp = result + (savedlength - seek); + Discord_UpdatePresence(&discordPresence); } - discordPresence.instance = 1; - discordPresence.startTimestamp = result; - discordPresence.endTimestamp = result + (savedlength - seek); - Discord_UpdatePresence(&discordPresence); } void UpdatePresenceResumed() { - std::time_t result = std::time(nullptr); - double played = pause_epoch - start_epoch; - - DiscordRichPresence discordPresence; - memset(&discordPresence, 0, sizeof(discordPresence)); - discordPresence.details = savedsongname; - if (preferences::get_show_image()) { - discordPresence.largeImageKey = "foobar"; - } - discordPresence.smallImageKey = "play"; - discordPresence.smallImageText = "Playing"; - discordPresence.largeImageText = "Foobar2000"; - if (preferences::get_show_album() && strlen(savedalbum) > 0) { - std::stringstream ss; - ss << savedartist << " [" << savedalbum << "]"; - discordPresence.state = ss.str().c_str(); - } - else { - discordPresence.state = savedartist; + if (preferences::get_enabled()) { + std::time_t result = std::time(nullptr); + double played = pause_epoch - start_epoch; + + DiscordRichPresence discordPresence; + memset(&discordPresence, 0, sizeof(discordPresence)); + discordPresence.details = savedsongname; + if (preferences::get_show_image()) { + discordPresence.largeImageKey = GetArtType(); + } + discordPresence.smallImageKey = "play"; + discordPresence.smallImageText = "Playing"; + discordPresence.largeImageText = "Foobar2000"; + if (preferences::get_show_album() && strlen(savedalbum) > 0) { + std::stringstream ss; + ss << savedartist << " [" << savedalbum << "]"; + discordPresence.state = ss.str().c_str(); + } + else { + discordPresence.state = savedartist; + } + discordPresence.instance = 1; + discordPresence.startTimestamp = result; + discordPresence.endTimestamp = result + (savedlength - played); + Discord_UpdatePresence(&discordPresence); } - discordPresence.instance = 1; - discordPresence.startTimestamp = result; - discordPresence.endTimestamp = result + (savedlength - played); - Discord_UpdatePresence(&discordPresence); } void UpdatePresencePaused() { - pause_epoch = std::time(nullptr); - char buffer[256]; - sprintf_s(buffer, 256, "%s (Paused)", savedsongname); - DiscordRichPresence discordPresence; - memset(&discordPresence, 0, sizeof(discordPresence)); - discordPresence.details = buffer; - if (preferences::get_show_image()) { - discordPresence.largeImageKey = "foobar"; - } - discordPresence.smallImageKey = "pause"; - discordPresence.smallImageText = "Paused"; - discordPresence.largeImageText = "Foobar2000"; - if (preferences::get_show_album() && strlen(savedalbum) > 0) { - std::stringstream ss; - ss << savedartist << " [" << savedalbum << "]"; - discordPresence.state = ss.str().c_str(); - } - else { - discordPresence.state = savedartist; + if (preferences::get_enabled()) { + pause_epoch = std::time(nullptr); + char buffer[256]; + sprintf_s(buffer, 256, "%s (Paused)", savedsongname); + DiscordRichPresence discordPresence; + memset(&discordPresence, 0, sizeof(discordPresence)); + discordPresence.details = buffer; + if (preferences::get_show_image()) { + discordPresence.largeImageKey = GetArtType(); + } + discordPresence.smallImageKey = "pause"; + discordPresence.smallImageText = "Paused"; + discordPresence.largeImageText = "Foobar2000"; + if (preferences::get_show_album() && strlen(savedalbum) > 0) { + std::stringstream ss; + ss << savedartist << " [" << savedalbum << "]"; + discordPresence.state = ss.str().c_str(); + } + else { + discordPresence.state = savedartist; + } + discordPresence.instance = 1; + Discord_UpdatePresence(&discordPresence); } - discordPresence.instance = 1; - Discord_UpdatePresence(&discordPresence); } void UpdatePresenceStopped() { - if (preferences::get_show_stop()) { - if (preferences::get_show_songstop() == false) { - char buffer[256]; - DiscordRichPresence discordPresence; - memset(&discordPresence, 0, sizeof(discordPresence)); - if (preferences::get_show_image()) { - discordPresence.largeImageKey = "foobar"; - } - discordPresence.smallImageKey = "stop"; - discordPresence.smallImageText = "Stopped"; - discordPresence.largeImageText = "Foobar2000"; - discordPresence.details = "Stopped"; - discordPresence.instance = 1; - Discord_UpdatePresence(&discordPresence); - } - else { - char buffer[256]; - sprintf_s(buffer, 256, "%s (Stopped)", savedsongname); - DiscordRichPresence discordPresence; - memset(&discordPresence, 0, sizeof(discordPresence)); - discordPresence.details = buffer; - if (preferences::get_show_image()) { - discordPresence.largeImageKey = "foobar"; - } - discordPresence.smallImageKey = "stop"; - discordPresence.smallImageText = "Stopped"; - discordPresence.largeImageText = "Foobar2000"; - if (preferences::get_show_album() && strlen(savedalbum) > 0) { - std::stringstream ss; - ss << savedartist << " [" << savedalbum << "]"; - discordPresence.state = ss.str().c_str(); + if (preferences::get_enabled()) { + if (preferences::get_show_stop()) { + if (preferences::get_show_songstop() == false) { + char buffer[256]; + DiscordRichPresence discordPresence; + memset(&discordPresence, 0, sizeof(discordPresence)); + if (preferences::get_show_image()) { + discordPresence.largeImageKey = GetArtType(); + } + discordPresence.smallImageKey = "stop"; + discordPresence.smallImageText = "Stopped"; + discordPresence.largeImageText = "Foobar2000"; + discordPresence.details = "Stopped"; + discordPresence.instance = 1; + Discord_UpdatePresence(&discordPresence); } else { - discordPresence.state = savedartist; + char buffer[256]; + sprintf_s(buffer, 256, "%s (Stopped)", savedsongname); + DiscordRichPresence discordPresence; + memset(&discordPresence, 0, sizeof(discordPresence)); + discordPresence.details = buffer; + if (preferences::get_show_image()) { + discordPresence.largeImageKey = GetArtType(); + } + discordPresence.smallImageKey = "stop"; + discordPresence.smallImageText = "Stopped"; + discordPresence.largeImageText = "Foobar2000"; + if (preferences::get_show_album() && strlen(savedalbum) > 0) { + std::stringstream ss; + ss << savedartist << " [" << savedalbum << "]"; + discordPresence.state = ss.str().c_str(); + } + else { + discordPresence.state = savedartist; + } + discordPresence.instance = 1; + Discord_UpdatePresence(&discordPresence); } - discordPresence.instance = 1; - Discord_UpdatePresence(&discordPresence); } - } - else { - Discord_ClearPresence(); + else { + Discord_ClearPresence(); + } } } \ No newline at end of file diff --git a/foobar2000/foo_mediacontrol/Preferences.cpp b/foobar2000/foo_mediacontrol/Preferences.cpp index 3e5e00f..2c62870 100644 --- a/foobar2000/foo_mediacontrol/Preferences.cpp +++ b/foobar2000/foo_mediacontrol/Preferences.cpp @@ -6,6 +6,8 @@ const GUID preferences::guid_show_image = { 0x7d8a2294, 0x36d0, 0x4ee9,{ 0xaa, 0 const GUID preferences::guid_show_stop = { 0x7d8a2294, 0x36d0, 0x4ee9,{ 0xaa, 0x71, 0x36, 0x70, 0x5f, 0x0f, 0x43, 0x69 } }; const GUID preferences::guid_show_songstop = { 0x7d8a2294, 0x36d0, 0x4ee9,{ 0xaa, 0x71, 0x36, 0x70, 0x5f, 0x0f, 0x43, 0x68 } }; const GUID preferences::guid_show_album = { 0x7d8a2294, 0x36d0, 0x4ee9,{ 0xaa, 0x71, 0x36, 0x70, 0x69, 0x0f, 0x43, 0x53 } }; +const GUID preferences::guid_art_type = { 0x7d8a2294, 0x36d0, 0x4ee9,{ 0xaa, 0x55, 0x36, 0x70, 0x69, 0x0f, 0x43, 0x53 } }; +const GUID preferences::guid_enabled = { 0x7d8a2294, 0x36d0, 0x4ee9,{ 0xff, 0x52, 0x36, 0x70, 0x69, 0x69, 0x69, 0x00 } }; const GUID preferences::guid_advconfig_branch = { 0x1260bbfa, 0x0806, 0x434e,{ 0x91, 0x7c, 0xc8, 0x91, 0x89, 0xd3, 0x9c, 0x88 } }; @@ -13,6 +15,8 @@ cfg_bool preferences::show_image(guid_show_image, true); cfg_bool preferences::show_stop(guid_show_stop, true); cfg_bool preferences::show_songstop(guid_show_songstop, false); cfg_bool preferences::show_album(guid_show_album, false); +cfg_bool preferences::enabled(guid_enabled, true); +cfg_int preferences::art_type(guid_art_type, 1); advconfig_branch_factory preferences::g_advconfig_branch(PREFERENCES_SECTION_NAME, guid_advconfig_branch, advconfig_branch::guid_branch_tools, 0); BOOL preferences::on_init(CWindow, LPARAM) { @@ -20,6 +24,14 @@ BOOL preferences::on_init(CWindow, LPARAM) { uButton_SetCheck(this->m_hWnd, IDC_SHOWSTOP, show_stop); uButton_SetCheck(this->m_hWnd, IDC_SHOWSONGSTOP, show_songstop); uButton_SetCheck(this->m_hWnd, IDC_SHOWALBUM, show_album); + uButton_SetCheck(this->m_hWnd, IDC_CHECK7, enabled); + + uButton_SetCheck(this->m_hWnd, IDC_CHECK1, art_type == 1); + uButton_SetCheck(this->m_hWnd, IDC_CHECK2, art_type == 2); + uButton_SetCheck(this->m_hWnd, IDC_CHECK3, art_type == 3); + uButton_SetCheck(this->m_hWnd, IDC_CHECK4, art_type == 4); + uButton_SetCheck(this->m_hWnd, IDC_CHECK5, art_type == 5); + uButton_SetCheck(this->m_hWnd, IDC_CHECK6, art_type == 6); return FALSE; } @@ -46,6 +58,28 @@ t_uint32 preferences::get_state() { if (uButton_GetCheck(this->m_hWnd, IDC_SHOWALBUM) != show_album) { state |= preferences_state::changed; } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK7) != enabled) { + state |= preferences_state::changed; + } + + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK1) != art_type == 1) { + state |= preferences_state::changed; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK2) != art_type == 2) { + state |= preferences_state::changed; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK3) != art_type == 3) { + state |= preferences_state::changed; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK4) != art_type == 4) { + state |= preferences_state::changed; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK5) != art_type == 5) { + state |= preferences_state::changed; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK6) != art_type == 6) { + state |= preferences_state::changed; + } return state; } @@ -55,6 +89,26 @@ void preferences::apply() { show_stop = uButton_GetCheck(this->m_hWnd, IDC_SHOWSTOP); show_songstop = uButton_GetCheck(this->m_hWnd, IDC_SHOWSONGSTOP); show_album = uButton_GetCheck(this->m_hWnd, IDC_SHOWALBUM); + enabled = uButton_GetCheck(this->m_hWnd, IDC_CHECK7); + + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK1)) { + art_type = 1; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK2)) { + art_type = 2; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK3)) { + art_type = 3; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK4)) { + art_type = 4; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK5)) { + art_type = 5; + } + if (uButton_GetCheck(this->m_hWnd, IDC_CHECK6)) { + art_type = 6; + } on_changed(); } @@ -64,6 +118,8 @@ void preferences::reset() { show_stop = true; show_songstop = false; show_album = false; + enabled = true; + art_type = 1; on_changed(); } @@ -92,4 +148,4 @@ LRESULT preferences::OnBnClickedButton3(WORD /*wNotifyCode*/, WORD /*wID*/, HWND // TODO: Add your control notification handler code here ShellExecute(0, 0, L"https://ko-fi.com/naamloos", 0, 0, SW_SHOW); return 0; -} +} \ No newline at end of file diff --git a/foobar2000/foo_mediacontrol/Preferences.h b/foobar2000/foo_mediacontrol/Preferences.h index 5708701..652538b 100644 --- a/foobar2000/foo_mediacontrol/Preferences.h +++ b/foobar2000/foo_mediacontrol/Preferences.h @@ -16,6 +16,15 @@ class preferences : public CDialogImpl, public preferences_page_ins COMMAND_HANDLER_EX(IDC_SHOWSTOP, BN_CLICKED, on_edit) COMMAND_HANDLER_EX(IDC_SHOWSONGSTOP, BN_CLICKED, on_edit) COMMAND_HANDLER_EX(IDC_SHOWALBUM, BN_CLICKED, on_edit) + COMMAND_HANDLER_EX(IDC_CHECK7, BN_CLICKED, on_edit) + + COMMAND_HANDLER_EX(IDC_CHECK1, BN_CLICKED, on_edit) + COMMAND_HANDLER_EX(IDC_CHECK2, BN_CLICKED, on_edit) + COMMAND_HANDLER_EX(IDC_CHECK3, BN_CLICKED, on_edit) + COMMAND_HANDLER_EX(IDC_CHECK4, BN_CLICKED, on_edit) + COMMAND_HANDLER_EX(IDC_CHECK5, BN_CLICKED, on_edit) + COMMAND_HANDLER_EX(IDC_CHECK6, BN_CLICKED, on_edit) + COMMAND_HANDLER(IDC_BUTTON1, BN_CLICKED, OnBnClickedButton1) COMMAND_HANDLER(IDC_BUTTON2, BN_CLICKED, OnBnClickedButton2) COMMAND_HANDLER(IDC_BUTTON3, BN_CLICKED, OnBnClickedButton3) @@ -29,6 +38,8 @@ class preferences : public CDialogImpl, public preferences_page_ins inline static bool get_show_stop() { return show_stop; } inline static bool get_show_songstop() { return show_songstop; } inline static bool get_show_album() { return show_album; } + inline static int get_art_type() { return art_type; } + inline static bool get_enabled() { return enabled; } private: BOOL on_init(CWindow, LPARAM); @@ -41,16 +52,19 @@ class preferences : public CDialogImpl, public preferences_page_ins static const GUID guid_show_stop; static const GUID guid_show_songstop; static const GUID guid_show_album; + static const GUID guid_art_type; static const GUID guid_advconfig_branch; + static const GUID guid_enabled; static cfg_bool show_image; static cfg_bool show_stop; static cfg_bool show_songstop; static cfg_bool show_album; + static cfg_int art_type; + static cfg_bool enabled; static advconfig_branch_factory g_advconfig_branch; public: - LRESULT OnNMClickSyslink1(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/); LRESULT OnBnClickedButton1(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnBnClickedButton2(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnBnClickedButton3(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); diff --git a/foobar2000/foo_mediacontrol/foo_discord.rc b/foobar2000/foo_mediacontrol/foo_discord.rc index 20f5a089331dd90d25a87492f56486a1022e42e1..1f9f35eaa1c64aa72bdf98be6e099f26b63f894d 100644 GIT binary patch delta 680 zcma))%Syvg5QhJPUDaqM6mgX%Qa2WCnxtuUV{HqT))pj!JBjyVy-?#q`U-C3yn+v) zWa(Bn`YgVK|A}2D5{8q6B=gO8X3j_DYwPtX7rx}yvKc%4&QCK-Mf^n{9y&OLC*J0l zH3NOz;)1IP9}@(;2YAFC&aeqXO!F(Mi3-Ya7-iUSd94e5VWZUMKj+MPz?eA(-*?eQ z3rAeLtkFUbrg&FY3;SsDOBX}z;DGf#J`Kc=qA4b`YK$^0G=!-*>wDzgV}ui$4CocG zN<6!og6&3ZhaRTlYCgGFWXAKX6ukP()sn7SkGu(v6L@wCUL)dF*-`Rz50@m~&@tZ7 z`JcEbyD6t7CuJdW)SKjuaGlu2S}LYFV>;5a)FIR7zQ?4VCb+uf4h!5F&y1Y0JVQ3^ OXegf5&u~uN&i(>(4tMwf delta 56 zcmX?QeZ*ix54X4iLk)uhLpVb)Lp*~MgFizMgA0QzL(t}KZgo~hgUy=-su`JG8T=*- Ma_!#SCE>sd0FrzT3;+NC diff --git a/foobar2000/foo_mediacontrol/main.cpp b/foobar2000/foo_mediacontrol/main.cpp index eac634f..3db96a6 100644 --- a/foobar2000/foo_mediacontrol/main.cpp +++ b/foobar2000/foo_mediacontrol/main.cpp @@ -1,4 +1,4 @@ #include "stdafx.h" -DECLARE_COMPONENT_VERSION("Discord Rich Presences","1.4","Adds the ability for foobar2000 to interact with Discord."); +DECLARE_COMPONENT_VERSION("Discord Rich Presences","1.7","Adds the ability for foobar2000 to interact with Discord."); VALIDATE_COMPONENT_FILENAME("foo_discord.dll"); diff --git a/foobar2000/foo_mediacontrol/resource.h b/foobar2000/foo_mediacontrol/resource.h index 0b766117f9f18ece98571581ebd6c34528c678f0..76fb2fb3614d7968426a7b319d10aad86ac5240c 100644 GIT binary patch delta 278 zcmaFEb4F+b2g~GXtOAoiFmiA^Gk7q#GB`7MGZ;?3$gDltfsKRFa`Hr0Q8Za2s4N?^ z5rY9to)fNn@_A-mpk6jcqsfM>;%ItJkn|eC^di}8iX?B0Mcxca-UKcm#Nf!_!r;l^ q4|h4p_K8gLNG6*j=``ES%%aZ-Qo^b`If1nc=n-=uTXV7)TNnT{xj^oC~x2g~LcY+8(y3pn&9J8*O{8#0(oF67Xh{EZ_F0Ji4}fdBvi