From 665685a5a633cd5fc27752a84c96ea2834772ab0 Mon Sep 17 00:00:00 2001 From: GenericMale Date: Fri, 29 Apr 2022 16:22:55 +0200 Subject: [PATCH] Initial commit --- .gitignore | 8 + README.md | 34 +- screenshot.png | Bin 0 -> 69838 bytes src/com.genericmale.sonos.sdPlugin/de.json | 85 + src/com.genericmale.sonos.sdPlugin/en.json | 85 + .../images/changesource_action.png | Bin 0 -> 1679 bytes .../images/changesource_action@2x.png | Bin 0 -> 3097 bytes .../images/changesource_key.png | Bin 0 -> 5110 bytes .../images/changesource_key@2x.png | Bin 0 -> 8397 bytes .../images/mute_action.png | Bin 0 -> 1452 bytes .../images/mute_action@2x.png | Bin 0 -> 3660 bytes .../images/muted_key.png | Bin 0 -> 5831 bytes .../images/muted_key@2x.png | Bin 0 -> 12140 bytes .../images/next_action.png | Bin 0 -> 864 bytes .../images/next_action@2x.png | Bin 0 -> 1399 bytes .../images/next_key.png | Bin 0 -> 2640 bytes .../images/next_key@2x.png | Bin 0 -> 5135 bytes .../images/paused_key.png | Bin 0 -> 2659 bytes .../images/paused_key@2x.png | Bin 0 -> 5600 bytes .../images/playfavorites_action.png | Bin 0 -> 851 bytes .../images/playfavorites_action@2x.png | Bin 0 -> 1311 bytes .../images/playfavorites_key.png | Bin 0 -> 2798 bytes .../images/playfavorites_key@2x.png | Bin 0 -> 4364 bytes .../images/playing_key.png | Bin 0 -> 4134 bytes .../images/playing_key@2x.png | Bin 0 -> 8442 bytes .../images/playpause_action.png | Bin 0 -> 791 bytes .../images/playpause_action@2x.png | Bin 0 -> 1457 bytes .../images/playuri_action.png | Bin 0 -> 1073 bytes .../images/playuri_action@2x.png | Bin 0 -> 1835 bytes .../images/playuri_key.png | Bin 0 -> 3079 bytes .../images/playuri_key@2x.png | Bin 0 -> 5119 bytes .../images/plugin_category.png | Bin 0 -> 1778 bytes .../images/plugin_category@2x.png | Bin 0 -> 3432 bytes .../images/plugin_icon.png | Bin 0 -> 9500 bytes .../images/plugin_icon@2x.png | Bin 0 -> 13000 bytes .../images/previous_action.png | Bin 0 -> 859 bytes .../images/previous_action@2x.png | Bin 0 -> 1417 bytes .../images/previous_key.png | Bin 0 -> 2654 bytes .../images/previous_key@2x.png | Bin 0 -> 5102 bytes .../images/repeat_action.png | Bin 0 -> 1206 bytes .../images/repeat_action@2x.png | Bin 0 -> 1810 bytes .../images/repeat_all_key.png | Bin 0 -> 3946 bytes .../images/repeat_all_key@2x.png | Bin 0 -> 7275 bytes .../images/repeat_none_key.png | Bin 0 -> 2966 bytes .../images/repeat_none_key@2x.png | Bin 0 -> 4948 bytes .../images/repeat_one_key.png | Bin 0 -> 4324 bytes .../images/repeat_one_key@2x.png | Bin 0 -> 7934 bytes .../images/shuffle_action.png | Bin 0 -> 1308 bytes .../images/shuffle_action@2x.png | Bin 0 -> 2468 bytes .../images/shuffle_off_key.png | Bin 0 -> 4000 bytes .../images/shuffle_off_key@2x.png | Bin 0 -> 8262 bytes .../images/shuffle_on_key.png | Bin 0 -> 4917 bytes .../images/shuffle_on_key@2x.png | Bin 0 -> 8976 bytes .../images/unmuted_key.png | Bin 0 -> 4644 bytes .../images/unmuted_key@2x.png | Bin 0 -> 9353 bytes .../images/volume_action.png | Bin 0 -> 1285 bytes .../images/volume_action@2x.png | Bin 0 -> 2844 bytes .../images/volume_key.png | Bin 0 -> 4644 bytes .../images/volume_key@2x.png | Bin 0 -> 9353 bytes .../images/volumedown_action.png | Bin 0 -> 1036 bytes .../images/volumedown_action@2x.png | Bin 0 -> 1816 bytes .../images/volumedown_key.png | Bin 0 -> 3080 bytes .../images/volumedown_key@2x.png | Bin 0 -> 5069 bytes .../images/volumeup_action.png | Bin 0 -> 1285 bytes .../images/volumeup_action@2x.png | Bin 0 -> 2844 bytes .../images/volumeup_key.png | Bin 0 -> 4644 bytes .../images/volumeup_key@2x.png | Bin 0 -> 9353 bytes .../manifest.json | 192 ++ .../pi/css/caret.svg | 3 + .../pi/css/check.png | Bin 0 -> 234 bytes .../pi/css/check.svg | 3 + .../pi/css/elg_calendar.svg | 24 + .../pi/css/elg_calendar_inv.svg | 7 + .../pi/css/rcheck.svg | 3 + .../pi/css/sdpi.css | 1631 +++++++++++++++++ .../pi/form-utils.js | 208 +++ .../pi/index.html | 168 ++ .../pi/index.js | 76 + .../plugin/actions/changesource.js | 14 + .../plugin/actions/mute.js | 12 + .../plugin/actions/next.js | 5 + .../plugin/actions/playfavorites.js | 24 + .../plugin/actions/playpause.js | 81 + .../plugin/actions/playuri.js | 12 + .../plugin/actions/previous.js | 5 + .../plugin/actions/repeat.js | 22 + .../plugin/actions/shuffle.js | 16 + .../plugin/actions/volume.js | 5 + .../plugin/actions/volumedown.js | 6 + .../plugin/actions/volumeup.js | 6 + .../plugin/index.html | 20 + .../plugin/index.js | 106 ++ src/com.genericmale.sonos.sdPlugin/sonos.js | 318 ++++ .../stream-deck.js | 529 ++++++ 94 files changed, 3706 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 screenshot.png create mode 100644 src/com.genericmale.sonos.sdPlugin/de.json create mode 100644 src/com.genericmale.sonos.sdPlugin/en.json create mode 100644 src/com.genericmale.sonos.sdPlugin/images/changesource_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/changesource_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/changesource_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/changesource_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/mute_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/mute_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/muted_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/muted_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/next_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/next_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/next_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/next_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/paused_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/paused_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playfavorites_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playfavorites_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playfavorites_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playfavorites_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playing_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playing_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playpause_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playpause_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playuri_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playuri_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playuri_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/playuri_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/plugin_category.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/plugin_category@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/plugin_icon.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/plugin_icon@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/previous_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/previous_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/previous_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/previous_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/repeat_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/repeat_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/repeat_all_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/repeat_all_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/repeat_none_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/repeat_none_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/repeat_one_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/repeat_one_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/shuffle_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/shuffle_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/shuffle_off_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/shuffle_off_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/shuffle_on_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/shuffle_on_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/unmuted_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/unmuted_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volume_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volume_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volume_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volume_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volumedown_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volumedown_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volumedown_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volumedown_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volumeup_action.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volumeup_action@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volumeup_key.png create mode 100644 src/com.genericmale.sonos.sdPlugin/images/volumeup_key@2x.png create mode 100644 src/com.genericmale.sonos.sdPlugin/manifest.json create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/css/caret.svg create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/css/check.png create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/css/check.svg create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/css/elg_calendar.svg create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/css/elg_calendar_inv.svg create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/css/rcheck.svg create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/css/sdpi.css create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/form-utils.js create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/index.html create mode 100644 src/com.genericmale.sonos.sdPlugin/pi/index.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/changesource.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/mute.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/next.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/playfavorites.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/playpause.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/playuri.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/previous.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/repeat.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/shuffle.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/volume.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/volumedown.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/actions/volumeup.js create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/index.html create mode 100644 src/com.genericmale.sonos.sdPlugin/plugin/index.js create mode 100644 src/com.genericmale.sonos.sdPlugin/sonos.js create mode 100644 src/com.genericmale.sonos.sdPlugin/stream-deck.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87b1dab --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +.idea +*.iml +.vscode/** + +DistributionTool +DistributionTool.exe +release \ No newline at end of file diff --git a/README.md b/README.md index ff10594..dc172c5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ -# streamdeck-sonos -Elgato Stream Deck Sonos Plugin +# Sonos Plugin for Elgato Stream Deck +Plugin which allows to control `Sonos` speakers and get live feedback. + +![](screenshot.png) + +# Features +- Code written in JavaScript +- Cross-platform (macOS, Windows) +- Play / Pause with Live Feedback (Album Cover, Artist, Title, Time) +- Previous & Next Track +- Change Input Source (Line In, TV, Queue) +- Play URL from Spotify, TuneIn, Tidal, Deezer and Apple Music +- Play Sonos Favorites +- Change Repeat & Shuffle Mode +- Change Volume + +# Limitations + +The plugin is written in JavaScript which makes it Cross-Platform compatible and can be trusted to not perform anything dangerous. + +However, this also comes with some limitations: +- Speaker Auto Discovery cannot be performed. +The IP address of the speaker to control has to be entered manually but the IP can be easily retrieved from the Sonos App. +- Writing to Files not possible. +- Accessing the clipboard not possible. +- Can't listen to Push Notifications. +The plugin has to poll for status changes. + +# Installation +Download the plugin from the [Releases](https://github.com/GenericMale/streamdeck-sonos/releases/) section. + +If you double-click the `com.genericmale.sonos.streamDeckPlugin` file on your machine, Stream Deck will install the plugin. diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..193f88cf17720d77242ac26f8d76a5dd573461eb GIT binary patch literal 69838 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/de.json b/src/com.genericmale.sonos.sdPlugin/de.json new file mode 100644 index 0000000..c609483 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/de.json @@ -0,0 +1,85 @@ +{ + "Description": "Steuere deine Sonos Lautsprecher.", + "Name": "Sonos", + "Category": "Sonos", + "Localization": { + "Speaker IP": "Lautsprecher IP", + "Obtaining Speaker IP Address": "Lautsprecher IP feststellen", + "Sonos Desktop App": "Sonos Desktop App", + "Help -> About My Sonos System...": "Hilfe -> Über mein Sonos System...", + "Sonos Mobile App": "Sonos Handy App", + "Settings -> System -> About My System": "Einstellungen -> System -> Über mein System", + "Refresh Interval": "Intervall", + "Volume": "Lautstärke", + "Volume Increase": "Lautstärke Erhöhen", + "Volume Decrease": "Lautstärke Verringern", + "URL": "URL", + "Source": "Quelle", + "TV": "TV", + "Line In": "Line In", + "Sonos Queue": "Sonos Warteschlange", + "Favorite": "Favorit", + "Album Art": "Album", + "Display on key": "Auf Taste zeigen", + "Play": "Abspielen", + "Top Text": "Text Oben", + "Middle Text": "Text Mitte", + "Bottom Text": "Text Unten", + "None": "Nichts", + "Artist": "Künstler", + "Title": "Titel", + "Duration": "Dauer", + "Elapsed": "Vergangen", + "Remaining": "Verbleibend", + "Paused Text": "Pausieren Text" + }, + + "com.genericmale.sonos.playpause": { + "Name": "Abspielen / Stoppen", + "Tooltip": "Wiedergabe starten / stoppen und Wiedergabeinformationen anzeigen." + }, + "com.genericmale.sonos.previous": { + "Name": "Zurück", + "Tooltip": "Zum vorherigen Lied in der Wartscheschlange springen." + }, + "com.genericmale.sonos.next": { + "Name": "Weiter", + "Tooltip": "Zum nächsten Lied in der Wartscheschlange springen." + }, + "com.genericmale.sonos.changesource": { + "Name": "Quelle ändern", + "Tooltip": "Die Wiedergabequelle (TV, Line In, Warteschlange) ändern." + }, + "com.genericmale.sonos.playuri": { + "Name": "URL wiedergeben", + "Tooltip": "Ein Lied, Album, Playlist oder Radio Station mit einer URL von Spotify, TuneIn, Tidal, Deezer oder Apple Music abspielen." + }, + "com.genericmale.sonos.playfavorites": { + "Name": "Favoriten wiedergeben", + "Tooltip": "Play one of the favorites added in the Sonos app." + }, + "com.genericmale.sonos.repeat": { + "Name": "Wiederholungsmodus", + "Tooltip": "Den Wiederholungsmodus umschalten." + }, + "com.genericmale.sonos.shuffle": { + "Name": "Zufällige Wiedergabe", + "Tooltip": "Die zufällige Wiedergabe umschalten." + }, + "com.genericmale.sonos.volumeup": { + "Name": "Lautstärke erhöhen", + "Tooltip": "Die Lautstärke erhöhen." + }, + "com.genericmale.sonos.volumedown": { + "Name": "Lautstärke verringern", + "Tooltip": "Die Lautstärke verringern." + }, + "com.genericmale.sonos.mute": { + "Name": "Stummschalten", + "Tooltip": "Die Stummschaltung des Tons umschalten." + }, + "com.genericmale.sonos.volume": { + "Name": "Lautstärke setzen", + "Tooltip": "Die Lautstärke auf einen fixen Wert ändern." + } +} diff --git a/src/com.genericmale.sonos.sdPlugin/en.json b/src/com.genericmale.sonos.sdPlugin/en.json new file mode 100644 index 0000000..f681011 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/en.json @@ -0,0 +1,85 @@ +{ + "Description": "Control your Sonos Speakers.", + "Name": "Sonos", + "Category": "Sonos", + "Localization": { + "Speaker IP": "Speaker IP", + "Obtaining Speaker IP Address": "Obtaining Speaker IP Address", + "Sonos Desktop App": "Sonos Desktop App", + "Help -> About My Sonos System...": "Help -> About My Sonos System...", + "Sonos Mobile App": "Sonos Mobile App", + "Settings -> System -> About My System": "Settings -> System -> About My System", + "Refresh Interval": "Refresh Interval", + "Volume": "Volume", + "Volume Increase": "Volume Increase", + "Volume Decrease": "Volume Decrease", + "URL": "URL", + "Source": "Source", + "TV": "TV", + "Line In": "Line In", + "Sonos Queue": "Sonos Queue", + "Favorite": "Favorite", + "Album Art": "Album Art", + "Display on key": "Display on key", + "Play": "Play", + "Top Text": "Top Text", + "Middle Text": "Middle Text", + "Bottom Text": "Bottom Text", + "None": "None", + "Artist": "Artist", + "Title": "Title", + "Duration": "Duration", + "Elapsed": "Elapsed", + "Remaining": "Remaining", + "Paused Text": "Paused Text" + }, + + "com.genericmale.sonos.playpause": { + "Name": "Play / Pause", + "Tooltip": "Play and pause the audio and display playback info." + }, + "com.genericmale.sonos.previous": { + "Name": "Previous Song", + "Tooltip": "Go back to the previous song in queue." + }, + "com.genericmale.sonos.next": { + "Name": "Next Song", + "Tooltip": "Go to next song in queue." + }, + "com.genericmale.sonos.changesource": { + "Name": "Change Source", + "Tooltip": "Change the playback source (TV, Line In, Queue)." + }, + "com.genericmale.sonos.playuri": { + "Name": "Play URL", + "Tooltip": "Play a song, album, playlist or radio station with a URL from Spotify, TuneIn, Tidal, Deezer or Apple Music." + }, + "com.genericmale.sonos.playfavorites": { + "Name": "Play Favorites", + "Tooltip": "Play one of the favorites added in the Sonos app." + }, + "com.genericmale.sonos.repeat": { + "Name": "Repeat Mode", + "Tooltip": "Toggle the repeat mode." + }, + "com.genericmale.sonos.shuffle": { + "Name": "Shuffle Mode", + "Tooltip": "Toggle the shuffle mode." + }, + "com.genericmale.sonos.volumeup": { + "Name": "Volume Up", + "Tooltip": "Increase the volume." + }, + "com.genericmale.sonos.volumedown": { + "Name": "Volume Down", + "Tooltip": "Decrease the volume." + }, + "com.genericmale.sonos.mute": { + "Name": "Volume Mute / Unmute", + "Tooltip": "Mute and unmute the audio." + }, + "com.genericmale.sonos.volume": { + "Name": "Volume Set", + "Tooltip": "Change the volume to a fixed value." + } +} diff --git a/src/com.genericmale.sonos.sdPlugin/images/changesource_action.png b/src/com.genericmale.sonos.sdPlugin/images/changesource_action.png new file mode 100644 index 0000000000000000000000000000000000000000..4514889aa0567d49c2d86d5bb75f769813bfe9e6 GIT binary patch literal 1679 zcmV;A25|X_P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/changesource_key.png b/src/com.genericmale.sonos.sdPlugin/images/changesource_key.png new file mode 100644 index 0000000000000000000000000000000000000000..78211055b2ff51fcef9d9f6a65f2d30f43bb2efe GIT binary patch literal 5110 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 QcS`_hsAwyfKeG({A8}!$0{{R3 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/changesource_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/changesource_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a491e360f65023e1177c1c95a26fb2d6cb34843c GIT binary patch literal 8397 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 eGcYoTs=_1n*e~9006LU0RTv)0|3-+nGISp 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/muted_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/muted_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e140bc3bf404cc9ae0c85c9c725bb1f735e4ba4d GIT binary patch literal 12140 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 X{}v#ak(&Gx0Q(^>FIFXD82Enxc4<3b literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/next_action.png b/src/com.genericmale.sonos.sdPlugin/images/next_action.png new file mode 100644 index 0000000000000000000000000000000000000000..980e3132f0878841c3fb0cf6165bdebbb759d2bc GIT binary patch literal 864 zcmeAS@N?(olHy`uVBq!ia0vp^A|Ncl0wl`?IFAA;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkAK(8y zAC%c0y>!N8p_b5yNC zx=S%F`oXU^k95vnc(_4&n?j70?38JXK4xS$y{TJqhr7}9alABhRd~~NRo}JeH$A?( zt7p{?fBA1Sg06MkuCp(^S^QDVl0ivEY(C@N$N+vnZmpvWTr?wZJYg@6chQZxRA#(r z-kx0tH!&p77e4OHEx^9uN`nmVsmqy;3??2*0bXVD)oV-J%wl3CYV?i-1lX;=E;)J9 z6JEB}lMZp*TDeWfw`_%p_r9#%q4~L<6XL&K6JW`rIn}3$j%!RNKzn z_~~99^><6fdjm#O1|_~FZUWKAnzPOyDim_rmwo-i_UvQt{-&C0$KTXxJsa^W>*9;a zg@1llopS%NPv+MCrr&%Qte>{@&R>|Ad;RpBuFrbwcW+ZpoSSj$wxXfnboXeLCqJBO zOiQNvSTEco;^{g4?8ed=x7RHYO5!n*vi`y#^TpuKnR|cOR(-yZR4TS^5irH6mbgZg zq$HN4S|t~y0x1R~10y3{0~1{%!w@4wD hH8cz{FtRc>urf4+Xz>HTVEO<6 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/next_action@2x.png b/src/com.genericmale.sonos.sdPlugin/images/next_action@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdec5e85411f8cdb9f75c3289286ea516a57c61 GIT binary patch literal 1399 zcmV--1&I2IP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0063uBQgL0010qNS#tmY1h4=A1h4>*D;F>T000McNliru<^&xKJ2X!wnN$D( z1Zqh{K~z}7?U#K}6m=YjpWVCTyaP-LIuZaZ)QS z%*^)}XrQnhUlMbsAcZi-7Ys_$(V#R0kt=DPmyp1*cx z_q+T2KC`>?`GFHBPMkd12-YrGP>Lw|AUCXq09RD$saQJtkg6(lfawvZ)WN|>kDC>( zu3$T|uu@F?c8Ay)nTm}B&IIpVi^ zT%LmLAP}1wGMiggI^J->+B+^Oa^(2^1hHImv!Af$Sb6B|H7k& z^=Wq&d#-x0mKMJhSTM`_eL$H6=-Q9v(ZG*(5d=Vwzzyyxd7xj_`MUprm1z@VvTk3C ziLC!M2Rx@De>x7mtyy*i+XVlf!y8B{cj)$J^v*Ed!I(ocmUO**PH*axfe|3W+~E(% zzJi!hE5#t>gKLz}**=@L)h$Zcv-jT1!Mj^W!;nIh1>TQ^X@4}3ObmM3(B|%d)cO~hC9`PQOUpTnA5NH z;{p2No;&FSmO^Nh&*;i;#nr{OZ0Z;8+ZyjN(vgCJN~&p;dhF@9Cxr})%=Pv?7C+3T z++`4E_+zed>8-8lmhWq)&3-nc@SW(M z3b=pqH}{K2=2_x4ESuOZujaGRHRwt*VPB2)#_~8i_6v{!L8x?_9)VCyGlQUQy<~3a zbZ~dogb&i@U8tIOq84uUMJou8?0^5UAbd+rXHDz@qfQ$H z5yufqG_=}74*tbED13t2(hLnB70o|qns#h*R@%LwFr%(1vArymXi)4WXM2K16oTn0 zgn{wYgWh$^Go}=qQ+>uZH+CN!3&Y(JHx#s&1$$#vP{;wHK={z&CMGt$e!k8SlDy-! z`uw1jL?y7Z0oUqeTFOQt+mL-ef9*@eAAoeb2sRjjIP-JOyY{R#B=1{1alFAYwJ%&5 zfo9nhS~zNJ77vr)_heAzL3K1pUUm`O-vgv;wbHJ$YtDT6qTDMW8+FwXEV&yo+p5;i zaVysKpCnu(Xrc3Cr+F=dD8h4)vcVhjlH#k0000b zbVXQnWMOn=I%9HWVRU5xGB7eSEig1KGBH##F*-6bIyE*cFfckWF#4hFOaK4?C3Hnt zbYx+4WjbwdWNBu305UK#GA%GOEio}vFfuwbFgh_YD=;uRFfdAL6V(6!002ovPDHLk FV1f^8g!BLa literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/next_key.png b/src/com.genericmale.sonos.sdPlugin/images/next_key.png new file mode 100644 index 0000000000000000000000000000000000000000..c02832b3c23830bd39b7e45d23881640181b1fcf GIT binary patch literal 2640 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 V?*fT2IF&5`tjrN+HKy)K{{Y5b-OT_1 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/next_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/next_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..749e165de7dc4153ddd890c5530b89b72645414c GIT binary patch literal 5135 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/paused_key.png b/src/com.genericmale.sonos.sdPlugin/images/paused_key.png new file mode 100644 index 0000000000000000000000000000000000000000..1405ab514b004f33a77b1c207785a8ece27c5d6a GIT binary patch literal 2659 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/paused_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/paused_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5203a69201374c0e0a6e53f9273332dbbb218985 GIT binary patch literal 5600 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 VFfdAL6V(6!002ovPDHLkV1lrtIY9sb literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/playfavorites_key.png b/src/com.genericmale.sonos.sdPlugin/images/playfavorites_key.png new file mode 100644 index 0000000000000000000000000000000000000000..4b01e50695def6bfefcbc519ea01452690bb3309 GIT binary patch literal 2798 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/playing_key.png b/src/com.genericmale.sonos.sdPlugin/images/playing_key.png new file mode 100644 index 0000000000000000000000000000000000000000..70cca37f99b530304a192738baed6a1286c1da6c GIT binary patch literal 4134 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 Z>+`_>-*9V4xBt=rc&KA=zf21j@jpF*^F9Co literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/playing_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/playing_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..52b6f5fe3844ab891224784a870837a8d610d064 GIT binary patch literal 8442 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/playpause_action.png b/src/com.genericmale.sonos.sdPlugin/images/playpause_action.png new file mode 100644 index 0000000000000000000000000000000000000000..198f7f8778e21890eb1256070d32d00ff9362b97 GIT binary patch literal 791 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/playuri_action@2x.png b/src/com.genericmale.sonos.sdPlugin/images/playuri_action@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..59ad173c2294d4e24553bfaef2ce4ff357480d8b GIT binary patch literal 1835 zcmV+`2h{k9P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0063uBQgL0010qNS#tmY1h4=A1h4>*D;F>T000McNliru<^&xKJ2X!wnN$D( z1|CU7K~z}7?U-v&l-C)@f9Ks@SYa1r1&sl=2@oqF!NGVTcx#Nx;H9~#NsMhWX;Jeb zh)oNQ#?q)MBrzB>5pmE-wMc5rM2DD2G#JG}qDJkYWETvREN);HkjnxB%kJq1mYYr? zX{I>S@}D{LzBBLh{GZ?X&w0Nb7}5W@M9<6SWK`BIIAel98wSz~&uyEg2_(dh}o5yG(pey-4$GI_1EW2Ln_jd(KABH8jX!0uh_b^?u{@Q@N%U z=?V8Awv6$70WY!b321s(XJ6d8|CxZ#9?w@w-A$@tLF<#V`{8;3Y8QX}_$Q&i`I~Q2 zi?4dxT(EmQl<&7DzD{w19LqPZ7U{!zuAv$xOeapJ5vk}zvvQJfzjN`Gu{96v(xrTf zdfe0COc-xfP0_AGLdVs*;P2;e3s!w<%aNDFqT%2ZG4hym(%4DAII*!xJINoFM*HF@ zkMT9*=73tHg6lC+LlMD5foorDY~}h7Qzs`{pBgiHSn{KO4P3bpm>#@uT`W2NrIdmz zPB=sosBr*+)S@sR7l?^ujM}WuGiSi+_Td4{-VLKt)K|qsGFT5NI0(i@IVi(}@Skf0 za0KvfYXoov@NR1aa0Kvf>;D7rm#g7w1^UAgaHt;2_Mm@Y(|-$4MHjD9b;}I?#(wKQ zFg({?A`1J;gX6%o8(n=kcDwIAQ|+pIR@(xxmv6y4@I+r-PmkfbZm<5{x6Ht+RH35l zb{sX!0bgd}g+K#xFOf}cBKD6)POr0wdHrfV_)h*+N@9e-)sviQH@dSw&{ExDjEIWP z{)2o^WL1PF?kXy8PBO|b-n5HYxtB=30lXMZ z2(uW&ezjvfh*rn1I4^bB1)3~>Yn(o_v?Qlx>A7g}c`sgoa{lH!MGZn^HTossqib@* z)zD(iGwQ?QvRCP5$FJZzD<*8;GpRfxF||msq?d2OJ7^BAZJ8hhjmNI7y=+LDl|ij* zT90+fBDpl~ce+x|%l=ko5K5(-uf#jdj%&b2yC63-dg0}(wuR>HQkuG?H0z}_)k$f( z*|*FZDT}@GDnO(ez6L4L6Y3vp zCEkWh03xl}E3d+=8R%`QbID%ir2&<~|=i^`in%js(EUZ%dPHYj*y&Bc}ap z4uY(q``SZw$8rMPoC3Yc&CK4UdowDQpWN7LOf5P=>&=+n zGw!^@SL2>}5IQ2-%WO+_rmTFwH0?+@h~(GN1SmMlvOJDIxnt3N0Xr5r#UkH%@+nz~ zN8dRiKvmjMa%TFHIawZs%O$pHMtxXZ_WA*E!u``pTm+)+bLKPiHNcY%(6 z)dFxxDOX+zhkxtp->C9*NytH*ngAU z?Yce5$i!u1k6O|nHGp4ppXXB{w)^ zRCz?=;-Jlz^jY)q4mwGzb^hSMLuYq5zi7xXmx1}8L$wc~6fIooP^vdSyQVIEQomO>VU-W)w$M(3v+tfq(`g{dTr@MCgk2{c{-?sli^C@|qL%i~n z;M`HjP~_;1B1D-fK3salHKwtStv{k|aJ}&`s7JwE19)peZv4q;0|&khEssHACUjY0 zL)p*syX*QF`h}9Bu~Nle0000bbVXQnWMOn=I%9HWVRU5xGB7eSEig1KGBH##F*-6b zIx{jWFfckWFvx+y*Z=?kC3HntbYx+4WjbwdWNBu305UK#GA%GOEio}vFfuwbFgh_Y ZD=;uRFfdAL6V(6!002ovPDHLkV1g$1S|$Jh literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/playuri_key.png b/src/com.genericmale.sonos.sdPlugin/images/playuri_key.png new file mode 100644 index 0000000000000000000000000000000000000000..52838984dc7f0a199c31dc33fa436804bc703982 GIT binary patch literal 3079 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


p zV&Focp4y)GRHVY3vTJ|JH>an=SNvvS9ZZ`}e*EKI{z4hPon7B!0vblKuC}b_yR)yZ z4Z3$aM~*R_91f!U*z*%3x-wx8Ni>CXY5A{?iWYC1_br>!NL#_ z^L_hl7J($x$2lCcXLr2z$*(4dx^D7P1)4jQ)-_o?po@!JgVpMQATTTYGF7XoxnA~K zHaSZlbN>49v(`oFO4ig+vwt-Rg7tp6C88$(ah8Lm{P9zy~Fsm1&BV5kx=MB89nIJnewe*>< zHJ=GX+x{)W^>>zRjNN8YCoj~^yKrMx@u|W6pOXd-w9lI@aDQUz@~!Q2BL>CvPQG@h z_uj>~KN4(@6=Pr`s%6{^v^%sIiC8}^ko2X$OihrT#v;ZiO0&hCn;TNOV(L(*+&Tpp z-Uf7PJ>cDzq2r}Lb-~#juMM47CUQ(Mlw%{ph@D!aRaP}~pSL*pA-)e|@%vwm-Bqpf z?=?awB<(j*ZR|G=DC3aH{Wv|;Kz~i=uBkX3*Oqa8!j{4&oq!@vk*H!p!!0w*Dl$9v z+#qZF6Q(s?fTLyPFhLbKj5D_yzc~0uY;=H>`Rc1YsjcunUdyxb3Xr(kw+A@s-Qch7 zWd2y9dJc6IM?1>@GlHqe=t?P)6HkkIy4)$A$KVVjd%iqyKv}<;aSIEiJLqhy$Yk>n zkfzpFpICZY!XK9aIKhjO2>53hlMtBv0%-LAEmiR+T$xC*jt3e^i6eV~5HDj96-<8A z5Pg7FsCaHHO}>}@Pf#jX6#$g>xZScSyLhjRRYh;`W=odPsDhy zn;h#PwDv88Nu-M7?6eXeQ-SbaF>AI{POXQWZ@BwWc@Nd)Z-aiAuMDCuwd0_D2vi^A z?cqy_au$#q8UjM~)(r1*!*`nA9?KL>UJ*uu%&j_SOv4xS=8Ux&HF#SV6q70qX`6Fs zIQV^S0<7pZuHspGIp!drMjY9?usC=Oy<#y~4jdjW8(v$^`@U1-eq^rVG}QHoYlfUQ ztNGq-Ll(~{A=n=)w1<*O`|CT~Jceb^kUNnc6H{N8AA-iaxJR zwe<0GuI9Tw0g>vmxg&AmuA;3r>T9b-Yb$1`#w{eLy|G&J)H>^-VnVHk*iNqH6Co6)550 z&8H*bjA$+k4IsLXDttBWyrOXJdfxm!7m6Gt@FX9%H#ku|a>&`Cv?{&J(oA!IQ1cpX z{JSOFiH&MmZXIFeJpLWw(UEtsM`_!E_wMbf;m@}L2&t6UazzKOJ6Q}PoADJ|QBB5Q z3_EQvtjPZkxQ?IMAAVGz)yga=YDN9F$-Ms;x?s0p?!2evw?+*glAB5yW(G$1`cReKc z_-DuyrDZx!ZKEvH1D>ekT*7Hi^C3(8bn_a(S9C{{C{}M8&ptEcT(Z@?#jFEVm-=%h zX@nf!6-1@Qo7&kR3cWObCcX}x7(Y3$)Z4f?l!kat;kOEVCmbi-iH>()S z$CBaQ#23LXAz9+Zn#GX5lZpam#2_Ii(q9Z~Dqq5a7ts`!v3vFL%fSBNwgo zPB8s&vRDzCnlrh2XbC{Cj!D$C8$Lz%v~K;(s;9oa@A!?tIp)%zXR|QYCQ7$hDyLod znQ(jL3Zk2?j=2`Sm^7Skf9kY+2TCO7g*v6v$Fb*YdT3dGo?(t%+hBQE88Y9hTClL1 z$-Ek#RMG2~f5g*eW!r^6XJcu=A#IKkrH0tXhIyb0Jo)M@WKkt3QYRT`97mcr{;@txivjroxw^5^SkIXBLeyIl1yUOvgAajYY! zgJqKa+r6;g?og{6%#GWe!=gKr>K`G)ep$Ka*Droq;Grr=Fml0S2|9JD&hIjgAMG2) zacA6s4U^8Q!z!Zt$*PENta@@L$D$Ucr&BF_8+)>BizVrebV0B=!H{dQVbtvC9_JC- zqe7KG7gw598Y@-U3ZSVu401zn z1p@`1;tEe!!_=`fJw(C!wt3*eHMuB%Vl%!zDA3}h&obLdvE7Zcz95*5v$c5kQJWQD zwaHH-jHR6RbMKcy=Fiu09z(gXb!G>(k9Wsb?2PPl z(*zYb;$gE*6z}?{n~zt4WcbG2JIWdVV!D*~rX@uCu1)!87nz4+c13sDvZn@b_%F?U z&*{gyR5GLqs(~LF2E=bMc421>G}y#AE%rc~1**LHeO8f`x5vAz-dJ)(=ry6WA5ip5 zFhU_;4$Klr@hdj-yU5LPidWSxQdc5HtvUB`46V7gXM-w0ktrYPRpTvlB~>@2Yr&-u zPvY2gD{R*5a`cv{@9x{OHN1jYZ`)QCAiX+As(b@$<=5)7a?pGKm5KRt&~-(ZW1j>p z!@$E<0(j<7S%Q-QHr^^S{@qsn&ZlX3g#7q0Gviy6bhw855O|2i?2c2$VYA+|;P-aX zCEvXrtZ;%lrR*si?qg^p;0&}$kq67K^x2G24SSZoE^@Yzn> zjhFnmKsZZ|@uaf4#6NlpiyC{J*@d~Q9>Uohza6T4hDr^**ecQ9dJ3189Or)DgZ3$i zZmHkR>Rwv>HTOoF`$A7Z+s)V{`^;Z|kar3;GqC4x2|A3ys8Y`S@9oa@#4cbTVNOA_ z-%)gD&3j-U<3*N4Jh;g9_wDOFMq-1yP>jQ-EbZ>nl35ARW{92;x{F$)T}hHjd6GoE za{kGz`UNvVMlEl_229aS$ISuBA~Cg=asMQpD2W*s&`}()Qu%u_vdIh@{O6|OzLPj` zJb(TR&F=m2*V_1k#(py>`!qL0t1fH7(oB0B%j z+;_2$|5vUP=hgv%Vt7SFSS=(G9~!Cu36AdWhYm=jqDC=b7Cl7Lg_ka!16fA4{hKf$ z>i;H8hzdSTSY&Kl<-h(J+MfAL{dGt~DsuZwCFLVq0*V(eCmZQC1i07&{N{d#8H@qjR((4rOG@NV zZ}si6-LkowrHUJ5j2pO0R%SRup0?ktntC)}c2VJ2#sR)weNn-LFc87>NpKXU>R*Ek zMH=ZxL@fR4>;1|q1Zz#vJ?+%=N?WWE6A9@px?Z-s?8?(2`u0e7!B5@b#ZJ@&ycB&& zsXEy4_13G01M3~zxk|*bkKQqL)yN;`$ICN^pYGiLTQExGi@1-mYdm%g0h7PIvn$&z z`gx<&r2nh^2eHfU>(*i36kjYX8EFlx>kC@zT28hFM9c}b?V5*q|9Nn#{1R!+{_thR zPrdga;2H=Ge~v%vzhvCqTKpbA9`Y3eC!eutTbT9L!2Ps3^eO17gV(KBxb;MX^tPU( z4)M$SYT+6aleALLa0=@`1{`)|O!ze0$~QRD0~VSJt;%1AtOk}&gae)g(N_7`JnWqh z-EqTia8{ju!Vw4a`C`(&%*dLE?$)^1X?Ph{zE!lN&)Qsqxdgkb-4Ap>3jlejyu372QCeQrT25X~NmWfr{wfrz l28H^)*nafi41N#YygefRX9NGJ(a@OzV61Nruhn&q{|{SKy>b8m literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/plugin_category.png b/src/com.genericmale.sonos.sdPlugin/images/plugin_category.png new file mode 100644 index 0000000000000000000000000000000000000000..42c135dd5be0d333e312fa15f3983efba8f08b48 GIT binary patch literal 1778 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0063uBQgL0010qNS#tmY1h4=A1h4>*D;F>T000McNliru<^&xKJ2s&x_;>&S z1?5RZK~zY`t(JXIRM#1YpL2J)d~8^@Dwc0BE~2&!veg8!_)!fcpiY!Q%`{2P%b}qgWA4q7Y-DOD#r-A_R;GE+0#mUG|>-VVX9m zi&lR#=bv-l`#$sj&U^2D1$WS_(_nuTezONg1%MWdS1A|aQa@~c0fNfm_#=0S8@yqO z1Sv5ro)4c1u#Uu`PZS0a{@#{;f-qR4a8&og;zc)eSjOH86oWUey@uNK7Or#S%pXUT zEFBxiS8;nE7HmUz8VoabZ`o>+G3l zg}y07O5OD2`Y`L1PF~X4`ADr$!tbJKI0@9sqjY1#gM$?^GGHE5Pm$Miv;D57kI6qD z@p}2M!^6tgJYmSo+^G5;KAR!02h0Oj$Vfam=*C8kJWBbkKt0~2U?iBQAm$(pmy_Qg z5x1gJo#B5NH;i~?W!$(!AB6_~qa4-&CW3EUgx3o1Aayn3?CsPm6d0_qcxI2RsYPyh1| z)Y4Q)+liDCoR$%tU;orH?(6xMxPO_0O;SQ?5R&u2$)yw3 z@iD_u(1NosKeoSfZ+zFJq7V9g`%dCPy?@|Bwq!jm)Y1hTrv>eO(O0)XDfD!>3(yb& zMG4RQ2E6e~KtgC%x;?l0FZpZ%%=cxfto1||Ybl$J#+-SIk5bsZ+UnEdeDa?y9ZxoN zuRq{c!j#_`GjpO#LQ-;NttayS?$8I;tdrs4Ctay)TS5Y89dUWv9O2K!YAtXH zE-ntguFZ*ii<6+#v^}fO^;DDZ-8Jt(H>&<|>FTXKy3gpdvfl60_^kLJ6|~>Tc{`t8 z)cAeRz3$f-A3m_EXMgYcqc(lA6u7;2>X1z%5_DGdBkcL<z@;;-O?MuNTiSo`0S7Vc4J+c&JW4gqXg zhk7{!m+jK%j;Q1%`?a+Ng|hzJ z=lwT~?N|r`x?L>*001R)MObuXVRU6WV{&C-bY%cCFfuYNFf=VPF;p@!Ix;dkH8(3T zFgh?WT-N9K0000bbVXQnWMOn=I&E)cX=ZrsyGCDIbIx#UTFfckW UFiL6@)c^nh07*qoM6N<$g2r<_od5s; literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/plugin_category@2x.png b/src/com.genericmale.sonos.sdPlugin/images/plugin_category@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..489ec0ce25a2c72b35a4abd907bac79670435c01 GIT binary patch literal 3432 zcmV-u4VUtXP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0063uBQgL0010qNS#tmY1h4=A1h4>*D;F>T000McNliru<^&xKJ2s&x_;>&S z3|mP=K~!ko?V5R1mDSq7fA4wEIZPhlFcX9dh_j`InFDHSsg;sL=BGL4O|w)I^B*!4GjdUxk3qNNL|ALSKd!8=fBIuE$AGDgYgFS8DbidoluuhQmzOQeE;x_Po*T~r8Ia(Ya8d(STv zhg)_A7J=9SqyZX>;(-bTfHVyF6pD=%noH8;yqT@GxJmV}y3R!>d(iO3Kk-hXnN-74?uub*q$1HrU;rm9i(!>a`I{^hjB@r~@5FlF^Poa$d*bt74Bn<=8^lCNz#=r{4V}}icQtDPoohKRBQ&1A_ z^r7Yp-3l=lr~>tSajkeyw7XMW;%4!^oM=fpsk0JPI5;TLA$Za?O=qcUj>I1 z(C8+JDNoj`=>nMr(m4CXNvr6~RRj=&i=vY<#nHMqRNcdb9`NA-1=Q3M1CCg0`pShh z3Uul8e^ur$#s2ybN@8WX+wA2nidt4T&*nvOEmggKcESAX!K0=rN;41aKWReAZ*@;B z0*x#eQh@d2F)mX>6ADr44ruAQ@3AasjZIk&B{|h@c5B0z9t;|EWSFnruHL>UcaIGk zcy!ddq^RRLF0P>!5tJ<2jZH(@QLjK>AGuLUW$psoJtH%s#y3kFWzgScju>70&e7Kc z+Z!Q_{HIa=T0i**5BG|b4P{4zdGIYq=y&ebRenDWOVO8ts6inaNCqLJ=zoN!slyMw z7S*SGK+lGh@iD0^8Tqj9%{L=vnL4t15?MihA;QoXKg&UH35cF=hB81@VpAIm3 z4P^Nr2rXZbmmnPlw3I)7sii_X2<6&5V@}wCA#3Zn?0TvI*L((HZO;2%+!q;J{O{8F z+{R8?3Q`ns2isypssE)7^V|O8+J)O|#xxvYgM|q{8?-Jhd3M&dXt#MTKbuN6F@I3v`?2ntlq1!BF-(`lA_j-@raKfB5EdE|A(5nT$f@0?;lDdSoM| zNeE~-xCRG&BvLI1`=9V%Lra4K_U?y#ON%lz5*kNBi++FxQWGG<2s>{>lQ)qQ#@A>0 z{1gE8K8h~G3-epsP$oxc#;KFMHV_@m(gFE*)d{z*-r1A2G&EWLpR7UP za|qqBDhr?MGz8%M91M9ulpeXEam!lT<)zq(WA3=Rc3)<-z;lAGt+fXd!Y8#Vqxyy1 z@^&PCc;(m@`y276I`-M19_cX!LwE(HmbAyBad7Q$3^lftX2#gxiO!w3py&NPZT-B) z9d-P-Ux-bCZ6kTKrc55CDYwb7b#ava8vC~!yZ;s4H+j)c5yq^>4t*4v(sc$5mbA%Y z9(>~^bQ$iHW_5IM811@ziR;2~rTWIih@P0l1N8Le@d=O!2dY6bVsh|tvTnniK)2Lq z{;}swh_^YiIP3NG==j_+-PK|q%>5qo!p}6`J$8kjbXzsftY1NlXoDFY8fhyCd#KSv zjShqXq^*DsS@>htA7F-ir?C@yem28l;dV{H-DJy+May__7)-ke_ttg!xXJ1dQgvq5 ziBQaRKqpe5ctLjC!gu!t6z#s)nIh~Qhj;kV>DvKk?K8bDNG~9Z5X`zSiEg5s6t^t# z@Q-e7PR_>-i2LtNvxo;P*TcJknuurp#(3MNI1Lq3sKx~iuS0&w>BUDk2cLRp{|E7{ zsyBqTa@a8GopT?oIa(OJF@MSFiSz?p(1@v2+g@=R{H)y=pLY$KIhA`X()5-AEII^J z271r8|DwB}G#IGDN?MFu)H}Pw4}nuY3b=mW(RLopsYaf&6WMkq1iWy*{SVnwV~aXv z_mUPPQ-zfj4EEo3FPYlIt6!0YrW%U?+I$JVEqzDZ4Dxj0Yd{a`Ajn&}uUX`Z^LFp8 z1q^V?9p%(G6yAsT${;fFT>0IB`$nq+YjubNo6er?eD!{PY-c`2fJ!htIN_Qr60AR? z5w%B(O~JY8#k9+>LclQO%IUw9uk?oif8@*S!MXI}ReT=m7(m2ZZ!7HTYOL{liU5Hp z-%p5#fuZaPuaW^BP>Ah+=xR{0#$>4gW)VPnFBp5~drCd3rcp+1yt@qr*E+O&{yRuJ zh+-4^OL?0lNVh?Gehd`YbOetQwK&xn;b|%fV~yRyw^e-owlx zWY^@EhxF2ZvwMf#z7LA_UTniL$nMtRey|YqGj+xf~m) z#@Y17B7xpALwP5x+y&<^B^}&Uw)(Ar+hL=0pAaLaW0syla$MoH)Bf@#6!+TVavo^5 zFZQll4*uxu9=xpB1EEb7q--Rvvs-GrE^{`aCb6`E%9 zj+BB9GpZN?Qdwq|BLFjsl!neUidlL2o5B+2MQLV#rDk{pp|g}-76UvGjk&Re z!S`5+CT2&-k}E-xt&6h@XNcYCr6VBCqc)U?+GpuFh+XK5=M@&F#4p(R&r2V7ZF;Ua zzsYtC2liTSv2D@);QOs8)t-5=4X?#_^kG?)_MVHbS+siJd+Etj zBO{XDnQ84c%|-Y<=ef_d6+mvcdzbHr-tt_MnqBe5YpUem3sO&`TYb^8aP?%tchG=M*Qc8P1&fRoOz!JOF78Bs5ZY6rar8A=zbO+(I&d!>7nX1INdM?O}+G z0N(!3ZmG-wRi`-7jO&lHEfloe!3p;U0F=6d94R`moKu*ADv*Ns`q{#6iP|_ZUGSSE z1OZ|nSX27};70A2+el#K!(tP7;xbR0qy#-XxLcwW#B@p?Rx*nFa3;=b$>?3D?XXV5Y4Ha2PTR)QPdCbKzDSkzE^Mb2I?PC@;vPOkN?Xat8wvGyE53rNH8NZ0 zAWfj;S0~)f(W@bxHeai*sz^$Yz84rbbcidt4gxT(Z05UK#GA%GPEiy4wGBG+bGCDOkD=;uRFfd%!=lB2s z03~!qSaf7zbY(hiZ)9m^c>ppnGBPbNGc7SOR4_6+GcY zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3*tb|klzh5us}y#&m|a_}&m(>v(p_ji$GSt^%g z%ND6(Qpv~&;0Xo#^XANh^x{vcFC= zzD|_l=MUlQ1oN{kUq^4h-GZIZ>(}Q$Vc?(BkJR3|f1Kp!|Idx+?ZTTW#*;$w{ER7n z7LfEWx-|JE^E0N#f%?`v<-HTXRzg626(|3jRk@$D^5eJg2k-xslvF?OJKp$xFzb)k zU%ns8uY>Pih<|hCw0>Oqckjm-+Rxkh{&(;0?%wm+-OQDc)~`){Z{_{Qfkw#F`&i|> z@vrcEd*6fa?x@~HcD7&M_+DXzNLp^lVTT!RIPZ0Z#S(Kok(9(3S4{7{PKric$vcvn z^&M_(X{4Px*;=GG@oxOFmhi4S-sM*4TzChLjDeGdPx|BE^Zkb>x>qG1g6}_K#k!&@ zi)AQt`pHowB;4;hDlfp_-#>pTuZawn7v|0er?<~3tc0)Ha<7<`=){4A*H2r7w!cn5 zh`4rPF(HuwUqdRP2H#?AArQw-ekLdCG398aAe0g}tBg6NN^*MCwfRg7@7P%4=WQ^H zM3huhBQ+yUawTA+ep>F-&@8FsQc5kY^fJnz(2&GN~;45AoAdg5 zd*VDR?`9!eTqX9+c5Jnj!K~irnv1ZjXEq3D2y1hG~f z<^S5-?!9mG>lk9Rvr3&yS}w`Dzhw~SIa@J~phE94O14v8L~(&`tUoqK_fed;4&L5n ztu(js0$0QvWA>xAoAQJpj!)@k}rRj@vumw8p%7_L>GeEyQ?QXE#Rr z#vulW&)32=Y+S$gSyZYkA+xd>&j>3e-Vz9a@@oJdD;xr5sur54%@$}$ihzoob?m{u zDc8iBn=6?%41LW`mdA*p#3fy6@CPM(_M$s(>(Qu@27y-?ywbe0^>PZ$TSpGPxG|8O zbM|w5OE(UBwNc{_MK*ghPLx0qHf;3(k@|RN@j36y$w!G9CD9$NvV9>5?58Fwu%>Bd z*HUf(Aw@#N7`V4SwF3k!E~?)sq<_4+pWpaTUw@paNc4Qlk{+U+P9Rqx#px&ydc>CS zwE$&w5MLqoufBetXznsij^t8QmRX>I703ii zuao!FGabWXE2t;Np$6YN``5|b-?5s1bs|WL<^o<=Z-U9UD3lZpfa|U1x3BK!H~!Pt zKROYMK%r@2Ucab4{(N)p@5$NECmOl@ejVTit3<~O=>^9$KGLO?pz>Vn*gbLeo0lV- z-q02Uc*77uxrh~rrJ)3BqQz*N8vw-?DM;wmGODPd-r%k)w*>P7@NS(t4-JO0gQEgk zfs>iM-$ff)IdlMu;hgIMa2BDK45Jpm3hRo#wsCIR&QxK*I5=EEaas--2qYe=Mn!qx zaaZ&}@dM<7f+syg1A_^Q$4u?=@o_N6Mb{DXp10rtr-yNR+OP|(+K^g(Ba;kV$3ZN9 zv@Ie*&5k88b;oWHWV@)^O4M8yslY;zpI0 z(lSB|yaB^VkF;Clvj|F53_s8aaW^lHBS?821P?44*1-4T4^zQ%92Jy%G3SZ`kXAOLMBM(HF>#9m?V$zwRJx zM1-12?oPIe=0dEo#(WMw1kH^qq>?GyRQwAeY(nM}nlT-?0t!b?OUuoZ8f*bUE_ehy z6eZ4CvP8cj>k{FoL!=C9)BbWs8rA@gldORYZ5zciHAkTdoQUP1kq`r=T-&!c%ctEv z>b=q-1nTt^7bLN?4DwGylWiskF>X1$Hy!E0s$dUMvQQ7Qx-|lhSc^N86P-k-Jq4;q zW!foGl|Q!1j2%MqG<? zAmmWHr)b*AU-6lEZCk~Hd=Y)P&J7YHE5}K3E@BmN2lRwH$K{c5qZk<$0&e7BMjtJgzEZW9gexh#=}2AEO8(dK(u}`m$t)Zw?(g z$TyfXkTz+ulvSx;SyB&Z`l|Kt3oZq{6)&J!;9j(Jp8g2RNBG^RPUKB9dEYJzK zhi|N`gTLXR2-Zb0(+{Yo8xW@=Z!SdkICb$bl(I(WKEA?3CeKcg#K~DXI_`vUk3a}vpdP8;OImN{%Ba)>GR1^kq~Pc!a*c1m*3f-}?bA1~$C%F@ z;W_ad^!}VMjThomG67MV&qc1w4@dfi<%*;I7RC2Ww}(~28}nY5faxYer$|IRbBDXw z>Q30oFZxgZtIYfX*{BMgLh86$bv=`aIhQG9GLUK9X0v|%qCi$~QFoFWe$ zaQUo#!p&&wi6Mm$;1J1QP?E@?A)6xWtMVVPVV7`Ks2&_Tn#NInJ8ueg;q*_dcohUD zjSk&vPWfPOb%zppszUQmO{q6_m<~oPN1S8J8DvHIpDL3{IULjp3GfS4u56u6k7GSK z7=8z62RDXBAj~tv>d-xfZW_d4ekv7LapM3N4RkdgiA4IQw&b^AX=^S?F2IeQVrXSz zo-{Dsm<@Id98Rc-?oAK+FcVY_9R+6cN7w_7(GbJDLmvp*52ly&w>tnld_X77KpZ^A zU+1M%6lfL-;L(vdaBOGgdYYMdw%{l?P;`?D^1xA1!6tcp6iPw+Z1_501p`{0ekHjh zqgBoUY)zK|C9Pg}+0&J-m!4UaHMj$cw09Jh#xWfHeGnKothWwP!V4W~wzozq(VT=Y zR7faOL;I=WI+TtXg0XC9(lWy!7c`P!0NlW9o2N=EY9Yr9%+mts?1Rwi&<+HE&FuWo z@~fdvsPh1xOMYz$$CM7|Xt>!Xu{vIjdX>r{*ds`*bWPT{toNu3crX+oGD1tWBX0u^ zJkvikJNhib+@#YvIu2M)VX|zod0?Y}Hg;6b7)JlT6XDC%kbwc!dy*HMiuV z!~?3bK7caQXmoCoE>7p7jWtz7_yXg|LRqPyLj!$4`^P2=o(0KHUpYL*b+@uK2L6AM*s04f{9gc!Jz)96Sr z#v1CVof=7#N3!yH6j{C4)&;O3{T02!*(I(HP3U_8=#ljxB0A)42nJfxiE9Ahh(HJz zdM6_p6SQ!Ugfd0436EOWie=;A{G`#g$&~cF%wvt#zPPG;f|q_2YwZ&Szj+2tA^;*_ zU?KEOBWXppCQ2^7@tkVP_x6w#RSyCWJnR7nWKhS{KsG=su1ut4e2Pjs4Ve@%E>H>D z4#3b2nKut376ewj*{DgJp5ZIW@4k zrlM4+)EZRdA<{-srMpoh8aT-dA%YEyOy6lB#D2j^nibE|J}OxEOTiIVIXprEk)>H; zCtT#uQ4OR|5<^Co?2kaZgH`2IqjSYa(t+&;ya=DCD%L)rNbV&|JD@#=TWBmPD|#;v zRML?tKZR+=7of|dck zL^Bc9Mt{dUs+=GEmG(`lv67JrM#bN>onH|Xy(caVXK_TPFniNrjCD{4{oM@sBY6Sb zvp@>MeXEIIh>1?WveER!#M10z2b3kSAQr~deX%fldRK>!-L+-^Xt>TS08u3qg`lZl zRj7_>2%V_(`-ITP;>l)PgbXbpI}1>MU*m5_OA@_q!e?nuZIBalfCKn(3BaQv!q zX>xEeJ=N`I(VRSBDKlAD`z6#c{EWDin#dIE1PEkCK~kLdZ57vNSyhAS#9YV|Xb@F{ zMkBR6jRC&Co)yP^n1#M&k!>M{xk{*1Yo<-D;({w8i1)~pTPR(Dh5!Q=rhEs*hO?bR z6FgcwVBB?oaRlADD^;vcB_d!05?0d=85yUk)0#300YidAktXrTP#Ua6h;Vn=Yc?Gy zT03wz*B9z6nN)esBe^J>1zzH*V`s+`Ekeuw;J%BKt-%fi{u{iw=Hc2FFqNTacpd0aM znn_|;5WY!sm!)ZN@Koyn5Ow#IqAc-v^aiI|BWR$JHHfA~G~z%8%C^%$&%Jxla1(AY zu^XjTLaOy1?4aR)jV|5zWy>GrnnE>Z$p zx1!zAB#JslGIo1+m@xNT0v&@YzCNmY_LT@B$Y2Q8G(ax!EPdVzB845;0kb{*qe(Hq z@klJ7xErLaP*06$X~m5f63N7nRjKGuDaVRFl)lJTr$gkU<^i{?QK^4zHs6SMD*767 zqrk$Fy#{-A`MZ#OUDA@u$Gft%!-;m&9dbJHka-%Bg{3!}U59+2s#3t9&;V3}hASGM zpxK*DG8$I*U16T;=)(k&077v_Y3mk9Ns{S=#1Ny1i35sKn5HL3Q1pQ?X-4t%Nzok{ zF6dedvuJia&XZGi-t%ZUHC!HeNXjh)GWy25Mi3GDh)o#c0(;Og9spEv_=E?c8yh(^E~AjpN>600=F@fUy1*WY z0q{0?peTSQo5|5!fW7bM#E5=M9Sj{vG`z(xt%R@4T;>C2vD=`uqqO(d~H znc`RhET1$WBrxq08x}G&)EGyzGIm-b+C1S(q?H>G1A?phP0%J9wVF^g-U69jpFnKRhBw8O&Ni@;&8)y@=_i-6p#s*4pbm*bi+x{Q$^h6 z7+DV;jHbs#Btz^yC2~5lrWt>Z)fFllzdbdWc#nyc@5e+kHXl#)9uvV^W{nt7I<&9s7ewv1$XQaqyeAOTqwT)Ww(uW>JIUVMQ_*K(PpO#wBbbj+AJOfWz~xVs&nOPoN?Fh((cZ%Tu>whF@;f zq`466S6am+#!@p(DkFl$05xx>D6V+wJ;ya+8db{Ib6g|nrdu1j3o-R1Zs~_m!PnIC zdys1sD3wECvZmWr(L`!<0mPgTuAtO53NB;4H8F4v)r`rr0rAC zqi?LE>NyWR>~JDL;eDiltk0xc8sO2d-~Y3>w|)P0sg?~%lY z5kk%OuSXJ1PdZLC?dOrijLQx^zh@Gu78$Wh3Q)a>7*sMXGjBcdNW4<<_^5TVKcJ}| zv{R2(cK#UVp=vLGtrC{-+ih0<1N)xqS_KWNgBq_{W=t_25w7OM^} z&bm6d3WDGdh@+E}qKlOHT~cTfNujv#?0B$0v$8Ff@pg@qXH8Yw2ybRPHcM;w2OTr#;TVB}ap4JstZ5B>+g zdutY_Cf%e^9O!wm?T=9)xC^uzw*7r<+pQD8{|sDd9e=F}%zl#I=xEU+U|<`#xbA53 z9&ot>3_t0TAvuztrcf*b?`QN)d0_As=v#C9);`DS1CXU&E#CkKhrn2gve!M{-P_%_ ze{0(P`vEN-a*J90#!~SLNN(000VGNklR;FoPXI1s~Ja)^=)V6k9t^|6n?ff2bYp(9zm)oavOQIs-z9%3y1KAp=SZ zI`R;bK!7|5d64XGHpyn6_wo_gB-@o#>=j=V7^ESBt+07tsJe4g{Z|6iSo?Sm z(ZEwGIrI~hVdYAcka3|oHe>g1oU``1-YElWc>Uq)iT7>6NR%)gB=r`oo_pu6e{uh$ zfaU&<=l@UknT~Eb#ucgEI;eHvcW7ElG~?Iq|+N z(-sbZGMvQwwlvm0o-+Xu(ZEyF#^+p4Mxumh;Hfc7?8J`8s*S>A$f#@y z%4TxN80>9wxJ+s)Js)L}poB>xBOxJ`2`Dojl#t)}(}({rLZj+Irqap;WCAh)nSe|{ z|HINU{Ud28y8B`bCX!@Zb#mP{ER*1jBn*1`qC^dYY+WbUV?~phw^>O8wEuF7QU>%6 z#EHfd=(@&?Y%97&OxmWWKTaf`z-iT);kJ^gNm@Xsx+1*#!D(7L1`tA^l%l-Q&AR2q z%qh&82qu=|{llHSbFhPGEP1g_L9UB6*Uw^6g^zTcw(aX=?b2NA)`{89$?gHRyw^-| zaW)SuoA@-!Q1IEQAUprv&e_i4`vis0<6!l*g?zVq23Bq2hqjy_;)rbh^Q0*cfC<^$fCXmj=`q zN$|qX2I`LYl1wU`4m&x17tv^v{=qm08+(Z=gX$tTQjERfZF}2kXbmvG+=q3Xd3J@P z{G;w19-ob+mHr9Vy>(w3+dpa{Jea^DC0R}fN*P3=367i&(iRw^rp!0SntBG}JhQc) zu0RASC3dS$$}k9qW9+Z*9T}T8y4;~ASkR|U0iv-a^UHiZcv}S?hekM>3s*612 zxi38(N-6l;2hE&nA0*dn=SR1eQ&pIaCLt0}QCHu~mfg*~cc6npuag_+&zLYnhfam~ z^R5#-v~o5crfY)&sSF9cj*KpNe(ogXI_bye79|KCmkA0Ap}$vd+<6ngaD62 zEb+S{RI_(ysHy z<}lB{d6M8jVp5;eHiP6k zkd!g@+S5HTgn-ig%tc9E3g(r1PzriN@w6G?eK(im^Vn$b8RFU6dfJ1rjQ#b7hApC| z%zfFYI;SujA)q68X;K!J`S{*~JPbqe*2isZ+*3hrB8%&+gN zW6TJFiGs#hqXIpu6&1_~DyVJq}s4U3BYPHbXIY3=wAni3LItKXUi}MHp^GiJ$$2QY#<@Rd} zSh=JSfU`XVlLJz~v9>U89B8LI94BfhT6?1$KGQQi2_(#o6)6S+;-F0>FJMO0esbZ=1bNjYn>;qNc(-c1?}Q?Xa-!#$tqkzy7O< zcR%kUG?YRq7>pa#oe1#!n~f+1H!aGiXk2t^I5)uCpLWpGpCF+W?ZFs_n};pjdgFI`e%FYRbH0qRhHwC4`5P9BB&hmw%o_2(U;&GIaqr z+`YVv#pS*!rw>^+3lFWTWb?acNawC^ygHZj{ZZbj>tO5dX148V#%|S#C6c643L#)& zRSs*vQ#1x|OHY(PY(I`N6mRTn!y>tOpE+(j3(CEd@1(s>o%v-x0s{%UgVAAA7x3-s z9DcU406l%RhwHte*8U_phSAKzNebydE!A-g9Mr(mX?xmS6} zc4*@qs-&jOM}JB&JJ&hRM+&NEc_=B!qAQ#r7><%m8Yrd6^}D!xc@b-t&cZe>(epYr z=9PNs4#(&TMKKIeC>G4l;TNka@n`Ad)}d6Q;g$PSsFX~X>+}t!7#d3Aa%#98mPy|_ zPZ63{9G3>Judm!N8DNWmoGcBpw5iv4zC;_d9%KSC0hxeIKqjF7 zXF%qw3zywvNHJ;QU^?>=N@4=K93mx$zW{40Js**hBi{}-m7Y*c0{te4jOv#tqs!!w zsgz)J$&oMJn@YP0(t0J(WRl3JCW+LJn;bG)&~YhsXPrqR10UU4CxzX6L`c2c#4#?w zOTAmzy+>r_>L=q^^jZ_iI9c@C%GFQCC4jJbUqHyXN#&yX#D&fK!f-YZRNc9$UTBWZ zCYcdFnq%{YV{}Lf85g?i uW#P(SoDNP#3mPr+khiI3ZPWCa!2bXXOgIh;m`qXt0000X+Nq!Ti^jQiOi4X|@0HDf9i>v%QWB)S*xPSgYa=RG-z@2bc)pS%bbRn~~ zw=prZG$wO&vo$6&b~Q5r09;op)6JZTxs!w5jc_`^0%MwJ0}k%+9WQSz@$ptks?IG; zvfmj9!T{^G@MM1;JKsCbeI63Nnz8Jy$bRg3jK{;=kOI+4jN{%P<39j^L!}rx-UH*%MU;Wr$c>EFrA?l$Q9g^Yhn$!I8X*b5) zb4xqXQ7_ChL~h)kIT0PtcP?$lQA9R7BL*lYIX59b`zI-&weooG>obpvR1GBzHdN!! z8!h31ORwrukFXD`i!nZli_&n{$PPw+y_1s=_Ein57L74k$K9T>NyV?4Yx*Dv#d%g* zqy*b$M89RfCu&|g#-OA(9H;^ECAF~29xX#F7~6=Pm-%qrvv{SAYxmNPXp91bH(66g zAtpeF+BfQ{v{YG)axl|=f_m|f{bWI3yev!69K|IO=YpyObHjqV2MKfI95|+dbJ3kh z@CJcrU(fxl@?Hpzn2S(oVl3tXOJZpjQL7V7Sr!vyR@YIC0P zpC3GjIZ4FIuGhS@vn@cC_m1pH=5_U;t5bG*-t!-Bs-66ETxGZRD-FL-1aK$GC=DIj zMB;AJ4QHJ}lwiWczH{rzmX)e2v>rFaFULa62=*)Ti83523WLFMWt$nls--jS?D>Y_ zZX4_c*5g8ky+)8Z-Il0A%w@5qmqJ{tRgUU14p(@ZiNXj0`pZVs;F9`J*STiTm2SHl zr7iIdpLI}N$tbe-y6-|BEhkIpRqXZ0^$BxliFHXZWNgb|&r6<-hAQRcm74#|Zy2X# zG`3RsTlC={7o}?;u%jNo&9DI~dN{3h%!xvR$v*8A3O(iD9sm)Q@LCq3qc?C9#s!-$ zkr7=94vc^g3e#6((X;GJjasd? zwGm&?2q%8BwQOpP0F)6OPCDrpD#Bf8si8$ERxGF&Gi$^Jf{qZ`DNVX^*y#0yzO5&% z-UU4^2mSy()t!E3nLhnAZp~es)CEGHA%+2qChdi-3jUy6iW)QNav(~Q=Z93a7GQES z>}h{CXl$sQ+bLp6QCHGu_x0rf5=ad3@_@j%t^}%wI2Il8#7QO$o3I`BY|u+YMVYQS zkKvj3%h}h5fsNP4XFob)hJe)dQ`p+xuBYWEI_VtgF%21`^?K={B|JC~oJX-d4Se_-DTpdH z;>iM9qZ!7J=e0sEOOx^&r}UZs?6NM$$CwO8=c}aXOl!QFr<9E<`GZYLi;t=3KOJE9 z?#_qvJCJ=mk4jlWI!Pd-6XzX);;F^F<3wIuS{Hh%)9zJd3Ef?0@Dn=D5OBvXygM_^ zZ(kkf5YCJ;6^Q{LyU5JXi_aIeyIovv4KeOwRq{@z{=^<5AxoXxnLwU&_<);sfdXRn z%_00tR!6#3KTov(q$F5y-06tO?@jq)b=e6^m03S6Bcx6o{mLNGh!iyAs! z&%~U*X6A6pOs!hOTse)EtB!evH#00j1#%)R`lx@OTa#B9?A~%@Id_cBX!rv6glppo zoMoScJ48!@>G#E8RTY(+4A=Qf$F_j$9IDH@Lezs4Bs%+;MbcwW174Z7M`Gt^jxQ7) ziqSP$))U;z`pL`#oH`BSMRhCah$TY^Zp=G%Or;(olr6ffAP)|qFEI0AgIgjQF+KBy z?UL=TS5CC37a-`sHL-1NW?)Qlvq_{RID|(w8W(;Vd4fLzxil(V8Co1)RiXEzD z*VIIl>uvw?L?>D128CkLdzI13au3YXHwqFm+_DCs-Jv5A8%cVUu9tEV+9*kZU?pXg z!@#lYDk6qTR9z3jmweRXF;!Z0k7?YERN03_Xg^Kd5KZCKz8*z}T8msqeuG`lJ0}cG zlLpy1$wv~0DGTWyXL~1cedaNyAl*{|Cs&P4nWF{J+-3l3ye&t3#ia!{fw}XrVk2V8 zGi&fGkYt_EsKi{MK!v;pl6p(J)W9+FREIT0Bm6Q*w}OAH_n}~4a&<}h&)K3~fIapk z!%r1)Z>jtpv*}{#d9*5G&q!Hv<5L`wzV*BjGbivz{R6Igbk3l7lAPDVM!0-d=w9zx zRH%GJSWw++24h4?%}-4@lMlCGM1>)6JI3T}un7llB?57cGtYpI)H@p+U&+=?-x^7H+lKFJX}YN9C>z%r`ys1)K=iSKX%? z;%5(#dBmCa310|_u$?OqI)kNyyLXH0>6Bk1$vt8_4diMdsW;oEreZ%o56C)zFf z{^HB3$SVmVzx+SqGg3RsB|E)D5F`D{Fjk)7SVzS1%Cq(!;8!Y z33`}}n`jLCM_6@~?x?>Z%YV~Ua!PJM`NUV?bq7D-x=4rDsmsZS>t{L@&hyn4M4VqN zUX)E>0ao}bXGKe`_Ov4g7t3YByc6^odY{NbH&wOD z6U@Hl7}Ex`gTp}4Naze)*1*l5 zYf*wRx4{ze(<s}}={tBqT%lYiP8D%?A4zDEXvilP4T~3u5!H9FH=>qTH zi9W$^TRKqEH1xGW6P!Ppp7_D^seQ>z)Xar;Mx<; zCBOxBqL)`i=5yptZGCT*&jAt5h}1KRz;KEEOw@3 zmeOWPLO!l%Kt(E${wbx|v=xMwjz@1d0nWlcAg^_rO&|bMpa!aMNH3Rh71JGT?%T;c z5G#R1L{>@WG1~1-ns4o~Y^jnd{UbD=d0zzkLg~Sfz+?ZHL!RGC9+xVRFv|2koC=k; za(F>8MiqAD5!CKs1^@#RCIii}M@{A#^>?y)?Pyi;zVaso%C9+42$GS-Vi1xvUS>fA z>!*614f&O$uAsN|IbMboAke~!K9$_Il=&yIU3{0NV^VV>+n7~ww9I+v;~#QuvJEv& zDvJnmGnb~Jb<@PEFK}l^fI8D#9M2QYa}?TbH&N}f+y{x)6%0EZ@-X8(rI!8x?Uk%D z&fyH^YilE9RZ|NZkhPK=`=hoHapH~f~NhFX(`09$~<{{BKR_Utu$O&oYFu~6SCo*eS zOcb)Bukou8nhwK1W4dx~6pZ6O2^UR@Y~*`PC{{z|hSh`Jk-D?fWHae-q3V2kfs#QT zuBf12B0kJ2!MQ*0(6U9t!QEjrUePS#2SALUA(GVDbRO6si$064vN3mK?5f5^TWf@r zpN+7wA$%&(kKE!Lgihd}5YAl^KmJ0_T+HqtzI!IgItd|jvP-EEzVTwU(|6L|c7hBU z-y}cX979v(1gBiGPQUb(8z3Lz{$bw28J(Sl^(ue<#=_YlwdJ`VVfK#PlO4@u;2Tztpf zeOci^LjC2Z(-ipG5O+fi*Z5SFtw84~s{oImlL2!=cb;glW{0pODBEuklN+t~&*{xD zN(p#FLe^6bct*3hunYZhZU%ubjVAlM*hAG5*}xz*OccdW+3M1+lss~#A;yXt<2rtX zV7gMRS24+aEUHEj%MoRm_gSBmB`Zn}y_6{VwBNl>oB)ei`g~BV8GVPGM~N13_9rdPSYt`^s^y`jo+}ww5Wji2;1q%VKaB?4r8P7u53_K@z%7&qBtfG-4qtcmp zeav&)Pm9)a4`N%Cfddl#=rAzEVEPlJW;rDFprAL&*-Alg8(?5`_w%?|+E6%VqQuuW zH;H;{Srog`C=pXnd{7SR{=BklpQFnX=vD1VcSf_rSBi4XHYBN^b%oK)zgFkSKKAC+Q!Jco! ze0_tO=a4wFJ{0WJ;7qV4YQS-k6nwYUd*(!RFq4+4b`aAkRqn^L9#e_tQl`!Q>-`+? z3HS#hYsgm)M>M>KE2zX9i^4|h_E*a?X(e@qe0Jp}g3qgHUE5~3{zA&l|HARmJKG}X zG@eee2fn)6A(g8&`YU4f2IzJ6QEAZYlMoW`nPlbhlHJJ-u1eD|=~#7w@mL7XVXg;m zsbGPUEgF1Q1vV2Ih$K8RhYwqFN7f!>=~)%GFDf#*OQy=Iuxbu_$Qx+7T=;S7;j()i zPe#lS+c6lf$N@kd_#Eo;`z-%J-cE{7dufio23*yAl|eFS$a(QVeXA67rk=BY)5%20sU!9>!x-P7H6=j-E%-zJsH=Q`OQ;&$rDLb11lqt<@b+b%-Br_J&ZUZ~kI zVzmsB9xplH{cxI{03`Cz^h{NN1ayrn9fVwh{pkqnVp$TE?}qt&5^eKs;&CPCHIV6` zi!(cZ!2in7+6qx7HEC^5pAHW!&`)GUsIJBH)mVqe0q$H1sTvpey;w zcnQI(xTSH%qe1*WLCKl zKt^p>q18lM9=!TNUj@o8JKX7SQP~SrKbbT|i?8OM$ z*!G@PRkVRXynjlaSqOw4FseWTA*-!<%hMQYh8g^B zXkPZ{Dr{bKO#spEQpslSIrX{TD!dHR=E-zc?txCIt=D7=qzQ7H8R0zMl-&*;Yub^9 znj=>&fCQBp_ALACv)!{zC4=$Bn>H;Ua4NzUhPT=W8D=lucV<5N+@`#NTu}uF3P!Ro z?&zXT<@c4cU0*8>1aCPoM~^Se3iV`vt_Vs$Umt!Zc6Th%7i^`>dgVHtrD47oOmw)V z!&6tjqmvP+j^I$7G7WQ>S>nZD5%j>Ae_b4UU$7hK^ZC*ID(E?{^!HZKbFb}ai;+dL zbfXOZBZQaoOA#4&Qil_rF=oQgXwJ2=xbI|NgQJ`431&p71bM`MB;B~#(!_dqJB!_4 zwmsfXp?!j&9p`0j{(RnTi^li@4Mm{E_|dc*0hVM0(EG7@#z4MRQNpqRn0mVv=?z== zI5NL@BNZjOP-M6^;R67GL1toNN-|<%|DSCCHg;;iAs_d_tbQazZEFxcDY8 z+IBuUU5zad_aMH_TTFy|1$Q-8T;#A$i&pom5R!uxL*yv3Embwj(rL%S%XB$b6Q?kV z6%y93f;Xx=HWDl=pg^pq8ud3Qa}?=-dBVJ5VKBMMG^63U`kG?^bYRh&Npfs?9I zP!RqZAwA8E7p`v|SqfiM3y4shS( zq{IQ=0Pg@mA$@u0KLycNTFU_dK*svdfPnN&{C^_6ql|(C{63fv7naRppBDrG5FE>h zi>SJ;oMm~~sxD?7bapz}+@FQC&ab)4NlR-Ykki*YGqA}bEh7V-TaNUS1+_vIrfLf|JOse^H#DR4at_wp5KiEU7+3nTk;Q%u?nmgw& z`9hOcVSYwnoHp}Kvt0E4K`7(=2l9UR*b3^l%?fYBw*gxJ9AsZUy*0g$nB9ZoZ0%}? zVQlQX(q7TZn1w4ag)J`e-V?NaJI;-wp#j}te@2BsM3qZbxlj?(?cJB@pIKQR#dAaSpzdMmmoh5DP z)E~jG)xk{-kx9aqDFS$R%$I*QNkmb46W|b`dZk-o1mXO?$ zglRe0Utf9LeMFXj)RT;Pvc@PlS$PtM^5ZPHw1*&r%`o~oC*kr>&x{fBeDizDmyb3d z>G8=pc^|yk4U=1ws8zN+=5{ylkzwd&4;~vU8Vdm;(!syI?)quZN0D>c+nU;9Q3RQv z1ypzgT~~s?A0GWD6~l&7hcphO)y>`JG0hCbi>(%ef9}km-BJ*&FpN`kl8X;dEktWH zEh-|#N`pxgkPB22UH_*)L1e!R8NU{V1=cA4s{-6&wvAA&z ztdX2L?iUB22MS*I#e7s$f&f$~q%n8gtU{QVqP7a@;$^J<%>z;}dL}~UETr7Y4ESU) zrN{(6T zm*^Y82N3iWh9_kJdsxoM)V||>|M4q~PE9~q#|TC=DLIxQoD?BR#8x6*v`iYkko8)v zRYj#AK!u<1oLgi9g~<38njpmbf~Curn9`TVukC;;o#_7fWP-7((-c~MGUL*iWTj~^ zR1W|A9#lnzEl}oP3KdiZlZ>7oF*Xq_Eek_M4UCVE2mE&-RKjo^7P%GZHwuzL3GTTh zf`Nfn_9*FUh4X%3l&w#5NSpF|GsW!ivU~V~h*HACft)9+wsp-jt!WZ4IuO1dfhmjR zT2FBLo#47$bj(swo`c?&GhNhxEIQ5+h7VBk&2RJ!+A#^!B-U>!@CZ>rbPQ3!$B#5z zk`}>$miCALLZUrhQ|GC0Gy)QSCRn@wj?;?aL_v#L47-(MsJ)Ap zZH@rYr{g|s$^$O452ZA0z>xq7-%ua~((_`^bJlEO$Ggy=W)Q8&XbM2=68=rp^(v=p zTE=u*%LCkO_~PxT8x2K3L-2z|X0)}bYueno3085f_5zS*qkMDafur!Ptq_Fe!JD!q zTuGPxSI_*9&>%1fiF6l3Y%^;oV9BKdUCfUz6d}@BKV}#R*fak8r>+9dV%5`D^Dikk z-*dT5VNhH)ZsB=ubm!`<-`krZ#0Zjxl>rE|`x1|E*?jhJEo?rJZ!Wct=aA1B{QkTE zi-Oh<47D4aSYbwH#OP`Pd{MR3=Eoz#O%WNr9zg7hadFyFnIwC=?!BJY*^m**Y zA%4pJ2;wr_d1`rB*)DtOut?u&*nq7$n8LBO)^Q1*mf^iyN3>$zdw4qL{ptMmT4)iv z)V0y!4b;^TYuQ00r)g)GP~N=dyR3{-FfC2@{v%y`$fQ4c-Bg|3-v#aC=w!8-A)cD< zjN!EBN$*qinT;+;F`E6b0jPQZF8p>^dF1aV0cI0ge4;7e2b8|^P`C))2+uhKrN!!5_PC6$_k{2G1Dkh!6Ue=KJogBqY zaT@_)n<@u^>nB*p`yjU5&*vSX_$UFC_>o&S-d=>AClOtgn<@hLlUF_UFyzoXS zxN3frCw?V!sFFKUAr5FkpER+Bio7J?vh_RM2wJOR9yLawqCd;ZpkKd|?2niG&F4q& zlW-u}4)za5;B@HV+d&m1epW^^dxa9D37EOj@2<1p(bB z^b%>4@NH|!*OHO7nNr~cGY`w7KWyy@L&3gH-X~Iu`gGjOfZ6OwAoXYdQ!Ylb2mHw& zD{2U2gtI?r;gO>8dH$SpU!z;ED}{{)3u~>0@>^f$iVx4A)w={;K24W5&u~V5tXDG{ zE#v*kl=g&O;vso?@~UejfD8}4bjw_-FT<_8{qVpsqL7_v+C}X{3?HrAKS=vRu#;}! zqJuwh4gY)@<>aJ9ua8aD-U{GtFN@{oM#3J8@QW}fv@28q!~aXWaiG+jKK%c3< z_CnJK4PgKQm$7$ofnzIr)swC+jTVWDXQditC#pbWdX;qGY~0xO`MT{=$(&AfS!9Td2&R?4jNXFXG*>kJe3m?LTPGY4@1AMhYfrhjlP8#85{TXm?|J(! z%(^?QigLBQ=QazF#dv1^&6;ZfDz2o~lVh#v+qU19tK%TV=-VQMOz7Fr+|~l)0 z;G^8k32`%SA3 zo@A|8Q&k_SJpO%Lk*J3PBT~+QSv|P8RYn+=Fny%vr?a~&V6&GUgb*~#dvDhBCBo*< z7h!S%qasL+y&v+1doF5XDP1UjbNAIqNQX305ImI_-a`rZ*|)G0xrj+LGX1ddB&)p^xDN*~!4p^8ei0AnA3twC#ym}Jk&67GJM9yE z-I6zkwuoOu7jFyM<;_(Y%*P}7(rLiypCVEu9ROk)DFkA7)65C7iqvyGCGf2X?^jRuIO=fal9`S{_AQsL|we%GH1&oPH^4dCL5D1oMYP z{&}fF4RNqz1vV?PgieCWwk zi5XKgY;J3!;mH7vr=iTeQ`Smv&cjvbz5c`+*67%qXCl{)&R!zyYys}O3J)W~=O4qV ziT)6_8=3qNe=GE++`NH|>zV?zu6A!9)?gp^9hkS{mL1pI1n)klPtO1#v`DU7e|^zk z_|cyIkKR`}iiG0|yRnHHzeO~ct-(o`Twwt>h@pHWA_>aT&6p1TL4h8noJ%88T3Ljp z==W&Ju%ydM4$b&pt?`-wk8GxqCDp*604Q5_UzJPs=HSO1iT9fS+VWMS_H?r&@P4?k9&CDV zMjekbp5l<3U|2@RggLxLHyn&OV9kVJIm?WW(rGNf!02WTPZyhF5E8Sok!5V~XQ3oh zh~`TMN~v>y+X*N1HLc%*?^%}f7PwxazCow?JK@J95B!p7r}vR9U^yNarZ+FoE}_3b z{%ksvVe5Ah&chb>%HT9O2^=i|adnIQ|o4qr(ce zEv5zMS4e@&bOrM=-`4zm3QK9ZPvpImKCIa#3AAeZeZ4{Fu&S9RzfOqr&#i+N6*Wn3&ht= zyC4cRxUhMy-HYI?JMp7=+B0v0)i=N18kW+&D!HEw=`D`F=DhIa3w1qqPd~9BhWJMz z`;ca%<2sRe#c@PueegBJZ*i&*8aFmz|H+Ci`Eb0}u+(nS-K>>vwYw*{T+wAUU(^!T z!#l`72*Q`a@wS8M+F}POv9B3Zz?CbAb(GY|lmJq98ouppv%OrNSh+fSAv2}3v1E3- z{36{dY_0`FA=`*+wsl4LwAI39UhD86hfv@zRL7L!IO9avT<>A>4YRM+pz{0TI$oe4gcMo=_BZ|&)?m~N$C;^0#{|^iDt?OUj>Ri!Y zzFoaV!gGkdhd0{u)NeOsEHek*HhEl)qmJ*e@Cjr>sj^>A0fY*TBu0F>H27DDsY(Pj z`_bu<Jr48T~k%+Z}QJx}+x(=#hH=_RpJ+8|`S&nQa;jvP#nM#sN2X zM*UC(XmZQSdWMS?AwCo#7Z1@Uw*zjJY zAm3(ydw?175yEx~Jj>QxiwLCFZf&=^GA9Hl>fDSd<{~G`z?P0}KrZo{cb3J-Myb>4 z6whE(!H~ONYeGRy9YH6GuY2>X_@4{7A(JA5EnOuf0nNnnUFNd}4w|{fC^+y_ zys=%`iqBU*cUe+Y@ndRs;=ZG$+gH^biY@Ot0G?@*e)f<0U0XXH4>vQcsrg;zi@90^ z@c?&!`qM{U;k(}(yj2=%`a3;O{N*KoaK+@eW+{^4E;H^~jNVJ$#=Oabp{&vR7j3M? zyb`RLHV-=J1QRI-Uo?egT~)-EBGP9zm)>-J29& zjH9YxF)&biU#{g`xVF|Ck^azO_^zJlJXC+xzDm#~kuIKTDYIFzPw|zyFoTk%bv;JJ zeM%zUntKF%&Lj%VXXUXZga&?R2vZ#yvPvf+(&os(iLo-52(tLQH4A$=66f9S{eaXA zF%Ul_BJLJGZ$kiD2Y;Zzmn<%oUS5xVe7^Up#eHOw`}|DF;M>n^TvHZK;4yf%Oj0So zgwJTgZCS0a7gK~fdoik|Vl$|3t%ndIHf%Y^9TV5VOYU1gK@N^O>0}+~3i2&uco-Rx z6liV5#4W0sQjJWvkh|3XU>&qpyjR8Dc^BgUZtH`LJAVIp2?tM<3|EnYkjSqp#u~?D ztRfZ+{=@r%vk&uOC99M$K!kl$mk%g3_rzriyv z46R3^_}!XbPEIHN3Et2<8C}{#!rbb?oYuE z=Z~h2Le77ntuv#;zMyqW$q2j zMmRPn)>KW>|0rpMGP?h`X}fH$=!#Y&`VqIUh|;A zpj+T0U+WIOOyK~Nh_dydQ=@iqB)4{*CCl&MjkpT}jgFXKT-Ozi0Z>uAhX+yo3zE+8 z2we;WYu{8idtGjWX^#4FC&O2~CM-j03K)FKqc06xB3u!w-EE` zDZVD~zj+M&a%15MA4>IEC6VCZ`JW;fqn zv*tC|4=36H$W}FrNKRJ9~iq-dDMn5JMFg~3gDy~B)TE^oY$_`;K zq%I5xg%U(UTk8W=?RYtkQ2OF$uvH}7bE!adEX?F;R3dh8WK5{!YK1-W2p?jdV;Lkx zF9D!M{v!IqaLh%10(#v4DAlMhwp?nQIZ=FZECUkRJXasoJcT1jH4g0b3890eZ`VCl z)$fuO_>bo9(-FmwiEOA*SZSgWPZ)wC|@nxSE>i4hkOP#ewYcHpLBD*`Ig#Cd;z|ezkkRyJQk%D(p(97|9Z?O z(TIwAHF*OmI>+tD=}DVoUhFLMzWdR((ZC`An)kiZE2?H^bX0aWYg<1%j6dHrynB;C zE764r{Pve6$Kqp65?}z|lEEC4jSKKOk@Cn80F&!Osi5ffi+u8}3IH+B&AV}PtK?4p zrZeHU!N}A|r|>vTg11D`j6vE zWOz>rF2~3}hPV9}R<1HM#U3})Rl1cYokmBrR@#rMUj9$X^_PNKv#;|3N?B(!6;06x zGOJ}DblM-KX4QAxI=(wx?UQD4Wi}8EX}9XrEO5K@$S=&i2G==@30>}@DzRkpnsdi> zc!n@t*-WTpo$m2FN}UxS^{B7Q+PU^Ka-ll;PK}X{yo}sr^xTS|QhK1_Lg6Hu8w{CyA?hyXHf$z-A zus?2*jheoDvH(VoU%v9=Zv(l(`u$j9jNOlXd4oiOtey~^fXx}PwIxeUU(I-F#CY=y zu#pXW#yx8&iGK%E=9&zTMaeVM`O%Dru*+Xl9}p>`tH`k^LWkZVVm0fGHEV-kXcEvC z)PvT|3Ct6NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk6B=XD}e&-`#;~0 zH4Z=RoxALbZgTj-OJOeBf;^`dxSU-wfyLW(W1I+Qh=}WAftnY6u^dibp2FNl9SS`8 zs*@boI;J&FXA!;Z5nJxhuUZ+owd(74Gvnvq4G;6Mhs`~5=Rk@R?-`w%6oWJU`L=GR zmwH@xvriG4(qpz}vuSE$Ia`STfz488KbZFwcWZhos7lS3(K-L+6m#gFNvmppGH+&O zxnsOQPpr$War@?*Ue+d!Q+na8>xhRA%YTjz79> z3}jtapFT8abw~GnJ(*vxVt*B^|GYZ*w#>GSxGd!`mQ!jQ+M046NbFhB^f6+e|CHUl zTW5Ijzn=4M?zZoDCZ2ZBp3F0u_0zMi1NS#2EPp@cX6848OEP*)>#yvI&p)$z=DR#w z1K~S@N;Xq{OuGNRQoWu(W&7t?Q_tVCFE6s~6JgUnx6W?y`O`L4(OQdoUh7$&FrR(* z+4|(AeE);JnNr&=BCnqfkEdEKhbE3d0+?bl0Kuq)%)?0bQ4w($KI77)FB z_u!&O$5eK_%bWOqlMwSUt8=QiULKye%DQ)b>in-#&yG6ZX6WJwxaD}HKwfF`ft7M= zlizL7yA$vsBjeAHrziKVE83=xI~z~3Jb1}lD!j7gk;LH)}h*ynmmaH88QMmbgZgq$HN4 zS|t~y0x1R~10y3{0~1{%!w@4wDH8cz{ dFtRc>urf4+Xz?KkVHp4b literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/previous_action@2x.png b/src/com.genericmale.sonos.sdPlugin/images/previous_action@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5eb7bc4859a2b4e5ab4b935a5e8523859df71a GIT binary patch literal 1417 zcmV;41$O$0P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/previous_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/previous_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c3fa3425fe6d536e8dbbfc6b48556e1ca00d5b GIT binary patch literal 5102 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 AYybcN literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/repeat_all_key.png b/src/com.genericmale.sonos.sdPlugin/images/repeat_all_key.png new file mode 100644 index 0000000000000000000000000000000000000000..1312d30eea95e0f35a29be7a89f18c8ba2393eb0 GIT binary patch literal 3946 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 Aa{vGU literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/repeat_all_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/repeat_all_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b95b25b3c506bc0bd0f09ab0d390cf957a0974db GIT binary patch literal 7275 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 V2`$CSK@SN4O;uf$N+s*){{lTI=z#zL literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/repeat_none_key.png b/src/com.genericmale.sonos.sdPlugin/images/repeat_none_key.png new file mode 100644 index 0000000000000000000000000000000000000000..fb964540afe903e3ed8862351fa6d967174d769f GIT binary patch literal 2966 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/repeat_none_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/repeat_none_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca5eecfd8e55eace79f6aaf0ec902a13572b9ed GIT binary patch literal 4948 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/repeat_one_key.png b/src/com.genericmale.sonos.sdPlugin/images/repeat_one_key.png new file mode 100644 index 0000000000000000000000000000000000000000..f611fffda795569e2b0afc5c2496d76f2d3fe181 GIT binary patch literal 4324 zcmZ{nRa_Hp)W^rD(alh5NC^mx4(aZ0>CS-&$mre_kd&#Tq#Gor(jWqgNK2Q*070a4 z@bZ7}-i!C*_x#Rtp3nDOoU7mS!pK0Ag7iKq005xS)>1RMbFKeGO>}n>M*0)n8G(ng zzA^ytA&ucpD_tmKa+q&X^k0RXBA zZ8c@H(7C-_xUJd7&A>929A6qF6w}C8x-P2D@99;#bnKjCusHdhQDR7?ZPO$t(bA^o z*j?x?chX?ixG()-b!^#Mk-%4d>dwoZ=GFbLPX0CcscX#n>ZJ@*GP^fLUe5Slor3?g!hWh-za4gW zpYshod@K35O*4&z?pMtRt9N09m6g161Z!B2`FC=&?zcGqV1Xa{6K~|_-RWq3l)ZUG-^g+h_WedoFb2t-%zmvxPA~ecxHsG|XyeO?IkFq2l}0(0QVz zon>|QczJxe`e@&fEu$9yZ>jf7N@jNdtp+D@6r>Rja}Lssa4croC7Po<>?i$dJ7 z5%Jf2i4Y1d6H=m@ho_uRc<#G$Q7dK&k}6+V!($wcV06o*_(uAI7E0ciCb`KkE`fm{ ztasc2;YAo9O2!D<7-a9}a~^C1J0Ej1`dlAYxM823q>bAmz<9&@rPb&B+5e$gVkqM&cR`gWMDX(p6p+x28{m(>Z@{m9pd`_BqdN zEzhOf6%Ly&+EgLDRV#Tfb&SgRdDX!y`{N1`Qz4fu=PRki$h-$gR1E9x1}GpQIEC0N z_LvFxR3o!hkAZhA?mC}^BQHisXON|<_@D1#q(HbLD4sJMN7H^kd$<=Rqa?W5l=JLu zLz)`d)O|vDwQG83Y~1yD;_J1Q56a03xEq3N$w$IxGyEs~n<^x%%+N7jU{O&W{K1OX z%(ds``4=hG+O7-Bjmv)2^Wk3&b$&d(-`Vp!qXT?E+bg%(Bm71%2JPRJCx1;(xNQCk z*OyW2nLgVn_T%8~a)hf_%-Kuitw>!*2AQrTVtGT4 z8T}2MBU!?L7N}*S8EYy)@eWvQh}?bB!&FR|Df1K|7ex_@9%w!`H6W;AWN-06EejP| zjgahFlZ8v`Mf*=qWcWD^8b-FOjQ0qrwAn_{IB#TBUV0-VdqH&;|+;ayuvjB&o@n8-b0z@eu)_d{GZx{u2!Gm-rk7%^5vXv|Y&O`4zAoV*eGrv2By zPd8vA3%+IK2*hdF(%lsD&?V7=zS?dc+iGW7%1B0PwM>VfAZ0~lQ~Vm+EjoIi+dck} zy|n8e(7+^~5DUUgE%n*)`^W^dqRkB`USqUuC4o~2IfFw-5f*!sTnm|djen)nZO8H7 z2rF>YjjpDin%K_dXZdmDed(t8UJ++M-}dt~E%E0PE4!CGMW6Olu_0w|VK*qg_Zhmt zZlTKI<1*g4KaH$~?0^Vk^>m8*( z$#CUxdPADG>+$F86Iw}cyvF8xVF>1e{m(V=RR8cgLu1#uOGQ|{sooTr*#lgL`#X7r zp+dN-(dJvZ%q@3~WIAel&kSWb)i^Ce5z`dfWF>m)Z%5sw-iBdMnQy3%?1SuQq>;Dq zYpSvM_iN>QilemvV@Msi<2|NZP8Uv?GTx8YlZAF3OgUwd{Ftwat>a=L7Bp0%j69z~ zS577JJ`bah`@&nK@UOnD zHKPieP33I9;T*SmAG&xl5h!julraN!(nU3n5p%-BoY`KEk95b;uF(5gl%E;{SeoVV zBr?(M^=%ScF33LzN*0rd7;T##&%$ids-88*&ut~~!)+6{aB132R8%8}&jS$By|Rhr z$aToxjjmnBAJ@5SFxnZv4Bdx8A%-(46fV69r)tBf3a>qub|HQ<)G)_p=a z$)?yIV{kfXe0E0k@7_8NIWSMHAmC~J$5P3LuY-G$LZ?d9f*{sCJy(c9`RZ$Dcn1n# zD%~^Hofb?wKI^_phRw0CtW7}i)W6i4RyC{ksRI5@5~Q1`myZy8lU$>$!)t3VO=PtD;)|2>n3ttDO5=jNedL7vpJ`t`1$G&?^`QE^V zK4TO+k8A_p5IczhizAnwvgLeimM%Ud8EnOMCuRQa7X6h~i#bXy-vAAEV&1(A3nUK@ zoOgT`n2{dkPFTEhGo=dFIPYD2zIeDX<&%5WHPg`Xr)S#nY!Y8U=T&^S1mSv^zLnh$ zXy6EmLANuL>k{u$N~vsp#Pf;JSfPK_(Pk$c+g!>pNL2Zb5W=hbyn&`fsj=jq_;pAk zeySf#uTh7uFRoc_=NqEj`fC5xnk~b0s#0)5@m|TSAaU>7*{i{^Wy%l96j7H74M!qb zrz3&Lk@Jzb+=@Em=l@8e?Q$`5Kz70DO-am*x%iw z_!P)t!4$G3z!8%3zS^EDpU5w>oqV)VHBPaB4{a_%Xy19FnwDaoo||`IzC^6VvoA_i z!c;_3+>^1>|A5lCk0kx?>l+AVN#(Wb4yhiN;4y$o&PHhy{&G_of(YpMN?0Iso*>`< z^Nb@Ti9;n?Fm$PM@nIK9k(Js90z>End;U{l|oQZH6k+MzfE=O3Au5;!%VW8?QggpvtZioaQbJfyV|}9VTh>YDP?Q zvhoZ)ubUPo*n_4);1J}4r<}R~|7K66?Bu9+lGPU0p(kBbmLA0H$F+E}tNK2WSb0?G zy=@&9(ubAbl`<%FiYlCB2bb~5ChMk>HOWZJf&*&QL+Y$8gtl$AS}k0L!q!PJ$h8mp zSvFruY&lVx2EhEf#S)1tP>CF`>tkyCZs zWn;U9>sm#_?AF|FR7|Q_qWZDjL%Sfv=Wmo%|EyTvOjQph2^6;WX2f$%xQ@eYCmzBNfrVPGY17MvK1?rbkxR5|^_lI*G`7E4R5#9yAJ1St~QIK6zw z2(il1$gdD0_5=Ok*oKsg?U&S9x98gGIR`1f+LC>b@*Re zG6Scd=gSuXf~=SPOO^HkY>RCsuIsE#*}5=ZM_YnrU^NFI3=btbE?ge zzJ0qX$~D9W$2mI8dLeO)H+}+g2!Oq<^3w=I5tLh2&i6i{cEv?)>RxKH=egueoBxI8eG9$;6b zvU&Nsr|IBKa6b>9-Jiw$wAzSk&%9d>Gfosp>6fox!}TE$U>7HcfzAH z|9Uj34hDoZe>bctIR#FSZ!Nf3vZ5U59a+4DxCG=uPyP0{qUl1Y%POwvQa|2tXpamG(Vj3HTYM7)f`9tvhW{WVK zFk8B|n9QuHkiJwOXRr~5taE&`Oa^kcCF0ckPJ;1jo@Xk22u(f%6_PY zPqZW?%ToP$`;H8QkyS>Xr;woa=-{?Af&V zj}4c0XRJx1t1dl{U3cCRe)Mu_`un%bXDu|!Z!Wh!faO}Tf;GF!ttQ#x?#Is^q;3`D z>J;QA>k{a8X8=*CsHh-RTu@ZTOhi;xLPl0XOaKa%g+hleufF~tz|Y^+%N_pz1Fhw% Q@H+sYt!|)Jr{Wm*Ke2Td)&Kwi literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/repeat_one_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/repeat_one_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3c87cf4709b0b8e56a9ec3be0fcd804c6663fe GIT binary patch literal 7934 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/shuffle_action.png b/src/com.genericmale.sonos.sdPlugin/images/shuffle_action.png new file mode 100644 index 0000000000000000000000000000000000000000..84b1807733af7b0fccbe0c94c401ec62282b5e56 GIT binary patch literal 1308 zcmV+%1>^dOP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 iR4_6+GcY2nq-)QlyGP03$_u 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/shuffle_off_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/shuffle_off_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90d28376668aaaa5968316c531507410048f3429 GIT binary patch literal 8262 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/shuffle_on_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/shuffle_on_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8f259fddd5245185dd7a2f3f0c128adad7af88 GIT binary patch literal 8976 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/unmuted_key.png b/src/com.genericmale.sonos.sdPlugin/images/unmuted_key.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f0d2a0750209eb2b086569764b8109bc0ebdc1 GIT binary patch literal 4644 zcmZ`-Ra6vEyPW}sLApU2r9+0HL8LpSh8h}VP&$SX7(xb+l15rmkP;LaN?KB+B&54T zIxqkKcJEsE;X8YM`>egc^Ku^c7p1GMLWEC;4*&p&)KnGq9#Hi^MT+}yf&yJ}9suW+ zoR%B_P!msZV-0%fS!`AHv;Y8q4gdfZ4gg#|P^e7+z#9SpY+C^UlIZ{djawGx<@1LN zTpJA)#i^DKiRXi9^?xgYm*znR0DGxvDS_8<7zw3>bvQB%001%y zHAOiC-LOLujBA%@Yx5VLs~cCL9n&t~cjW$lzH zD~bCNoVuL^Q&H|^5q5ojHFZyXDlHsJMW9@9?Vp2q&$v8QVmoxf_2tHG)-Q?Id&q;+ zHTVJDnfxJ*`>wI(U;?YCXpauRDXp_r-tV(rMBUw;vRUoAr8hiQ<|*%hBMAd!roybM z9!)HQfO>6y6k%sa27uh_L9wCk?t(%7Yg7fXk=47{V+~Rr9Wg$AFPm$*qayG&eIE=V;8y0YsFq&>_)!mpsBucEUh}0lt%$yT<5+6dK6aS{BHB zo?i~kekPU$AK`s#Or4E%Jc`&P{$|UJ*}cG-n%Vr$t-V$*bGlGBVh$XWFJRU-#y>bP zZaPWpT|5qL-crhxo94+OU$8!v_dmq(Qs`1cB>vv(r^Bm%UzWB=*mQL-Dt$|!8^AGE@=gq=r~YM&O4ywHtYm-d=l~UaDj{qk zoGQxwIygQ8xe@&R7DZxyHV{yE7^utfNLr(MrgE>HOjn6aCH7dg6jzFdc{|xil>A~W z!4&1B9;BsKeUr$nhMVT6&AInXA^yuGw>Q>O*v*G9$(fG9$b=wZd?>Q+&ZOkq+T2uw z7p!6oZXGlvKpy-)RK9+>z)6F&yo)lYYddl8+ETVYQe3Kl*jq#2Rj=}sbpxX)7fXvB zDQ_NI|6y?q7P`|%#rqCYDwlTFTGfs=Qz`a&OHJ2ifi#FUT`M=4bqyGdlD%*k+aDPd zk|U&;=;}pb`)u;vj=1Dr!(@?k?p^$xxUmZsi%^&xf^`@IN|t`2+77&Xb6#g6(n`>setnPAEYOF*m-ni^s~lv#;qSv% zUVqP&Yxo-P9=x2;^7*w%yIl@ysQkP!JCLMDI8)}lH?=zWy5^4NDoii0nKfwLv`{a5 zjbWPFA6@TRN&|$$zW?1k)xO-e#Xf8C_5l|Lr==twfcm*!W`j~)-kI6jBEUTICsZ&$ z5~zT^6g(S`g2~eNEt0Je-jDg%hMlav{K?oSDKvkufSa;R$@MW|f&`?uXwmI5*IRO7 zw;4R*5V25Z%4xlH726adf0drYNRbMmS#Oak z4%%Qly#4z+T0^jOZrlw4C?O*z6YaD*B!Po3p1otnBCgaNQ&_rKrXhOl=5T(=-`K)( zw87RkNTFL|)C=3;4B;V4VmDZ3ND0tLiIw&GlyL~?%#6rCwpER7ni9S@Q_b`}Qopki zPs{WZuDamxaaq6i1G5U9uXi90X2yR9@(oIgK8IKd2_GK)-8>d8wbTfhZy;(LWSk@F z+dqinCYz>Uxl-NDvqk6G1@+ZCy(ZNei@LJ9P~T&Rx3~3nzH@ni_dfwIFWeYjMV zCg5cfPESa+J!b(*^dcX9My93Gpwc;5(1|tc9Dz&moT*|SNVsB1lF@4^dNrMz)3BFC z&vySb(0d=oa;IxS-6T6Rki++mjx(EN8ZB3AoU0^4F_5M+%QU|&k1C%J<2NDj+#aPi*$hMkO zt?8#URnIDk*s~We3E>i!Ci{d$Kt20{IcXZYCS)474Wl8+M+-6hlHq-(ay!P(IEl=M z5^eGw!wX|VUO({2__RYY274@)phUH&;AH+!Bn$H8Q_9#*jNurdztjew)ibSw?wKUt zL)oXemPr7HZEyo(xLW_tX8&`xMy2dBaYo$G?v?AMu?B}^j zr@)U#bY@o>3xwrVqZ_px1sy_QG?y}{k`~su_U{;UC4W7nm5GT* zXS5M&xFD(Nr1dvK-wXZ38hf(-p{=LF)LH~1^&C886L><>7xzFpGuK3Y23JbuPLiBAYNid7qHgEeoG}tsH_t8Mwe6;tG5sESm3>1 z;cxCc{f}f3$6uMXZQP5 z9_*G)?pQtg^oKo8skZ^=^drT5<1Us4b55joz6`@Y5~DNuRzDy5zA~1n{HeK5XeUS0 z3yfj{lgCqD)a(nf(}SYzv#&Dl207q4ytx1yT3^D_t(A0Krdp@7FAe|!vwE_)4`MY> z|4vHvgqf8Nuw9QIPwWr9_!w->r0IOPg}nBc_wX>i&)Uj6p?Nph`tY}T9sDSD*MF+D z8MscIiibDTuD7Eh=6#MrJ|LPj*66OrFrr zTwG0zG2_k|uPh5puj<=v^^~Ub(1)xdztSb;Pul%?j@DURVOAE~7ba21lup=*S&6wc zqzP~)c8NR55C8Hjh<>}&ne0tO{2iS=4^A5EU!`lJXFQX31-D6XpzXUu>r%o@eCdO- zQ@5Zrh4DOVP~Qucs)}cURv!t2ikzPw1`h40(5UDNd_L&sV6o|DxRSTf4e{)Anu6S* z1+?Lz9SzIY5no3Ach0}uYMvgn%T)g!G_94r)q}IZf$b8hW*8Bk;%$6Knl^W)H%$6A z$?l61BYTl63_nt71sSG-oxQxJ*){D5xGbCM7lqQ7$eVc<0pSAC{&vC6Qxe+=uVyYs zb2nBuR4D1|i|;O3w?IAhf_Q5R%S+t3#0!(Ju?sxG+aIgY5g19O%DX&u?})dQZelLi zy2o9wp8!R5rp~XJS6Jo`{;+#k9#4X6FB7!+T$lEr4;w$ z{e3Y_X0Bx!M0PEtL=$( zEB5&5^_~WGJh=)lx>@EaEuN5L_161!2C%xta4NEuo{kTFW!9bLV#ux?)qhS5wn;Lz z!)eF5wEwp-DfiMhszS24ZUz@EEoHDkfGvh3b|wWaqc+(>WknO5?O(aP%8XL_jFHf_ zckg1NhwvHAs+%3&X)_7RyLLVGN_6eYoug;$JJ2N;&*YdR&-lo8*L6 zFOaiTYl3zs}(_8}A7KTs?C^!fPW(X1>@@JH1Q0F|idL>Md6$4fIAAXz1i1+VvEbN1V zQEbp3!WnMPC+xVR8Mp~T&|f7#slI26Cm>y@H2aO4eRZgtzlm;N+!?55WFP6z53J46 zR_E7N{oe1&DmRR!zC%jqy?J*nj z5ui8k>KW2{4+0nyO>@h0Z`lrs<{E!|tJG-idwbTg46-~Bhk}g?yZNu@sMX6J)0M3+ zoqZe~n3lG$eR)Y6v6*W;cSz#nZ=yX+3Ze~b7(V@y>4 z#Y*VSK?1=g_hI+XZ+6>N#_}g!{x}mqW1;xW`^w$8x^Xb#w;Hy5 zroF-{>^|fA!h`lk!v{SQ!1m-ln%4lGVh?d;McJ6s7*&IlBO-7(Rz5Zc*m=)gPBG<~}{zbP;s@ zY*?{!TM=+hE4&{EHWzpJzp?Zo!Ty&@LVYc}_|6_%7Of^5Wq4d95?dCpChP8=>Z8~x zDfq~7$4Eo!lXZ4Fj@M>F5##S_?PLzE2x53`ao0(NzHxdH<7hQUM~4e-kAR5{B2D;9 z6uU;{qo1@<9-0CpxFD062R}{S1QUTZ4)R#bH&a$Ob#JD#jVjz_YTrzsUNx*~p8Wiv z+~iD8M*>+t6Whs8#s_%?dd$t91S9GqPpqt64(3~`{wQ!Go2N$`!rZHm8btrI72tRJ zOE4&*jer@FA)C|v1G_6LmCK3lD;_d_BWAwRZSY2BfN^R2$-irbhm8rlmy)rUowb*} zq^*bj0|1~9D3l)}%ny|?5QIvKNJxr6c_9!<2*f$|(EWc2oL%h@4u1c?fMG;+=s^Hb MQ_@zfl(!1~A20c){r~^~ literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/unmuted_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/unmuted_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca2329d445ccbdf944e54b631bc4ed53266b662 GIT binary patch literal 9353 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 uc>ppnGBPbNGc7SOR4_6+GcY0dQW) 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 literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/volume_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/volume_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..76ee6c6c51ffd64fd7c05b38c4cdcc61b3c34314 GIT binary patch literal 9353 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%0ADzYR{HPUGxSzD(esHs^J!UAPPp5m1$7~1JH2`YU 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 E0Al&C{Qv*} literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/volumedown_action@2x.png b/src/com.genericmale.sonos.sdPlugin/images/volumedown_action@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3972fd5a002b26dd4c244cd1f1b6191d4e564f07 GIT binary patch literal 1816 zcmV+z2j}>SP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0063uBQgL0010qNS#tmY1h4=A1h4>*D;F>T000McNliru<^&xKJ2s&x_;>&S z1`A0reyYs8tzaCYruP!mG8ue5gZG z4be;igIc4TPLhN7KLCS8D0&BMOe7Y%kJq1H3_6H z47;871J9TJaLzpc-+lgP?>Xnfh(U(YICdLb;SXE>)qsn zVD_igd$Ea=z_uN(#66M*#_1q-2XE_!LY(V1ACF~)C3 z`gNsN4I~hlghnI%-mnGX=rU&R1Z&4Q{~Xhq?Jvg2xQuhCmS}p04Tu*2VIn2q2=DrA z!Ya4k8xp_cBm1l3*@T{Tb$(%K=ad_25Itaj!4_z=s0$6d)qHMzZT0YMVC#%Rd)5As zlTkZYC*-}hc+JO-3-jk7ip!D10yORh5JBHtn|a*7dF2~?;h6LFpsdBF1gRwt)+?VF zrw{_RqYYIz6Zb?uwBvbSzMRs}OY8(%o!7jM`Gp2QxBKlQOIs>p%Z^PKgTR5SHCO~d zxY;)T3+?ZdgSCQSt9CKis{J$As#Q!Ks}%&@R{mrhO&HkTZ~COFJ>|fJt#9o&tl$`} z1H5#g8*jNrI?csi`eg6)E4wO!iuV3yFg#Z+zOz9&Sa`@7+2HIg zndAXL`7t;T)_m}z%%hKgv;|E5AU^{og`{a8!kHg{^ujUtlY&?SzR8m-vgVp<3=w)z ziHqq&e-8@4d8c{eP2e361t3<#x7OTHWW`VZ1(Q7DdfJcy#Y|Al)ApPWPgYtY673Dv zq%jSB$xFXXjjXR(4!4ScE|kGr0rD`k=hScBGOIf@ccbg+LvL{@jA@$xGvB(XHV(5I zSjH0Z85aJ%Y?Gw0(t|Wh)l6e z7=dOGJ{-jNZuLH39r(P&DNYK5p4ypNoAUCZ7cF%+#SktW_XX@74>ZcUD^V}~e012pdfMa* zUkzU5s+=bx=A^8B!!J55PkB#`^NE}kJZkT*5_wi#AQtxrlsO>&VVKtWx7PA{^RKFt zdb4j_Sjp)5e?Sy(80J<-CjeLZ?X481-GVkOUlq&+?F8gC?)o(Db>|sBHKRZ|rLHjV z^J$PpKz08Xf4&=J#5LI(omi6GTiEsdAvs#xhFbhrHx3IOx9|M^vJ4owkOLrRE!sTM zJ3YU|VtcxsWn*JAq>`sTNdx-8gX*$&yrAsSvgr{0duW)-sNAN(;oMfPM9Y2&QcI1E z#R=P^u5IYfuL_W|@|u*DmC{^UnRL3c(!CmPov7mly5ak15uLpg^RHS8+S)8xj<}vv zVj;> zk{y;;98Yz>CvwH(BH0raJfyrxwCwj`^LCZurQ2ezUV198{4@7FJ^pPb_Z>9HIP|(6 z)4Hh}&3pU2Z~G?~{T~4WWE(K|L}3qD0^P6UwX(sz?=vGB(TH5=->NxkP@p8jD*ylh zC3HntbYx+4WjbSWWnpw>05UK#GA%GPEiy4wGBG+bGdeIZD=;uRFfcw-yet3!03~!q zSaf7zbY(hiZ)9m^c>ppnGBPbNGc7SOR4_6+GcYX*> literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/volumedown_key.png b/src/com.genericmale.sonos.sdPlugin/images/volumedown_key.png new file mode 100644 index 0000000000000000000000000000000000000000..55b8e1a5ea80e487ad988eba242bef9d9d1bb3c1 GIT binary patch literal 3080 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 IGq2nK0wA`vP5=M^ literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/volumedown_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/volumedown_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ed9d8e6c6f86c01cfdc0c74089404036be704354 GIT binary patch literal 5069 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 CNsa;l literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/volumeup_action.png b/src/com.genericmale.sonos.sdPlugin/images/volumeup_action.png new file mode 100644 index 0000000000000000000000000000000000000000..64572a3e48377f4723ba3a9c98137b0731cf94ed GIT binary patch literal 1285 zcmV+g1^W7lP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 uc>ppnGBPbNGc7SOR4_6+GcY0dQW) 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 MNn5c}-YWEe0NZG$?EnA( literal 0 HcmV?d00001 diff --git a/src/com.genericmale.sonos.sdPlugin/images/volumeup_key@2x.png b/src/com.genericmale.sonos.sdPlugin/images/volumeup_key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..76ee6c6c51ffd64fd7c05b38c4cdcc61b3c34314 GIT binary patch literal 9353 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%0ADzYR{HPUGxSzD(esHs^J!UAPPp5m1$7~1JH2`YU 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 tsF;u-2QRM}FE5_ifa?E);N + + diff --git a/src/com.genericmale.sonos.sdPlugin/pi/css/check.png b/src/com.genericmale.sonos.sdPlugin/pi/css/check.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e9e622cb4cd2396d583bfde341ab09ad46b347 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CF!3HE7boT!OQY`6?zK#qG8~eHcB(ehe3q4&N zLnI`V6BL;K{Qp0nx#MU@09PPWhz)bcd + + diff --git a/src/com.genericmale.sonos.sdPlugin/pi/css/elg_calendar.svg b/src/com.genericmale.sonos.sdPlugin/pi/css/elg_calendar.svg new file mode 100644 index 0000000..157e01b --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/pi/css/elg_calendar.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com.genericmale.sonos.sdPlugin/pi/css/elg_calendar_inv.svg b/src/com.genericmale.sonos.sdPlugin/pi/css/elg_calendar_inv.svg new file mode 100644 index 0000000..4f8af68 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/pi/css/elg_calendar_inv.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/com.genericmale.sonos.sdPlugin/pi/css/rcheck.svg b/src/com.genericmale.sonos.sdPlugin/pi/css/rcheck.svg new file mode 100644 index 0000000..af478ee --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/pi/css/rcheck.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/com.genericmale.sonos.sdPlugin/pi/css/sdpi.css b/src/com.genericmale.sonos.sdPlugin/pi/css/sdpi.css new file mode 100644 index 0000000..c9ebafe --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/pi/css/sdpi.css @@ -0,0 +1,1631 @@ +:root { + --sdpi-bgcolor: #2D2D2D; + --sdpi-background: #3D3D3D; + --sdpi-color: #d8d8d8; + --sdpi-bordercolor: #3a3a3a; + --sdpi-buttonbordercolor: #969696; + --sdpi-borderradius: 0px; + --sdpi-width: 224px; + --sdpi-fontweight: 600; + --sdpi-letterspacing: -0.25pt; +} + +html { + --sdpi-bgcolor: #2D2D2D; + --sdpi-background: #3D3D3D; + --sdpi-color: #d8d8d8; + --sdpi-bordercolor: #3a3a3a; + --sdpi-buttonbordercolor: #969696; + --sdpi-borderradius: 0px; + --sdpi-width: 224px; + --sdpi-fontweight: 600; + --sdpi-letterspacing: -0.25pt; + height: 100%; + width: 100%; + overflow: hidden; + touch-action:none; +} + +html, body { + --sdpi-bgcolor: #2D2D2D; + --sdpi-background: #3D3D3D; + --sdpi-color: #d8d8d8; + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 9pt; + background-color: var(--sdpi-bgcolor); + color: #9a9a9a; +} + +body { + height: 100%; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + margin: 0; + -webkit-overflow-scrolling: touch; + -webkit-text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; +} + +mark { + background-color: var(--sdpi-bgcolor); + color: var(--sdpi-color); +} + +hr, hr2 { + -webkit-margin-before: 1em; + -webkit-margin-after: 1em; + border-style: none; + background: var(--sdpi-background); + height: 1px; +} + +hr2, +.sdpi-heading { + display: flex; + flex-basis: 100%; + align-items: center; + color: inherit; + font-size: 9pt; + margin: 8px 0px; +} + +.sdpi-heading::before, +.sdpi-heading::after { + content: ""; + flex-grow: 1; + background: var(--sdpi-background); + height: 1px; + font-size: 0px; + line-height: 0px; + margin: 0px 16px; +} + +hr2 { + height: 2px; +} + +hr, hr2 { + margin-left:16px; + margin-right:16px; +} + +.sdpi-item-value, +option, +input, +select, +button { + font-size: 10pt; + font-weight: var(--sdpi-fontweight); + letter-spacing: var(--sdpi-letterspacing); +} + + + +.win .sdpi-item-value, +.win option, +.win input, +.win select, +.win button { + font-size: 11px; + font-style: normal; + letter-spacing: inherit; + font-weight: 100; +} + +.win button { + font-size: 12px; +} + +::-webkit-progress-value, +meter::-webkit-meter-optimum-value { + border-radius: 2px; + /* background: linear-gradient(#ccf, #99f 20%, #77f 45%, #77f 55%, #cdf); */ +} + +::-webkit-progress-bar, +meter::-webkit-meter-bar { + border-radius: 3px; + background: var(--sdpi-background); +} + +::-webkit-progress-bar:active, +meter::-webkit-meter-bar:active { + border-radius: 3px; + background: #222222; +} +::-webkit-progress-value:active, +meter::-webkit-meter-optimum-value:active { + background: #99f; +} + +progress, +progress.sdpi-item-value { + min-height: 5px !important; + height: 5px; + background-color: #303030; +} + +progress { + margin-top: 8px !important; + margin-bottom: 8px !important; +} + +.full progress, +progress.full { + margin-top: 3px !important; +} + +::-webkit-progress-inner-element { + background-color: transparent; +} + + +.sdpi-item[type="progress"] { + margin-top: 4px !important; + margin-bottom: 12px; + min-height: 15px; +} + +.sdpi-item-child.full:last-child { + margin-bottom: 4px; +} + +.tabs { + /** + * Setting display to flex makes this container lay + * out its children using flexbox, the exact same + * as in the above "Stepper input" example. + */ + display: flex; + + border-bottom: 1px solid #D7DBDD; +} + +.tab { + cursor: pointer; + padding: 5px 30px; + color: #16a2d7; + font-size: 9pt; + border-bottom: 2px solid transparent; +} + +.tab.is-tab-selected { + border-bottom-color: #4ebbe4; +} + +select { + -webkit-appearance: none; + -moz-appearance: none; + -o-appearance: none; + appearance: none; + background: url(caret.svg) no-repeat 97% center; +} + +label.sdpi-file-label, +input[type="button"], +input[type="submit"], +input[type="reset"], +input[type="file"], +input[type=file]::-webkit-file-upload-button, +button, +select { + color: var(--sdpi-color); + border: 1pt solid #303030; + font-size: 8pt; + background-color: var(--sdpi-background); + border-radius: var(--sdpi-borderradius); +} + +label.sdpi-file-label, +input[type="button"], +input[type="submit"], +input[type="reset"], +input[type="file"], +input[type=file]::-webkit-file-upload-button, +button { + border: 1pt solid var(--sdpi-buttonbordercolor); + border-radius: var(--sdpi-borderradius); + border-color: var(--sdpi-buttonbordercolor); + min-height: 23px !important; + height: 23px !important; + margin-right: 8px; +} + +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} + +input[type="file"] { + border-radius: var(--sdpi-borderradius); + max-width: 220px; +} + +option { + height: 1.5em; + padding: 4px; +} + +/* SDPI */ + +.sdpi-wrapper { + overflow-x: hidden; + height: 100%; +} + +.sdpi-item { + display: flex; + flex-direction: row; + min-height: 32px; + align-items: center; + margin-top: 2px; + max-width: 344px; + /* -webkit-user-drag: none; */ +} + +.sdpi-item:first-child { + margin-top:-1px; +} + +.sdpi-item:last-child { + margin-bottom: 0px; +} + +.sdpi-item > *:not(.sdpi-item-label):not(meter):not(details):not(canvas) { + min-height: 26px; + padding: 0px 4px 0px 4px; +} + +.sdpi-item > *:not(.sdpi-item-label.empty):not(meter) { + min-height: 26px; + padding: 0px 4px 0px 4px; +} + + +.sdpi-item-group { + padding: 0 !important; +} + +meter.sdpi-item-value { + margin-left: 6px; +} + +.sdpi-item[type="group"] { + display: block; + margin-top: 12px; + margin-bottom: 12px; + /* border: 1px solid white; */ + flex-direction: unset; + text-align: left; +} + +.sdpi-item[type="group"] > .sdpi-item-label, +.sdpi-item[type="group"].sdpi-item-label { + width: 96%; + text-align: left; + font-weight: 700; + margin-bottom: 4px; + padding-left: 4px; +} + +dl, +ul, +ol { + -webkit-margin-before: 0px; + -webkit-margin-after: 4px; + -webkit-padding-start: 1em; + max-height: 90px; + overflow-y: scroll; + cursor: pointer; + user-select: none; +} + +table.sdpi-item-value, +dl.sdpi-item-value, +ul.sdpi-item-value, +ol.sdpi-item-value { + -webkit-margin-before: 4px; + -webkit-margin-after: 8px; + -webkit-padding-start: 1em; + width: var(--sdpi-width); + text-align: center; +} + +table > caption { + margin: 2px; +} + +.list, +.sdpi-item[type="list"] { + align-items: baseline; +} + +.sdpi-item-label { + text-align: right; + flex: none; + width: 94px; + padding-right: 4px; + font-weight: 600; + -webkit-user-select: none; +} + +.win .sdpi-item-label, +.sdpi-item-label > small{ + font-weight: normal; +} + +.sdpi-item-label:after { + content: ": "; +} + +.sdpi-item-label.empty:after { + content: ""; +} + +.sdpi-test, +.sdpi-item-value { + flex: 1 0 0; + /* flex-grow: 1; + flex-shrink: 0; */ + margin-right: 14px; + margin-left: 4px; + justify-content: space-evenly; +} + +canvas.sdpi-item-value { + max-width: 144px; + max-height: 144px; + width: 144px; + height: 144px; + margin: 0 auto; + cursor: pointer; +} + +input.sdpi-item-value { + margin-left: 5px; +} + +.sdpi-item-value button, +button.sdpi-item-value { + margin-left: 6px; + margin-right: 14px; +} + +.sdpi-item-value.range { + margin-left: 0px; +} + +table, +dl.sdpi-item-value, +ul.sdpi-item-value, +ol.sdpi-item-value, +.sdpi-item-value > dl, +.sdpi-item-value > ul, +.sdpi-item-value > ol +{ + list-style-type: none; + list-style-position: outside; + margin-left: -4px; + margin-right: -4px; + padding: 4px; + border: 1px solid var(--sdpi-bordercolor); +} + +dl.sdpi-item-value, +ul.sdpi-item-value, +ol.sdpi-item-value, +.sdpi-item-value > ol { + list-style-type: none; + list-style-position: inside; + margin-left: 5px; + margin-right: 12px; + padding: 4px !important; + display: flex; + flex-direction: column; +} + +.two-items li { + display: flex; +} +.two-items li > *:first-child { + flex: 0 0 50%; + text-align: left; +} +.two-items.thirtyseventy li > *:first-child { + flex: 0 0 30%; +} + +ol.sdpi-item-value, +.sdpi-item-value > ol[listtype="none"] { + list-style-type: none; +} +ol.sdpi-item-value[type="decimal"], +.sdpi-item-value > ol[type="decimal"] { + list-style-type: decimal; +} + +ol.sdpi-item-value[type="decimal-leading-zero"], +.sdpi-item-value > ol[type="decimal-leading-zero"] { + list-style-type: decimal-leading-zero; +} + +ol.sdpi-item-value[type="lower-alpha"], +.sdpi-item-value > ol[type="lower-alpha"] { + list-style-type: lower-alpha; +} + +ol.sdpi-item-value[type="upper-alpha"], +.sdpi-item-value > ol[type="upper-alpha"] { + list-style-type: upper-alpha; +} + +ol.sdpi-item-value[type="upper-roman"], +.sdpi-item-value > ol[type="upper-roman"] { + list-style-type: upper-roman; +} + +ol.sdpi-item-value[type="lower-roman"], +.sdpi-item-value > ol[type="lower-roman"] { + list-style-type: upper-roman; +} + +tr:nth-child(even), +.sdpi-item-value > ul > li:nth-child(even), +.sdpi-item-value > ol > li:nth-child(even), +li:nth-child(even) { + background-color: rgba(0,0,0,.2) +} + +td:hover, +.sdpi-item-value > ul > li:hover:nth-child(even), +.sdpi-item-value > ol > li:hover:nth-child(even), +li:hover:nth-child(even), +li:hover { + background-color: rgba(255,255,255,.1); +} + +td.selected, +td.selected:hover, +li.selected:hover, +li.selected { + color: white; + background-color: #77f; +} + +tr { + border: 1px solid var(--sdpi-bordercolor); +} + +td { + border-right: 1px solid var(--sdpi-bordercolor); + -webkit-user-select: none; +} + +tr:last-child, +td:last-child { + border: none; +} + +.sdpi-item-value.select, +.sdpi-item-value > select { + margin-right: 13px; + margin-left: 4px; +} + +.sdpi-item-child, +.sdpi-item-group > .sdpi-item > input[type="color"] { + margin-top: 0.4em; + margin-right: 4px; +} + +.full, +.full *, +.sdpi-item-value.full, +.sdpi-item-child > full > *, +.sdpi-item-child.full, +.sdpi-item-child.full > *, +.full > .sdpi-item-child, +.full > .sdpi-item-child > *{ + display: flex; + flex: 1 1 0; + margin-bottom: 4px; + margin-left: 0px; + width: 100%; + + justify-content: space-evenly; +} + +.sdpi-item-group > .sdpi-item > input[type="color"] { + margin-top: 0px; +} + +::-webkit-calendar-picker-indicator:focus, +input[type=file]::-webkit-file-upload-button:focus, +button:focus, +textarea:focus, +input:focus, +select:focus, +option:focus, +details:focus, +summary:focus, +.custom-select select { + outline: none; +} + +summary { + cursor: default; + -webkit-user-select: none; +} + +.pointer, +summary .pointer { + cursor: pointer; +} + +details * { + font-size: 12px; + font-weight: normal; +} + +details *:not(summary) { + margin-left: 13px +} + +details.message { + padding: 4px 18px 4px 12px; +} + +/*details.message summary { + font-size: 10pt; + font-weight: 600; + min-height: 18px; +}*/ + +details.message:first-child { + margin-top: 4px; + margin-left: 0; + padding-left: 102px; +} + +details.message h1 { + text-align: left; +} + +/*.message > summary::-webkit-details-marker { + display: none; +}*/ + +.info20, +.question, +.caution, +.info { + background-repeat: no-repeat; + background-position: 72px center; +} + +.info20 { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath fill='%23999' d='M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,8 C8.8954305,8 8,8.84275812 8,9.88235294 L8,16.1176471 C8,17.1572419 8.8954305,18 10,18 C11.1045695,18 12,17.1572419 12,16.1176471 L12,9.88235294 C12,8.84275812 11.1045695,8 10,8 Z M10,3 C8.8954305,3 8,3.88165465 8,4.96923077 L8,5.03076923 C8,6.11834535 8.8954305,7 10,7 C11.1045695,7 12,6.11834535 12,5.03076923 L12,4.96923077 C12,3.88165465 11.1045695,3 10,3 Z'/%3E%3C/svg%3E%0A"); +} + +.info { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath fill='%23999' d='M10,18 C5.581722,18 2,14.418278 2,10 C2,5.581722 5.581722,2 10,2 C14.418278,2 18,5.581722 18,10 C18,14.418278 14.418278,18 10,18 Z M10,8 C9.44771525,8 9,8.42137906 9,8.94117647 L9,14.0588235 C9,14.5786209 9.44771525,15 10,15 C10.5522847,15 11,14.5786209 11,14.0588235 L11,8.94117647 C11,8.42137906 10.5522847,8 10,8 Z M10,5 C9.44771525,5 9,5.44082732 9,5.98461538 L9,6.01538462 C9,6.55917268 9.44771525,7 10,7 C10.5522847,7 11,6.55917268 11,6.01538462 L11,5.98461538 C11,5.44082732 10.5522847,5 10,5 Z'/%3E%3C/svg%3E%0A"); +} + +.info2 { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='15' height='15' viewBox='0 0 15 15'%3E%3Cpath fill='%23999' d='M7.5,15 C3.35786438,15 0,11.6421356 0,7.5 C0,3.35786438 3.35786438,0 7.5,0 C11.6421356,0 15,3.35786438 15,7.5 C15,11.6421356 11.6421356,15 7.5,15 Z M7.5,2 C6.67157287,2 6,2.66124098 6,3.47692307 L6,3.52307693 C6,4.33875902 6.67157287,5 7.5,5 C8.32842705,5 9,4.33875902 9,3.52307693 L9,3.47692307 C9,2.66124098 8.32842705,2 7.5,2 Z M5,6 L5,7.02155172 L6,7 L6,12 L5,12.0076778 L5,13 L10,13 L10,12 L9,12.0076778 L9,6 L5,6 Z'/%3E%3C/svg%3E%0A"); +} + +.sdpi-more-info { + background-image: linear-gradient(to right, #00000000 0%,#00000040 80%), url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpolygon fill='%23999' points='4 7 8 7 8 5 12 8 8 11 8 9 4 9'/%3E%3C/svg%3E%0A"); +} +.caution { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath fill='%23999' fill-rule='evenodd' d='M9.03952676,0.746646542 C9.57068894,-0.245797319 10.4285735,-0.25196227 10.9630352,0.746646542 L19.7705903,17.2030214 C20.3017525,18.1954653 19.8777595,19 18.8371387,19 L1.16542323,19 C0.118729947,19 -0.302490098,18.2016302 0.231971607,17.2030214 L9.03952676,0.746646542 Z M10,2.25584053 L1.9601405,17.3478261 L18.04099,17.3478261 L10,2.25584053 Z M10,5.9375 C10.531043,5.9375 10.9615385,6.37373537 10.9615385,6.91185897 L10.9615385,11.6923077 C10.9615385,12.2304313 10.531043,12.6666667 10,12.6666667 C9.46895697,12.6666667 9.03846154,12.2304313 9.03846154,11.6923077 L9.03846154,6.91185897 C9.03846154,6.37373537 9.46895697,5.9375 10,5.9375 Z M10,13.4583333 C10.6372516,13.4583333 11.1538462,13.9818158 11.1538462,14.6275641 L11.1538462,14.6641026 C11.1538462,15.3098509 10.6372516,15.8333333 10,15.8333333 C9.36274837,15.8333333 8.84615385,15.3098509 8.84615385,14.6641026 L8.84615385,14.6275641 C8.84615385,13.9818158 9.36274837,13.4583333 10,13.4583333 Z'/%3E%3C/svg%3E%0A"); +} + +.question { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath fill='%23999' d='M10,18 C5.581722,18 2,14.418278 2,10 C2,5.581722 5.581722,2 10,2 C14.418278,2 18,5.581722 18,10 C18,14.418278 14.418278,18 10,18 Z M6.77783203,7.65332031 C6.77783203,7.84798274 6.85929281,8.02888914 7.0222168,8.19604492 C7.18514079,8.36320071 7.38508996,8.44677734 7.62207031,8.44677734 C8.02409055,8.44677734 8.29703704,8.20768468 8.44091797,7.72949219 C8.59326248,7.27245865 8.77945854,6.92651485 8.99951172,6.69165039 C9.2195649,6.45678594 9.56233491,6.33935547 10.027832,6.33935547 C10.4256205,6.33935547 10.7006836,6.37695313 11.0021973,6.68847656 C11.652832,7.53271484 10.942627,8.472229 10.3750916,9.1321106 C9.80755615,9.79199219 8.29492188,11.9897461 10.027832,12.1347656 C10.4498423,12.1700818 10.7027991,11.9147157 10.7832031,11.4746094 C11.0021973,9.59857178 13.1254883,8.82415771 13.1254883,7.53271484 C13.1254883,7.07568131 12.9974785,6.65250846 12.7414551,6.26318359 C12.4854317,5.87385873 12.1225609,5.56600048 11.652832,5.33959961 C11.1831031,5.11319874 10.6414419,5 10.027832,5 C9.36767248,5 8.79004154,5.13541531 8.29492187,5.40625 C7.79980221,5.67708469 7.42317837,6.01879677 7.16503906,6.43139648 C6.90689975,6.8439962 6.77783203,7.25130007 6.77783203,7.65332031 Z M10.0099668,15 C10.2713191,15 10.5016601,14.9108147 10.7009967,14.7324415 C10.9003332,14.5540682 11,14.3088087 11,13.9966555 C11,13.7157177 10.9047629,13.4793767 10.7142857,13.2876254 C10.5238086,13.0958742 10.2890379,13 10.0099668,13 C9.72646591,13 9.48726565,13.0958742 9.2923588,13.2876254 C9.09745196,13.4793767 9,13.7157177 9,13.9966555 C9,14.313268 9.10077419,14.5596424 9.30232558,14.735786 C9.50387698,14.9119295 9.73975502,15 10.0099668,15 Z'/%3E%3C/svg%3E%0A"); +} + + +.sdpi-more-info { + position: fixed; + left: 0px; + right: 0px; + bottom: 0px; + min-height:16px; + padding-right: 16px; + text-align: right; + -webkit-touch-callout: none; + cursor: pointer; + user-select: none; + background-position: right center; + background-repeat: no-repeat; + border-radius: var(--sdpi-borderradius); + text-decoration: none; + color: var(--sdpi-color); +} + +.sdpi-bottom-bar { + display: flex; + align-self: right; + margin-left: auto; + position: fixed; + right: 17px; + bottom: 0px; + user-select: none; +} + +.sdpi-bottom-bar.right { + right: 0px; +} + +.sdpi-bottom-bar button { + min-height: 20px !important; + height: 20px !important; +} + + +.sdpi-more-info-button { + display: flex; + align-self: right; + margin-left: auto; + position: fixed; + right: 17px; + bottom: 0px; + user-select: none; +} + +details a { + background-position: right !important; + min-height: 24px; + display: inline-block; + line-height: 24px; + padding-right: 28px; +} + + +input:not([type="range"]), +textarea { + -webkit-appearance: none; + background: var(--sdpi-background); + color: var(--sdpi-color); + font-weight: normal; + font-size: 9pt; + border: none; + margin-top: 2px; + margin-bottom: 2px; + /*min-width: 219px;*/ +} + +textarea + label { + display: flex; + justify-content: flex-end +} +input[type="radio"], +input[type="checkbox"] { + display: none; +} +input[type="radio"] + label, +input[type="checkbox"] + label { + font-size: 9pt; + color: var(--sdpi-color); + font-weight: normal; + margin-right: 8px; + -webkit-user-select: none; +} + +input[type="radio"] + label:after, +input[type="checkbox"] + label:after { + content: " " !important; +} + +.sdpi-item[type="radio"] > .sdpi-item-value, +.sdpi-item[type="checkbox"] > .sdpi-item-value { + padding-top: 2px; +} + +.sdpi-item[type="checkbox"] > .sdpi-item-value > * { + margin-top: 4px; +} + +.sdpi-item[type="checkbox"] .sdpi-item-child, +.sdpi-item[type="radio"] .sdpi-item-child { + display: inline-block; +} + +.sdpi-item[type="range"] .sdpi-item-value, +.sdpi-item[type="meter"] .sdpi-item-child, +.sdpi-item[type="progress"] .sdpi-item-child { + display: flex; +} + +.sdpi-item[type="range"] .sdpi-item-value { + min-height: 26px; +} + +.sdpi-item[type="range"] .sdpi-item-value span, +.sdpi-item[type="meter"] .sdpi-item-child span, +.sdpi-item[type="progress"] .sdpi-item-child span { + margin-top: -2px; + min-width: 8px; + text-align: right; + user-select: none; + cursor: pointer; + -webkit-user-select: none; + user-select: none; +} + +.sdpi-item[type="range"] .sdpi-item-value span { + margin-top: 7px; + text-align: right; +} + +span + input[type="range"] { + display: flex; + max-width: 168px; + +} + +.sdpi-item[type="range"] .sdpi-item-value span:first-child, +.sdpi-item[type="meter"] .sdpi-item-child span:first-child, +.sdpi-item[type="progress"] .sdpi-item-child span:first-child { + margin-right: 4px; +} + +.sdpi-item[type="range"] .sdpi-item-value span:last-child, +.sdpi-item[type="meter"] .sdpi-item-child span:last-child, +.sdpi-item[type="progress"] .sdpi-item-child span:last-child { + margin-left: 4px; +} + +.reverse { + transform: rotate(180deg); +} + +.sdpi-item[type="meter"] .sdpi-item-child meter + span:last-child { + margin-left: -10px; +} + +.sdpi-item[type="progress"] .sdpi-item-child meter + span:last-child { + margin-left: -14px; +} + +.sdpi-item[type="radio"] > .sdpi-item-value > * { + margin-top: 2px; +} + +details { + padding: 8px 18px 8px 12px; + min-width: 86px; +} + +details > h4 { + border-bottom: 1px solid var(--sdpi-bordercolor); +} + +legend { + display: none; +} +.sdpi-item-value > textarea { + padding: 0px; + width: 219px; + margin-left: 1px; + margin-top: 3px; + padding: 4px; +} + +input[type="radio"] + label span, +input[type="checkbox"] + label span { + display: inline-block; + width: 16px; + height: 16px; + margin: 2px 4px 2px 0; + border-radius: 3px; + vertical-align: middle; + background: var(--sdpi-background); + cursor: pointer; + border: 1px solid rgb(0,0,0,.2); +} + +input[type="radio"] + label span { + border-radius: 100%; +} + +input[type="radio"]:checked + label span, +input[type="checkbox"]:checked + label span { + background-color: #77f; + background-image: url(check.svg); + background-repeat: no-repeat; + background-position: center center; + border: 1px solid rgb(0,0,0,.4); +} + +input[type="radio"]:active:checked + label span, +input[type="radio"]:active + label span, +input[type="checkbox"]:active:checked + label span, +input[type="checkbox"]:active + label span { + background-color: #303030; +} + +input[type="radio"]:checked + label span { + background-image: url(rcheck.svg); +} + +input[type="range"] { + width: var(--sdpi-width); + height: 30px; + overflow: hidden; + cursor: pointer; + background: transparent !important; +} + +.sdpi-item > input[type="range"] { + margin-left: 2px; + max-width: var(--sdpi-width); + width: var(--sdpi-width); + padding: 0px; + margin-top: 2px; +} + +/* +input[type="range"], +input[type="range"]::-webkit-slider-runnable-track, +input[type="range"]::-webkit-slider-thumb { + -webkit-appearance: none; +} +*/ + +input[type="range"]::-webkit-slider-runnable-track { + height: 5px; + background: #979797; + border-radius: 3px; + padding:0px !important; + border: 1px solid var(--sdpi-background); +} + +input[type="range"]::-webkit-slider-thumb { + position: relative; + background-color: var(--sdpi-color); + width: 12px; + height: 12px; + border-radius: 20px; + margin-top: -5px; + border: none; +} +input[type="range" i]{ + margin: 0; +} + +input[type="range"]::-webkit-slider-thumb::before { + position: absolute; + content: ""; + height: 5px; /* equal to height of runnable track or 1 less */ + width: 500px; /* make this bigger than the widest range input element */ + left: -502px; /* this should be -2px - width */ + top: 8px; /* don't change this */ + background: #77f; +} + +input[type="color"] { + min-width: 32px; + min-height: 32px; + width: 32px; + height: 32px; + padding: 0; + background-color: var(--sdpi-bgcolor); + flex: none; +} + +::-webkit-color-swatch { + min-width: 24px; +} + +textarea { + height: 3em; + word-break: break-word; + line-height: 1.5em; +} + +.textarea { + padding: 0px !important; +} + +textarea { + width: 219px; /*98%;*/ + height: 96%; + min-height: 6em; + resize: none; + border-radius: var(--sdpi-borderradius); +} + +/* CAROUSEL */ + +.sdpi-item[type="carousel"]{ + +} + +.sdpi-item.card-carousel-wrapper, +.sdpi-item > .card-carousel-wrapper { + padding: 0; +} + + +.card-carousel-wrapper { + display: flex; + align-items: center; + justify-content: center; + margin: 12px auto; + color: #666a73; +} + +.card-carousel { + display: flex; + justify-content: center; + width: 278px; +} +.card-carousel--overflow-container { + overflow: hidden; +} +.card-carousel--nav__left, +.card-carousel--nav__right { + /* display: inline-block; */ + width: 12px; + height: 12px; + border-top: 2px solid #42b883; + border-right: 2px solid #42b883; + cursor: pointer; + margin: 0 4px; + transition: transform 150ms linear; +} +.card-carousel--nav__left[disabled], +.card-carousel--nav__right[disabled] { + opacity: 0.2; + border-color: black; +} +.card-carousel--nav__left { + transform: rotate(-135deg); +} +.card-carousel--nav__left:active { + transform: rotate(-135deg) scale(0.85); +} +.card-carousel--nav__right { + transform: rotate(45deg); +} +.card-carousel--nav__right:active { + transform: rotate(45deg) scale(0.85); +} +.card-carousel-cards { + display: flex; + transition: transform 150ms ease-out; + transform: translatex(0px); +} +.card-carousel-cards .card-carousel--card { + margin: 0 5px; + cursor: pointer; + /* box-shadow: 0 4px 15px 0 rgba(40, 44, 53, 0.06), 0 2px 2px 0 rgba(40, 44, 53, 0.08); */ + background-color: #fff; + border-radius: 4px; + z-index: 3; +} +.xxcard-carousel-cards .card-carousel--card:first-child { + margin-left: 0; +} +.xxcard-carousel-cards .card-carousel--card:last-child { + margin-right: 0; +} +.card-carousel-cards .card-carousel--card img { + vertical-align: bottom; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + transition: opacity 150ms linear; + width: 60px; +} +.card-carousel-cards .card-carousel--card img:hover { + opacity: 0.5; +} +.card-carousel-cards .card-carousel--card--footer { + border-top: 0; + max-width: 80px; + overflow: hidden; + display: flex; + height: 100%; + flex-direction: column; +} +.card-carousel-cards .card-carousel--card--footer p { + padding: 3px 0; + margin: 0; + margin-bottom: 2px; + font-size: 15px; + font-weight: 500; + color: #2c3e50; +} +.card-carousel-cards .card-carousel--card--footer p:nth-of-type(2) { + font-size: 12px; + font-weight: 300; + padding: 6px; + color: #666a73; +} + + +h1 { + font-size: 1.3em; + font-weight: 500; + text-align: center; + margin-bottom: 12px; +} + +::-webkit-datetime-edit { + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + background: url(elg_calendar_inv.svg) no-repeat left center; + padding-right: 1em; + padding-left: 25px; + background-position: 4px 0px; + } +::-webkit-datetime-edit-fields-wrapper { + + } +::-webkit-datetime-edit-text { padding: 0 0.3em; } +::-webkit-datetime-edit-month-field { } +::-webkit-datetime-edit-day-field {} +::-webkit-datetime-edit-year-field {} +::-webkit-inner-spin-button { + + /* display: none; */ + } +::-webkit-calendar-picker-indicator { + background: transparent; + font-size: 17px; +} + +::-webkit-calendar-picker-indicator:focus { + background-color: rgba(0,0,0,0.2); +} + +input[type="date"] { + -webkit-align-items: center; + display: -webkit-inline-flex; + font-family: monospace; + overflow: hidden; + padding: 0; + -webkit-padding-start: 1px; +} + +input::-webkit-datetime-edit { + -webkit-flex: 1; + -webkit-user-modify: read-only !important; + display: inline-block; + min-width: 0; + overflow: hidden; +} + +/* +input::-webkit-datetime-edit-fields-wrapper { + -webkit-user-modify: read-only !important; + display: inline-block; + padding: 1px 0; + white-space: pre; + +} +*/ + +/* +input[type="date"] { + background-color: red; + outline: none; +} + +input[type="date"]::-webkit-clear-button { + font-size: 18px; + height: 30px; + position: relative; +} + +input[type="date"]::-webkit-inner-spin-button { + height: 28px; +} + +input[type="date"]::-webkit-calendar-picker-indicator { + font-size: 15px; +} */ + +input[type="file"] { + opacity: 0; + display: none; +} + +.sdpi-item > input[type="file"] { + opacity: 1; + display: flex; +} + +input[type="file"] + span { + display: flex; + flex: 0 1 auto; + background-color: #0000ff50; +} + +label.sdpi-file-label { + cursor: pointer; + user-select: none; + display: inline-block; + min-height: 21px !important; + height: 21px !important; + line-height: 20px; + padding: 0px 4px; + margin: auto; + margin-right: 0px; + float:right; +} + +.sdpi-file-label > label:active, +.sdpi-file-label.file:active, +label.sdpi-file-label:active, +label.sdpi-file-info:active, +input[type="file"]::-webkit-file-upload-button:active, +button:active { + background-color: var(--sdpi-color); + color:#303030; +} + +input:required:invalid, input:focus:invalid { + background: var(--sdpi-background) url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5IiBoZWlnaHQ9IjkiIHZpZXdCb3g9IjAgMCA5IDkiPgogICAgPHBhdGggZmlsbD0iI0Q4RDhEOCIgZD0iTTQuNSwwIEM2Ljk4NTI4MTM3LC00LjU2NTM4NzgyZS0xNiA5LDIuMDE0NzE4NjMgOSw0LjUgQzksNi45ODUyODEzNyA2Ljk4NTI4MTM3LDkgNC41LDkgQzIuMDE0NzE4NjMsOSAzLjA0MzU5MTg4ZS0xNiw2Ljk4NTI4MTM3IDAsNC41IEMtMy4wNDM1OTE4OGUtMTYsMi4wMTQ3MTg2MyAyLjAxNDcxODYzLDQuNTY1Mzg3ODJlLTE2IDQuNSwwIFogTTQsMSBMNCw2IEw1LDYgTDUsMSBMNCwxIFogTTQuNSw4IEM0Ljc3NjE0MjM3LDggNSw3Ljc3NjE0MjM3IDUsNy41IEM1LDcuMjIzODU3NjMgNC43NzYxNDIzNyw3IDQuNSw3IEM0LjIyMzg1NzYzLDcgNCw3LjIyMzg1NzYzIDQsNy41IEM0LDcuNzc2MTQyMzcgNC4yMjM4NTc2Myw4IDQuNSw4IFoiLz4KICA8L3N2Zz4) no-repeat 98% center; +} + +input:required:valid { + background: var(--sdpi-background) url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5IiBoZWlnaHQ9IjkiIHZpZXdCb3g9IjAgMCA5IDkiPjxwb2x5Z29uIGZpbGw9IiNEOEQ4RDgiIHBvaW50cz0iNS4yIDEgNi4yIDEgNi4yIDcgMy4yIDcgMy4yIDYgNS4yIDYiIHRyYW5zZm9ybT0icm90YXRlKDQwIDQuNjc3IDQpIi8+PC9zdmc+) no-repeat 98% center; +} + +.tooltip, +:tooltip, +:title { + color: yellow; +} +/* +[title]:hover { + display: flex; + align-items: center; + justify-content: center; +} + +[title]:hover::after { + content: ''; + position: absolute; + bottom: -1000px; + left: 8px; + display: none; + color: #fff; + border: 8px solid transparent; + border-bottom: 8px solid #000; +} + +[title]:hover::before { + content: attr(title); + display: flex; + justify-content: center; + align-self: center; + padding: 6px 12px; + border-radius: 5px; + background: rgba(0,0,0,0.8); + color: var(--sdpi-color); + font-size: 9pt; + font-family: sans-serif; + opacity: 1; + position: absolute; + height: auto; + + text-align: center; + bottom: 2px; + z-index: 100; + box-shadow: 0px 3px 6px rgba(0, 0, 0, .5); +} +*/ + +.sdpi-item-group.file { + width: 232px; + display: flex; + align-items: center; +} + +.sdpi-file-info { + overflow-wrap: break-word; + word-wrap: break-word; + hyphens: auto; + + min-width: 132px; + max-width: 144px; + max-height: 32px; + margin-top: 0px; + margin-left: 5px; + display: inline-block; + overflow: hidden; + padding: 6px 4px; + background-color: var(--sdpi-background); +} + + +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); +} + +::-webkit-scrollbar-thumb { + background-color: #999999; + outline: 1px solid slategrey; + border-radius: 8px; +} + +a { + color: #7397d2; +} + +.testcontainer { + display: flex; + background-color: #0000ff20; + max-width: 400px; + height: 200px; + align-content: space-evenly; +} + +input[type=range] { + /* background-color: green; */ + height:6px; + margin-top: 12px; + z-index: 0; + overflow: visible; +} + +/* +input[type="range"]::-webkit-slider-thumb { + -webkit-appearance: none; + background-color: var(--sdpi-color); + width: 12px; + height: 12px; + border-radius: 20px; + margin-top: -6px; + border: none; +} */ + +:-webkit-slider-thumb { + -webkit-appearance: none; + background-color: var(--sdpi-color); + width: 16px; + height: 16px; + border-radius: 20px; + margin-top: -6px; + border: 1px solid #999999; +} + +.sdpi-item[type="range"] .sdpi-item-group { + display: flex; + flex-direction: column; +} + +.xxsdpi-item[type="range"] .sdpi-item-group input { + max-width: 204px; +} + +.sdpi-item[type="range"] .sdpi-item-group span { + margin-left: 0px !important; +} + +.sdpi-item[type="range"] .sdpi-item-group > .sdpi-item-child { + display: flex; + flex-direction: row; +} + +.rangeLabel { + position:absolute; + font-weight:normal; + margin-top:22px; +} + +:disabled { + color: #993333; +} + +select, +select option { + color: var(--sdpi-color); +} + +select.disabled, +select option:disabled { + color: #fd9494; + font-style: italic; +} + +.runningAppsContainer { + display: none; +} + +/* debug +div { + background-color: rgba(64,128,255,0.2); +} +*/ + +.one-line { + min-height: 1.5em; +} + +.two-lines { + min-height: 3em; +} + +.three-lines { + min-height: 4.5em; +} + +.four-lines { + min-height: 6em; +} + +.min80 > .sdpi-item-child { + min-width: 80px; +} + +.min100 > .sdpi-item-child { + min-width: 100px; +} + +.min120 > .sdpi-item-child { + min-width: 120px; +} + +.min140 > .sdpi-item-child { + min-width: 140px; +} + +.min160 > .sdpi-item-child { + min-width: 160px; +} + +.min200 > .sdpi-item-child { + min-width: 200px; +} + +.max40 { + flex-basis: 40%; + flex-grow: 0; +} + +.max30 { + flex-basis: 30%; + flex-grow: 0; +} + +.max20 { + flex-basis: 20%; + flex-grow: 0; +} + +.up20 { + margin-top: -20px; +} + +.alignCenter { + align-items: center; +} + +.alignTop { + align-items: flex-start; +} + +.alignBaseline { + align-items: baseline; +} + +.noMargins, +.noMargins *, +.noInnerMargins * { + margin: 0; + padding: 0; +} + +.hidden { + display: none; +} + +.icon-help, +.icon-help-line, +.icon-help-fill, +.icon-help-inv, +.icon-brighter, +.icon-darker, +.icon-warmer, +.icon-cooler { + min-width: 20px; + width: 20px; + background-repeat: no-repeat; + opacity: 1; +} + +.icon-help:active, +.icon-help-line:active, +.icon-help-fill:active, +.icon-help-inv:active, +.icon-brighter:active, +.icon-darker:active, +.icon-warmer:active, +.icon-cooler:active { + opacity: 0.5; +} + +.icon-brighter, +.icon-darker, +.icon-warmer, +.icon-cooler { + margin-top: 5px !important; +} + +.icon-help, +.icon-help-line, +.icon-help-fill, +.icon-help-inv { + cursor: pointer; + margin: 0px; + margin-left: 4px; +} + +.icon-brighter { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Ccircle cx='10' cy='10' r='4'/%3E%3Cpath d='M14.8532861,7.77530426 C14.7173255,7.4682615 14.5540843,7.17599221 14.3666368,6.90157083 L16.6782032,5.5669873 L17.1782032,6.4330127 L14.8532861,7.77530426 Z M10.5,4.5414007 C10.2777625,4.51407201 10.051423,4.5 9.82179677,4.5 C9.71377555,4.5 9.60648167,4.50311409 9.5,4.50925739 L9.5,2 L10.5,2 L10.5,4.5414007 Z M5.38028092,6.75545367 C5.18389364,7.02383457 5.01124349,7.31068015 4.86542112,7.61289977 L2.82179677,6.4330127 L3.32179677,5.5669873 L5.38028092,6.75545367 Z M4.86542112,12.3871002 C5.01124349,12.6893198 5.18389364,12.9761654 5.38028092,13.2445463 L3.32179677,14.4330127 L2.82179677,13.5669873 L4.86542112,12.3871002 Z M9.5,15.4907426 C9.60648167,15.4968859 9.71377555,15.5 9.82179677,15.5 C10.051423,15.5 10.2777625,15.485928 10.5,15.4585993 L10.5,18 L9.5,18 L9.5,15.4907426 Z M14.3666368,13.0984292 C14.5540843,12.8240078 14.7173255,12.5317385 14.8532861,12.2246957 L17.1782032,13.5669873 L16.6782032,14.4330127 L14.3666368,13.0984292 Z'/%3E%3C/g%3E%3C/svg%3E"); +} +.icon-darker { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Cpath d='M10 14C7.790861 14 6 12.209139 6 10 6 7.790861 7.790861 6 10 6 12.209139 6 14 7.790861 14 10 14 12.209139 12.209139 14 10 14zM10 13C11.6568542 13 13 11.6568542 13 10 13 8.34314575 11.6568542 7 10 7 8.34314575 7 7 8.34314575 7 10 7 11.6568542 8.34314575 13 10 13zM14.8532861 7.77530426C14.7173255 7.4682615 14.5540843 7.17599221 14.3666368 6.90157083L16.6782032 5.5669873 17.1782032 6.4330127 14.8532861 7.77530426zM10.5 4.5414007C10.2777625 4.51407201 10.051423 4.5 9.82179677 4.5 9.71377555 4.5 9.60648167 4.50311409 9.5 4.50925739L9.5 2 10.5 2 10.5 4.5414007zM5.38028092 6.75545367C5.18389364 7.02383457 5.01124349 7.31068015 4.86542112 7.61289977L2.82179677 6.4330127 3.32179677 5.5669873 5.38028092 6.75545367zM4.86542112 12.3871002C5.01124349 12.6893198 5.18389364 12.9761654 5.38028092 13.2445463L3.32179677 14.4330127 2.82179677 13.5669873 4.86542112 12.3871002zM9.5 15.4907426C9.60648167 15.4968859 9.71377555 15.5 9.82179677 15.5 10.051423 15.5 10.2777625 15.485928 10.5 15.4585993L10.5 18 9.5 18 9.5 15.4907426zM14.3666368 13.0984292C14.5540843 12.8240078 14.7173255 12.5317385 14.8532861 12.2246957L17.1782032 13.5669873 16.6782032 14.4330127 14.3666368 13.0984292z'/%3E%3C/g%3E%3C/svg%3E"); +} +.icon-warmer { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Cpath d='M12.3247275 11.4890349C12.0406216 11.0007637 11.6761954 10.5649925 11.2495475 10.1998198 11.0890394 9.83238991 11 9.42659309 11 9 11 7.34314575 12.3431458 6 14 6 15.6568542 6 17 7.34314575 17 9 17 10.6568542 15.6568542 12 14 12 13.3795687 12 12.8031265 11.8116603 12.3247275 11.4890349zM17.6232392 11.6692284C17.8205899 11.4017892 17.9890383 11.1117186 18.123974 10.8036272L20.3121778 12.0669873 19.8121778 12.9330127 17.6232392 11.6692284zM18.123974 7.19637279C17.9890383 6.88828142 17.8205899 6.5982108 17.6232392 6.33077158L19.8121778 5.0669873 20.3121778 5.9330127 18.123974 7.19637279zM14.5 4.52746439C14.3358331 4.50931666 14.1690045 4.5 14 4.5 13.8309955 4.5 13.6641669 4.50931666 13.5 4.52746439L13.5 2 14.5 2 14.5 4.52746439zM13.5 13.4725356C13.6641669 13.4906833 13.8309955 13.5 14 13.5 14.1690045 13.5 14.3358331 13.4906833 14.5 13.4725356L14.5 16 13.5 16 13.5 13.4725356zM14 11C15.1045695 11 16 10.1045695 16 9 16 7.8954305 15.1045695 7 14 7 12.8954305 7 12 7.8954305 12 9 12 10.1045695 12.8954305 11 14 11zM9.5 11C10.6651924 11.4118364 11.5 12.5 11.5 14 11.5 16 10 17.5 8 17.5 6 17.5 4.5 16 4.5 14 4.5 12.6937812 5 11.5 6.5 11L6.5 7 9.5 7 9.5 11z'/%3E%3Cpath d='M12,14 C12,16.209139 10.209139,18 8,18 C5.790861,18 4,16.209139 4,14 C4,12.5194353 4.80439726,11.2267476 6,10.5351288 L6,4 C6,2.8954305 6.8954305,2 8,2 C9.1045695,2 10,2.8954305 10,4 L10,10.5351288 C11.1956027,11.2267476 12,12.5194353 12,14 Z M11,14 C11,12.6937812 10.1651924,11.5825421 9,11.1707057 L9,4 C9,3.44771525 8.55228475,3 8,3 C7.44771525,3 7,3.44771525 7,4 L7,11.1707057 C5.83480763,11.5825421 5,12.6937812 5,14 C5,15.6568542 6.34314575,17 8,17 C9.65685425,17 11,15.6568542 11,14 Z'/%3E%3C/g%3E%3C/svg%3E"); +} + +.icon-cooler { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Cpath d='M10.4004569 11.6239517C10.0554735 10.9863849 9.57597206 10.4322632 9 9.99963381L9 9.7450467 9.53471338 9.7450467 10.8155381 8.46422201C10.7766941 8.39376637 10.7419749 8.32071759 10.7117062 8.2454012L9 8.2454012 9 6.96057868 10.6417702 6.96057868C10.6677696 6.86753378 10.7003289 6.77722682 10.7389179 6.69018783L9.44918707 5.40045694 9 5.40045694 9 4.34532219 9.32816127 4.34532219 9.34532219 2.91912025 10.4004569 2.91912025 10.4004569 4.53471338 11.6098599 5.74411634C11.7208059 5.68343597 11.8381332 5.63296451 11.9605787 5.59396526L11.9605787 3.8884898 10.8181818 2.74609294 11.5642748 2 12.5727518 3.00847706 13.5812289 2 14.3273218 2.74609294 13.2454012 3.82801356 13.2454012 5.61756719C13.3449693 5.65339299 13.4408747 5.69689391 13.5324038 5.74735625L14.7450467 4.53471338 14.7450467 2.91912025 15.8001815 2.91912025 15.8001815 4.34532219 17.2263834 4.34532219 17.2263834 5.40045694 15.6963166 5.40045694 14.4002441 6.69652946C14.437611 6.78161093 14.4692249 6.86979146 14.4945934 6.96057868L16.2570138 6.96057868 17.3994107 5.81818182 18.1455036 6.56427476 17.1370266 7.57275182 18.1455036 8.58122888 17.3994107 9.32732182 16.3174901 8.2454012 14.4246574 8.2454012C14.3952328 8.31861737 14.3616024 8.38969062 14.3240655 8.45832192L15.6107903 9.7450467 17.2263834 9.7450467 17.2263834 10.8001815 15.8001815 10.8001815 15.8001815 12.2263834 14.7450467 12.2263834 14.7450467 10.6963166 13.377994 9.32926387C13.3345872 9.34850842 13.2903677 9.36625331 13.2454012 9.38243281L13.2454012 11.3174901 14.3273218 12.3994107 13.5812289 13.1455036 12.5848864 12.1491612 11.5642748 13.1455036 10.8181818 12.3994107 11.9605787 11.2570138 11.9605787 9.40603474C11.8936938 9.38473169 11.828336 9.36000556 11.7647113 9.33206224L10.4004569 10.6963166 10.4004569 11.6239517zM12.75 8.5C13.3022847 8.5 13.75 8.05228475 13.75 7.5 13.75 6.94771525 13.3022847 6.5 12.75 6.5 12.1977153 6.5 11.75 6.94771525 11.75 7.5 11.75 8.05228475 12.1977153 8.5 12.75 8.5zM9.5 14C8.5 16.3333333 7.33333333 17.5 6 17.5 4.66666667 17.5 3.5 16.3333333 2.5 14L9.5 14z'/%3E%3Cpath d='M10,14 C10,16.209139 8.209139,18 6,18 C3.790861,18 2,16.209139 2,14 C2,12.5194353 2.80439726,11.2267476 4,10.5351288 L4,4 C4,2.8954305 4.8954305,2 6,2 C7.1045695,2 8,2.8954305 8,4 L8,10.5351288 C9.19560274,11.2267476 10,12.5194353 10,14 Z M9,14 C9,12.6937812 8.16519237,11.5825421 7,11.1707057 L7,4 C7,3.44771525 6.55228475,3 6,3 C5.44771525,3 5,3.44771525 5,4 L5,11.1707057 C3.83480763,11.5825421 3,12.6937812 3,14 C3,15.6568542 4.34314575,17 6,17 C7.65685425,17 9,15.6568542 9,14 Z'/%3E%3C/g%3E%3C/svg%3E"); +} + +.icon-help { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath fill='%23999' d='M11.292 12.516l.022 1.782H9.07v-1.804c0-1.98 1.276-2.574 2.662-3.278h-.022c.814-.44 1.65-.88 1.694-2.2.044-1.386-1.122-2.728-3.234-2.728-1.518 0-2.662.902-3.366 2.354L5 5.608C5.946 3.584 7.662 2 10.17 2c3.564 0 5.632 2.442 5.588 5.06-.066 2.618-1.716 3.41-3.102 4.158-.704.374-1.364.682-1.364 1.298zm-1.122 2.442c.858 0 1.452.594 1.452 1.452 0 .682-.594 1.408-1.452 1.408-.77 0-1.386-.726-1.386-1.408 0-.858.616-1.452 1.386-1.452z'/%3E%3C/svg%3E"); +} + +.icon-help-line { + background-image: url("data:image/svg+xml,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Cpath d='M10 20C4.477 20 0 15.523 0 10S4.477 0 10 0s10 4.477 10 10-4.477 10-10 10zm0-1a9 9 0 1 0 0-18 9 9 0 0 0 0 18z'/%3E%3Cpath d='M10.848 12.307l.02 1.578H8.784v-1.597c0-1.753 1.186-2.278 2.474-2.901h-.02c.756-.39 1.533-.78 1.574-1.948.041-1.226-1.043-2.414-3.006-2.414-1.41 0-2.474.798-3.128 2.083L5 6.193C5.88 4.402 7.474 3 9.805 3 13.118 3 15.04 5.161 15 7.478c-.061 2.318-1.595 3.019-2.883 3.68-.654.332-1.268.604-1.268 1.15zM9.805 14.47c.798 0 1.35.525 1.35 1.285 0 .603-.552 1.246-1.35 1.246-.715 0-1.288-.643-1.288-1.246 0-.76.573-1.285 1.288-1.285z' fill-rule='nonzero'/%3E%3C/g%3E%3C/svg%3E");} + +.icon-help-fill { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle cx='10' cy='10' r='10' fill='%23999'/%3E%3Cpath fill='%23FFF' fill-rule='nonzero' d='M8.368 7.189H5C5 3.5 7.668 2 10.292 2 13.966 2 16 4.076 16 7.012c0 3.754-3.849 3.136-3.849 5.211v1.656H8.455v-1.832c0-2.164 1.4-2.893 2.778-3.6.437-.242 1.006-.574 1.006-1.236 0-2.208-3.871-2.142-3.871-.022zM10.25 18a1.75 1.75 0 1 1 0-3.5 1.75 1.75 0 0 1 0 3.5z'/%3E%3C/g%3E%3C/svg%3E"); +} + +.icon-help-inv { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath fill='%23999' fill-rule='evenodd' d='M10 20C4.477 20 0 15.523 0 10S4.477 0 10 0s10 4.477 10 10-4.477 10-10 10zM8.368 7.189c0-2.12 3.87-2.186 3.87.022 0 .662-.568.994-1.005 1.236-1.378.707-2.778 1.436-2.778 3.6v1.832h3.696v-1.656c0-2.075 3.849-1.457 3.849-5.21C16 4.075 13.966 2 10.292 2 7.668 2 5 3.501 5 7.189h3.368zM10.25 18a1.75 1.75 0 1 0 0-3.5 1.75 1.75 0 0 0 0 3.5z'/%3E%3C/svg%3E"); +} + +.kelvin::after { + content: "K"; +} + +.mired::after { + content: " Mired"; +} + +.percent::after { + content: "%"; +} + +.sdpi-item-value + .icon-cooler, +.sdpi-item-value + .icon-warmer { + margin-left: 0px !important; + margin-top: 15px !important; +} + +/** + CONTROL-CENTER STYLES +*/ +input[type="range"].colorbrightness::-webkit-slider-runnable-track, +input[type="range"].colortemperature::-webkit-slider-runnable-track { + height: 8px; + background: #979797; + border-radius: 4px; + background-image: linear-gradient(to right,#94d0ec, #ffb165); +} + +input[type="range"].colorbrightness::-webkit-slider-runnable-track { + background-color: #efefef; + background-image: linear-gradient(to right, black , rgba(0,0,0,0)); +} + + +input[type="range"].colorbrightness::-webkit-slider-thumb, +input[type="range"].colortemperature::-webkit-slider-thumb { + width: 16px; + height: 16px; + border-radius: 20px; + margin-top: -5px; + background-color: #86c6e8; + box-shadow: 0px 0px 1px #000000; + border: 1px solid #d8d8d8; +} +.sdpi-info-label { + display: inline-block; + user-select: none; + position: absolute; + height: 15px; + width: auto; + text-align: center; + border-radius: 4px; + min-width: 44px; + max-width: 80px; + background: white; + font-size: 11px; + color: black; + z-index: 1000; + box-shadow: 0px 0px 12px rgba(0,0,0,.8); + padding: 2px; + +} + +.sdpi-info-label.hidden { + opacity: 0; + transition: opacity 0.25s linear; +} + +.sdpi-info-label.shown { + position: absolute; + opacity: 1; + transition: opacity 0.25s ease-out; +} + + + + +/*--------- context menu ----------*/ + +.context-menu { + display: none; + position: absolute; + z-index: 10; + padding: 12px 0; + width: 120px; + background-color: #3D3D3D; + border: solid 1px #dfdfdf; + box-shadow: 1px 1px 2px #cfcfcf; +} + +.context-menu--active { + display: block; +} + +.context-menu__items { + list-style: none; + margin: 0; + padding: 0; + overflow-y: auto; +} + +.context-menu__item { + display: block; + margin-bottom: 4px; + background-color: #3D3D3D !important; +} + +.context-menu__item:last-child { + margin-bottom: 0; +} + +.context-menu__link { + display: block; + padding: 4px 12px; + color: #ffff; + text-decoration: none; + white-space: nowrap; +} + +.context-menu__link:hover { + color: #fff; + background-color: #0066aa; +} + +.context-menu_message{ + cursor: default; +} diff --git a/src/com.genericmale.sonos.sdPlugin/pi/form-utils.js b/src/com.genericmale.sonos.sdPlugin/pi/form-utils.js new file mode 100644 index 0000000..c8e85a8 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/pi/form-utils.js @@ -0,0 +1,208 @@ +class FormUtils { + /** + * Returns the value from a form using the form controls name property + * @param {*} form + * @returns + */ + static getFormValue(form) { + if (typeof form === 'string') { + form = document.querySelector(form); + } + + const elements = form?.elements; + + if (!elements) { + throw 'Could not find form!'; + } + + const formData = new FormData(form); + let formValue = {}; + + formData.forEach((value, key) => { + if (!Reflect.has(formValue, key)) { + formValue[key] = value; + return; + } + if (!Array.isArray(formValue[key])) { + formValue[key] = [formValue[key]]; + } + formValue[key].push(value); + }); + + return formValue; + } + + /** + * Sets the value of form controls using their name attribute and the jsn object key + * @param {*} jsn + * @param {*} form + */ + static setFormValue(jsn, form) { + if (typeof form === 'string') { + form = document.querySelector(form); + } + + const elements = form?.elements; + + if (!elements) { + throw 'Could not find form!'; + } + + Array.from(elements) + .filter((element) => element?.name) + .forEach((element) => { + const {name, type} = element; + if (jsn.hasOwnProperty(name)) { + const value = jsn[name]; + const isCheckOrRadio = type === 'checkbox' || type === 'radio'; + if (isCheckOrRadio) { + const isSingle = value === element.value; + if (isSingle || (Array.isArray(value) && value.includes(element.value))) { + element.checked = true; + } + } else { + element.value = value ?? ''; + } + } + }); + } + + /** + * This provides a slight delay before processing rapid events + * @param {*} wait - delay before processing function (recommended time 150ms) + * @param {*} fn + * @returns + */ + static debounce(wait, fn) { + let timeoutId = null; + return (...args) => { + window.clearTimeout(timeoutId); + timeoutId = window.setTimeout(() => { + fn.apply(null, args); + }, wait); + }; + } + + /** + * Quick utility to lighten or darken a color (doesn't take color-drifting, etc. into account) + * Usage: + * fadeColor('#061261', 100); // will lighten the color + * fadeColor('#200867'), -100); // will darken the color + */ + static fadeColor(col, amt) { + const min = Math.min, max = Math.max; + const num = parseInt(col.replace(/#/g, ''), 16); + const r = min(255, max((num >> 16) + amt, 0)); + const g = min(255, max((num & 0x0000FF) + amt, 0)); + const b = min(255, max(((num >> 8) & 0x00FF) + amt, 0)); + return '#' + (g | (b << 8) | (r << 16)).toString(16).padStart(6, 0); + } + + /** + * Stream Deck software passes system-highlight color information + * to Property Inspector. Here we 'inject' the CSS styles into the DOM + * when we receive this information. + */ + static addDynamicStyles(clrs) { + const node = document.getElementById('#sdpi-dynamic-styles') || document.createElement('style'); + if (!clrs.mouseDownColor) clrs.mouseDownColor = this.fadeColor(clrs.highlightColor, -100); + const clr = clrs.highlightColor.slice(0, 7); + const clr1 = this.fadeColor(clr, 100); + const clr2 = this.fadeColor(clr, 60); + const metersActiveColor = this.fadeColor(clr, -60); + + node.setAttribute('id', 'sdpi-dynamic-styles'); + node.innerHTML = ` + + input[type="radio"]:checked + label span, + input[type="checkbox"]:checked + label span { + background-color: ${clrs.highlightColor}; + } + + input[type="radio"]:active:checked + label span, + input[type="radio"]:active + label span, + input[type="checkbox"]:active:checked + label span, + input[type="checkbox"]:active + label span { + background-color: ${clrs.mouseDownColor}; + } + + input[type="radio"]:active + label span, + input[type="checkbox"]:active + label span { + background-color: ${clrs.buttonPressedBorderColor}; + } + + td.selected, + td.selected:hover, + li.selected:hover, + li.selected { + color: white; + background-color: ${clrs.highlightColor}; + } + + .sdpi-file-label > label:active, + .sdpi-file-label.file:active, + label.sdpi-file-label:active, + label.sdpi-file-info:active, + input[type="file"]::-webkit-file-upload-button:active, + button:active { + background-color: ${clrs.buttonPressedBackgroundColor}; + color: ${clrs.buttonPressedTextColor}; + border-color: ${clrs.buttonPressedBorderColor}; + } + + ::-webkit-progress-value, + meter::-webkit-meter-optimum-value { + background: linear-gradient(${clr2}, ${clr1} 20%, ${clr} 45%, ${clr} 55%, ${clr2}) + } + + ::-webkit-progress-value:active, + meter::-webkit-meter-optimum-value:active { + background: linear-gradient(${clr}, ${clr2} 20%, ${metersActiveColor} 45%, ${metersActiveColor} 55%, ${clr}) + } + `; + document.body.appendChild(node); + } + + /** + * Fetches the specified language json file + * @param pathPrefix + * @returns {Promise} + */ + static async loadLocalization(language, pathPrefix) { + const manifest = await this.readJson(`${pathPrefix}${language}.json`); + const localization = manifest['Localization'] ?? null; + + if (localization) { + const elements = document.querySelectorAll('[data-localize]'); + + elements.forEach((element) => { + element.textContent = + localization[element.textContent] ?? element.textContent; + }); + } + } + + /** + * @private + */ + static async readJson(path) { + return new Promise((resolve, reject) => { + const req = new XMLHttpRequest(); + req.onerror = reject; + req.overrideMimeType('application/json'); + req.open('GET', path, true); + req.onreadystatechange = (response) => { + if (req.readyState === 4) { + const jsonString = response?.target?.response; + if (jsonString) { + resolve(JSON.parse(response?.target?.response)); + } else { + reject(); + } + } + }; + + req.send(); + }); + } +} diff --git a/src/com.genericmale.sonos.sdPlugin/pi/index.html b/src/com.genericmale.sonos.sdPlugin/pi/index.html new file mode 100644 index 0000000..e4ff05b --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/pi/index.html @@ -0,0 +1,168 @@ + + + + + + + + + Sonos Property Inspector + + + + + +

+ +
+
+
Speaker IP
+ +
+ +
+
+ Obtaining Speaker IP Address +

Sonos Desktop App

+ Help -> About My Sonos System... +

Sonos Mobile App

+ Settings -> System -> About My System +
+
+
+ +
+ +
+
+
Refresh Interval
+ +
+ +
+
Volume
+ +
+ +
+
Volume Increase
+ +
+ +
+
Volume Decrease
+ +
+ +
+
URL
+ +
+ +
+
Source
+ +
+ +
+
Favorite
+ +
+ +
+ +
+
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + + +
+
Top Text
+ +
+
+
Middle Text
+ +
+
+
Bottom Text
+ +
+ +
+
Paused Text
+ +
+ +
+
+ Supported Music Services +

Spotify

+

Tidal

+

Deezer

+

Apple Music

+

TuneIn

+
+
+
+
+ + + + + + + diff --git a/src/com.genericmale.sonos.sdPlugin/pi/index.js b/src/com.genericmale.sonos.sdPlugin/pi/index.js new file mode 100644 index 0000000..fb6f945 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/pi/index.js @@ -0,0 +1,76 @@ +/** + * This is the first function StreamDeck Software calls, when + * establishing the connection to the plugin or the Property Inspector + * @param {string} port - The socket's port to communicate with StreamDeck software. + * @param {string} pluginUUID - A unique identifier, which StreamDeck uses to communicate with the plugin + * @param {string} registerEvent - Identifies, if the event is meant for the property inspector or the plugin. + * @param {string} info - Information about the host (StreamDeck) application + * @param {string} actionInfo - Context is an internal identifier used to communicate to the host application. + */ +function connectElgatoStreamDeckSocket(port, pluginUUID, registerEvent, info, actionInfo) { + const globalSettingsForm = document.getElementById('global-settings'); + const settingsForm = document.getElementById('settings'); + const sonos = new Sonos(); + + const streamDeck = new StreamDeck(); + streamDeck.connect(port, pluginUUID, registerEvent, info, actionInfo); + streamDeck.onConnected(() => { + FormUtils.loadLocalization(streamDeck.appInfo.application.language ?? null, '../'); + FormUtils.addDynamicStyles(streamDeck.appInfo.colors); + + //use last part of uuid to check which inputs to show + const action = streamDeck.actionInfo.action.split('.').pop(); + + //show the items for the action + [...settingsForm.querySelectorAll('.sdpi-item')] + .filter((e) => e.dataset.actions.split(',').includes(action)) + .forEach((e) => e.classList.add('active')); + + //disable controls which aren't visible, so they don't get included in the FormData + settingsForm.querySelectorAll('.sdpi-item input,select,textarea') + .forEach((e) => e.disabled = e.closest('.sdpi-item.active') === null); + + //propagate form with persisted data + const settings = streamDeck.actionInfo.payload.settings; + FormUtils.setFormValue(settings, settingsForm); + + //watch for changes and store them + settingsForm.addEventListener( + 'input', + FormUtils.debounce(150, () => { + const value = FormUtils.getFormValue(settingsForm); + streamDeck.setSettings(value); + }) + ); + + streamDeck.getGlobalSettings().then((globalSettings) => { + //propagate form with persisted data + FormUtils.setFormValue(globalSettings, globalSettingsForm); + + //watch for changes and store them + globalSettingsForm.addEventListener( + 'input', + FormUtils.debounce(150, () => { + const value = FormUtils.getFormValue(globalSettingsForm); + streamDeck.setGlobalSettings(value); + }) + ); + + sonos.connect(globalSettings.host, parseInt(globalSettings.port) || 1400); + + if(action === 'playfavorites') { + sonos.browse(Sonos.BROWSE_TYPE.SONOS_FAVORITES).then((items) => { + const favorite = settings.favorite ? JSON.parse(settings.favorite) : null; + items.forEach((item) => { + const select = document.getElementById('favorites'); + const option = document.createElement('option'); + option.value = JSON.stringify(item); + option.selected = favorite && favorite.uri === item.uri; + option.innerHTML = item.title; + select.appendChild(option); + }); + }) + } + }); + }) +} diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/changesource.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/changesource.js new file mode 100644 index 0000000..426953b --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/changesource.js @@ -0,0 +1,14 @@ +define(class extends SonosAction { + async onKeyDown({payload: {settings}}) { + if (settings.source === 'tv') { + await this.sonos.setLocalTransport('x-sonos-htastream', ':spdif'); + } else if (settings.source === 'line_in') { + await this.sonos.setLocalTransport('x-rincon-stream'); + } else { + await this.sonos.setLocalTransport('x-rincon-queue', '#0'); + } + + if (settings.play === '1') + return this.sonos.play(); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/mute.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/mute.js new file mode 100644 index 0000000..47b0955 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/mute.js @@ -0,0 +1,12 @@ +define(class extends PollingAction { + async onKeyDown({payload: {state}}) { + return state === 0 ? + this.sonos.setMute(1) : + this.sonos.setMute(0); + } + + async refresh() { + const {CurrentMute: muted} = await this.sonos.getMute(); + return this.streamDeck.setState(muted === '1' ? 1 : 0, this.context); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/next.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/next.js new file mode 100644 index 0000000..f7cd6a9 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/next.js @@ -0,0 +1,5 @@ +define(class extends SonosAction { + async onKeyDown() { + return this.sonos.next(); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/playfavorites.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/playfavorites.js new file mode 100644 index 0000000..33157f3 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/playfavorites.js @@ -0,0 +1,24 @@ +define(class extends SonosAction { + constructor(streamDeck, action, context) { + super(streamDeck, action, context); + this.streamDeck.getSettings(this.context); + } + + async onKeyDown({payload: {settings}}) { + const favorite = JSON.parse(settings.favorite); + if (favorite) { + await this.sonos.setServiceURI(favorite.uri, favorite.metadata); + if (settings.play === '1') + return this.sonos.play(); + } + } + + async onDidReceiveSettings({payload: {settings}}) { + const favorite = JSON.parse(settings.favorite); + if(favorite && settings.showAlbumArt === '1') { + return this.streamDeck.setImageURL(favorite.albumArtURI, null, null, this.context); + } else { + return this.streamDeck.setImage(null, 0, null, this.context); + } + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/playpause.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/playpause.js new file mode 100644 index 0000000..f6af01c --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/playpause.js @@ -0,0 +1,81 @@ +define(class extends PollingAction { + timeRegex = /^\d?\d:\d\d:\d\d$/; + defaultTitleParameters = { + fontFamily: 'Arial', + fontSize: 10, + fontStyle: 'Bold', + fontUnderline: false, + showTitle: true, + titleColor: '#ffffff' + }; + + async onKeyDown({payload: {state}}) { + if (state === 0) { + await this.sonos.play(); + return this.drawState(1); + } else { + await this.sonos.pause(); + return this.drawState(0); + } + } + + async onTitleParametersDidChange(event) { + this.settings = event.payload.settings; + this.settings.titleParameters = event.payload.titleParameters; + this.streamDeck.setSettings(this.settings, event.context); + return this.refresh(); + } + + async refresh() { + const {CurrentTransportState: transportState} = await this.sonos.getTransportInfo(); + const state = transportState === 'PLAYING' ? 1 : 0; + this.streamDeck.setState(state, this.context); + await this.drawState(state) + } + + async drawState(state) { + const titleParameters = this.settings.titleParameters || this.defaultTitleParameters; + + if (this.settings.showAlbumArt !== '1') + return this.streamDeck.setImage(null, 0, null, this.context); + + let { + RelTime: elapsed, + TrackDuration: duration, + TrackMetaData: metadata + } = await this.sonos.getPositionInfo(); + const track = new DOMParser().parseFromString(metadata, 'text/xml'); + const albumArtURI = this.sonos.getAlbumArtURI(track); + if(!albumArtURI) + return this.streamDeck.setImage(null, 0, null, this.context); + + let texts; + if(titleParameters.showTitle) { + const artist = this.sonos.getElementText(track, 'dc:creator'); + const title = artist ? + this.sonos.getElementText(track, 'dc:title') : + this.sonos.getElementText(track, 'r:streamContent'); + + let remaining; + if (elapsed && this.timeRegex.test(elapsed) && duration && this.timeRegex.test(duration)) { + const elapsedSec = elapsed.split(':').reduce((p, c) => p * 60 + +c, 0); + const durationSec = duration.split(':').reduce((p, c) => p * 60 + +c, 0); + const remainingSec = durationSec - elapsedSec; + remaining = new Date(remainingSec * 1000).toISOString().substring(11, 19); + + duration = duration.replace(/^0+:/, ''); + elapsed = elapsed.replace(/^0+:/, ''); + remaining = remaining.replace(/^0+:/, ''); + } else { + duration = elapsed = remaining = null; + } + + const info = {artist, title, duration, elapsed, remaining}; + texts = state === 0 && this.settings.paused ? + {bottom: this.settings.paused} : + {top: info[this.settings.top], middle: info[this.settings.middle], bottom: info[this.settings.bottom]} + } + + return this.streamDeck.setImageURL(albumArtURI, texts, titleParameters, this.context); + } +}) diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/playuri.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/playuri.js new file mode 100644 index 0000000..3a2cd1d --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/playuri.js @@ -0,0 +1,12 @@ +define(class extends SonosAction { + async onKeyDown({payload: {settings}}) { + const service = MusicService.parse(settings.uri); + if (!service) + throw new Error(`Invalid media URI "${settings.uri}"`); + + await this.sonos.setServiceURI(service.uri, service.metadata); + + if (settings.play === '1') + return this.sonos.play(); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/previous.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/previous.js new file mode 100644 index 0000000..37b7367 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/previous.js @@ -0,0 +1,5 @@ +define(class extends SonosAction { + async onKeyDown() { + return this.sonos.previous() + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/repeat.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/repeat.js new file mode 100644 index 0000000..13eaa99 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/repeat.js @@ -0,0 +1,22 @@ +define(class extends PollingAction { + async onKeyDown({payload: {state}}) { + const {PlayMode: mode} = await this.sonos.getTransportSettings() + const shuffle = mode.indexOf('SHUFFLE') === 0; + if (state === 0) + return this.sonos.setPlayMode(shuffle ? 'SHUFFLE' : 'REPEAT_ALL'); + else if (state === 1) + return this.sonos.setPlayMode(shuffle ? 'SHUFFLE_REPEAT_ONE' : 'REPEAT_ONE'); + else if (state === 2) + return this.sonos.setPlayMode(shuffle ? 'SHUFFLE_NOREPEAT' : 'NORMAL'); + } + + async refresh() { + const {PlayMode: mode} = await this.sonos.getTransportSettings(); + if (mode === 'NORMAL' || mode === 'SHUFFLE_NOREPEAT') + return this.streamDeck.setState(0, this.context); + else if (mode === 'REPEAT_ALL' || mode === 'SHUFFLE') + return this.streamDeck.setState(1, this.context); + else if (mode === 'REPEAT_ONE' || mode === 'SHUFFLE_REPEAT_ONE') + return this.streamDeck.setState(2, this.context); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/shuffle.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/shuffle.js new file mode 100644 index 0000000..d572509 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/shuffle.js @@ -0,0 +1,16 @@ +define(class extends PollingAction { + async onKeyDown({payload: {state}}) { + const {PlayMode: mode} = await this.sonos.getTransportSettings(); + if (mode === 'NORMAL' || mode === 'SHUFFLE_NOREPEAT') + return this.sonos.setPlayMode(state === 0 ? 'SHUFFLE_NOREPEAT' : 'NORMAL'); + else if (mode === 'REPEAT_ALL' || mode === 'SHUFFLE') + return this.sonos.setPlayMode(state === 0 ? 'SHUFFLE' : 'REPEAT_ALL'); + else if (mode === 'REPEAT_ONE' || mode === 'SHUFFLE_REPEAT_ONE') + return this.sonos.setPlayMode(state === 0 ? 'SHUFFLE_REPEAT_ONE' : 'REPEAT_ONE'); + } + + async refresh() { + const {PlayMode: mode} = await this.sonos.getTransportSettings(); + return this.streamDeck.setState(mode.indexOf('SHUFFLE') === 0 ? 1 : 0, this.context); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/volume.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/volume.js new file mode 100644 index 0000000..69fd809 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/volume.js @@ -0,0 +1,5 @@ +define(class extends SonosAction { + async onKeyDown({payload: {settings}}) { + return this.sonos.setVolume(settings.volume || 50); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/volumedown.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/volumedown.js new file mode 100644 index 0000000..c9a48ac --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/volumedown.js @@ -0,0 +1,6 @@ +define(class extends SonosAction { + async onKeyDown({payload: {settings}}) { + const {CurrentVolume: volume} = await this.sonos.getVolume(); + return this.sonos.setVolume(parseInt(volume) - (parseInt(settings.volume) || 10)); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/actions/volumeup.js b/src/com.genericmale.sonos.sdPlugin/plugin/actions/volumeup.js new file mode 100644 index 0000000..b84cd19 --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/actions/volumeup.js @@ -0,0 +1,6 @@ +define(class extends SonosAction { + async onKeyDown({payload: {settings}}) { + const {CurrentVolume: volume} = await this.sonos.getVolume(); + return this.sonos.setVolume(parseInt(volume) + (parseInt(settings.volume) || 10)); + } +}); diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/index.html b/src/com.genericmale.sonos.sdPlugin/plugin/index.html new file mode 100644 index 0000000..4c4eb3b --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/index.html @@ -0,0 +1,20 @@ + + + + + Sonos + + + + + + + + + + + diff --git a/src/com.genericmale.sonos.sdPlugin/plugin/index.js b/src/com.genericmale.sonos.sdPlugin/plugin/index.js new file mode 100644 index 0000000..8867c5f --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/plugin/index.js @@ -0,0 +1,106 @@ +/** + * This is the first function StreamDeck Software calls, when + * establishing the connection to the plugin or the Property Inspector + * @param {string} port - The socket's port to communicate with StreamDeck software. + * @param {string} pluginUUID - A unique identifier, which StreamDeck uses to communicate with the plugin + * @param {string} registerEvent - Identifies, if the event is meant for the property inspector or the plugin. + * @param {string} info - Information about the host (StreamDeck) application + * @param {string} actionInfo - Context is an internal identifier used to communicate to the host application. + */ +function connectElgatoStreamDeckSocket(port, pluginUUID, registerEvent, info, actionInfo) { + const sonos = new Sonos(); + + const streamDeck = new StreamDeck(); + streamDeck.connect(port, pluginUUID, registerEvent, info, actionInfo); + streamDeck.onConnected(() => { + streamDeck.getGlobalSettings().then((settings) => { + sonos.connect(settings.host, parseInt(settings.port) || 1400); + }); + }) + + //load action implementations dynamically when the action becomes visible + const loadedScripts = {}; + streamDeck.on('willAppear', (event) => { + //use last part of uuid as filename + const action = event.action.split('.').pop(); + + const script = document.createElement('script'); + script.src = `./actions/${action}.js`; + + if (!loadedScripts[script.src]) { + loadedScripts[script.src] = {name: event.action, context: event.context}; + document.documentElement.firstChild.appendChild(script); + } + }); + + //action classes need to be registered using a call to define + window.define = (actionClass) => { + const scriptSrc = document.currentScript.src; + const action = loadedScripts[scriptSrc]; + action.instance = new actionClass(streamDeck, action.name, action.context); + action.instance.sonos = sonos; + } +} + +/** + * Base Action holding a sonos connection. + */ +class SonosAction extends Action { + sonos; +} + +/** + * Base Action to refresh a state with a basic poll interval stored in the refreshInterval action setting. + */ +class PollingAction extends SonosAction { + settings; + + constructor(streamDeck, action, context) { + super(streamDeck, action, context); + + this.visible = true; + this.streamDeck.getSettings(this.context); + } + + onDidReceiveSettings({payload: {settings}}) { + this.settings = settings; + + const interval = parseInt(settings.refreshInterval); + this.interval = isNaN(interval) ? 1 : interval; + + this.startPolling(); + } + + onWillAppear() { + this.visible = true; + this.startPolling(); + } + + onWillDisappear() { + this.visible = false; + clearTimeout(this.timer); + } + + startPolling() { + if (!this.visible) + return; + + if (this.timer) { + clearTimeout(this.timer); + this.timer = null; + } + + if (this.sonos.isConnected()) { + this.refresh().then(() => { + if (this.interval > 0) { + this.timer = setTimeout(() => this.startPolling(), this.interval * 1000); + } + }); + } else if (this.interval > 0) { + this.timer = setTimeout(() => this.startPolling(), this.interval * 1000); + } + } + + async refresh() { + } +} diff --git a/src/com.genericmale.sonos.sdPlugin/sonos.js b/src/com.genericmale.sonos.sdPlugin/sonos.js new file mode 100644 index 0000000..6e7fa3b --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/sonos.js @@ -0,0 +1,318 @@ +class Sonos { + static BROWSE_TYPE = { + ARTISTS: 'A:ARTIST', + ARTIST_ALBUMS: 'A:ALBUMARTIST', + ALBUMS: 'A:ALBUM', + GENRES: 'A:GENRE', + COMPOSERS: 'A:COMPOSER', + TRACKS: 'A:TRACKS', + PLAYLISTS: 'A:PLAYLISTS', + SHARES: 'S:', + SONOS_PLAYLISTS: 'SQ:', + CATEGORIES: 'A:', + SONOS_FAVORITES: 'FV:2', + RADIO_STATIONS: 'R:0/0', + RADIO_SHOWS: 'R:0/1' + } + + constructor() { + this.avTransport = new SonosService(this, 'AVTransport', 'MediaRenderer/AVTransport'); + this.renderingControl = new SonosService(this, 'RenderingControl', 'MediaRenderer/RenderingControl'); + this.zoneGroupTopology = new SonosService(this, 'ZoneGroupTopology'); + this.contentDirectory = new SonosService(this, 'ContentDirectory', 'MediaServer/ContentDirectory'); + } + + connect(host, port) { + this.host = host; + this.port = port; + } + + isConnected() { + return this.host && this.port; + } + + async getTransportInfo() { + return this.avTransport.execute('GetTransportInfo'); + } + + async play() { + return this.avTransport.execute('Play', {Speed: 1}); + } + + async pause() { + return this.avTransport.execute('Pause'); + } + + async next() { + return this.avTransport.execute('Next'); + } + + async previous() { + return this.avTransport.execute('Previous'); + } + + async getTransportSettings() { + return this.avTransport.execute('GetTransportSettings'); + } + + async setPlayMode(playMode) { + return this.avTransport.execute('SetPlayMode', {NewPlayMode: playMode}); + } + + async setLocalTransport(prefix, suffix) { + const zoneGroupState = await this.getZoneGroupState(); + const coordinator = zoneGroupState.querySelector('ZoneGroup').getAttribute('Coordinator'); + return this.setAVTransportURI(`${prefix}:${coordinator}${suffix || ''}`); + } + + async setAVTransportURI(uri, metadata) { + return this.avTransport.execute('SetAVTransportURI', {CurrentURI: uri, CurrentURIMetaData: metadata || ''}); + } + + async getPositionInfo() { + return this.avTransport.execute('GetPositionInfo'); + } + + async getZoneGroupState() { + //return from cache if we already fetched the zones + if (this.zoneGroupState) { + return Promise.resolve(this.zoneGroupState); + } + + const {ZoneGroupState: state} = await this.zoneGroupTopology.execute('GetZoneGroupState'); + const zoneGroupState = new DOMParser().parseFromString(state, 'text/xml'); + this.zoneGroupState = zoneGroupState; + return zoneGroupState; + } + + async getMute() { + return this.renderingControl.execute('GetMute', {Channel: 'Master'}); + } + + async setMute(mute) { + return this.renderingControl.execute('SetMute', {Channel: 'Master', DesiredMute: mute ? '1' : '0'}); + } + + async getVolume() { + return this.renderingControl.execute('GetVolume', {Channel: 'Master'}); + } + + async setVolume(volume) { + return this.renderingControl.execute('SetVolume', {Channel: 'Master', DesiredVolume: volume}); + } + + async setServiceURI(uri, metadata) { + if (uri.startsWith('x-sonosapi-stream:')) { + return this.setAVTransportURI(uri, metadata); + } + + //add playlist to end of queue + const {FirstTrackNumberEnqueued: trackNr} = await this.addURIToQueue(uri, metadata); + if (!trackNr) + throw new Error(`Failed to add URI "${uri}" to queue`); + + //switch source to queue + await this.setLocalTransport('x-rincon-queue', '#0'); + + //set active track to the first in the playlist + return this.seek('TRACK_NR', trackNr); + } + + async seek(unit, target) { + return this.avTransport.execute('Seek', {Unit: unit, Target: target}); + } + + async addURIToQueue(uri, metadata, position, next) { + return this.avTransport.execute('AddURIToQueue', { + EnqueuedURI: uri, + EnqueuedURIMetaData: metadata, + DesiredFirstTrackNumberEnqueued: position || 0, + EnqueueAsNext: next ? '1' : '0' + }); + } + + async browse(type, term, categories, start, count) { + let objectId = type; + if (categories) + objectId += '/' + categories.map(c => encodeURIComponent(c)).join('/') + if (term) + objectId += ':' + encodeURIComponent(type); + + const {Result: result} = await this.contentDirectory.execute('Browse', { + ObjectID: objectId, + BrowseFlag: 'BrowseDirectChildren', + Filter: '*', + StartingIndex: start || '0', + RequestedCount: count || '100', + SortCriteria: '' + }); + + const items = new DOMParser().parseFromString(result, 'text/xml'); + return [...items.querySelectorAll('item')].map(i => ({ + title: this.getElementText(i, 'dc:title'), + uri: this.getElementText(i, 'res'), + metadata: this.getElementText(i, 'r:resMD'), + albumArtURI: this.getAlbumArtURI(i) + })); + } + + getElementText(xml, elementName) { + const elements = xml.getElementsByTagName(elementName) + return elements.length && elements[0].childNodes.length ? + elements[0].childNodes[0].nodeValue : null; + } + + getAlbumArtURI(metadata) { + let albumArtURI = this.getElementText(metadata, 'upnp:albumArtURI'); + if (albumArtURI && !albumArtURI.startsWith('http')) + albumArtURI = `http://${this.host}:1400${albumArtURI}`; + return albumArtURI; + } +} + +class SonosService { + constructor(sonos, name, baseUrl) { + this.sonos = sonos; + this.name = name; + this.baseUrl = baseUrl || name; + } + + async execute(action, params) { + if (!this.sonos.isConnected()) + throw new Error('Not connected to sonos'); + + params = params || {}; + params.InstanceID = params.InstanceID || 0; + + const url = `http://${this.sonos.host}:${this.sonos.port}/${this.baseUrl}/Control`; + const soapAction = `"urn:schemas-upnp-org:service:${this.name}:1#${action}"`; + const xmlParams = Object.keys(params).map((key) => `<${key}>${this.escape(params[key])}`).join(''); + const request = ` + + ${xmlParams} + ` + + const data = await fetch(url, { + method: 'POST', + headers: { + SOAPAction: soapAction, + 'Content-type': 'text/xml; charset=utf8' + }, + body: request + }); + const responseText = await data.text(); + if (!data.ok) + throw new Error(responseText); + + const responseDocument = new DOMParser().parseFromString(responseText, 'text/xml'); + const response = {}; + responseDocument.querySelectorAll('Body>* *').forEach((node) => + response[node.nodeName] = node.textContent + ); + return response; + } + + escape(txt) { + return txt.toString() + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } +} + +class MusicService { + static URI_TYPE = { + album: { + prefix: 'x-rincon-cpcontainer:1004206c', + key: '00040000', + class: 'object.container.album.musicAlbum' + }, + episode: { + prefix: '', + key: '00032020', + class: 'object.item.audioItem.musicTrack' + }, + track: { + prefix: '', + key: '00032020', + class: 'object.item.audioItem.musicTrack' + }, + show: { + prefix: 'x-rincon-cpcontainer:1006206c', + key: '1006206c', + class: 'object.container.playlistContainer' + }, + song: { + prefix: '', + key: '10032020', + class: 'object.item.audioItem.musicTrack' + }, + playlist: { + prefix: 'x-rincon-cpcontainer:1006206c', + key: '1006206c', + class: 'object.container.playlistContainer' + }, + radio: { + prefix: 'x-sonosapi-stream:', + key: 'F00092020', + class: 'object.item.audioItem.audioBroadcast' + } + } + + static FACTORIES = [ + (uri) => { + const m = uri.match(/spotify.*[:/](album|episode|playlist|show|track)[:/](\w+)/); + return m ? new MusicService(2311, m[1], `spotify:${m[1]}:${m[2]}`) : null; + }, + (uri) => { + const m = uri.match(/https:\/\/tidal.*[:/](album|track|playlist)[:/]([\w-]+)/); + return m ? new MusicService(44551, m[1], `${m[1]}/${m[2]}`) : null; + }, + (uri) => { + const m = uri.match(/https:\/\/www.deezer.*[:/](album|track|playlist)[:/]([\w-]+)/); + return m ? new MusicService(519, m[1], `${m[1]}-${m[2]}`) : null; + }, + (uri) => { + const m = uri.match(/https:\/\/music\.apple\.com\/\w+\/(album|playlist)\/[^/]+\/(?:pl\.)?([-a-zA-Z0-9]+)(?:\?i=(\d+))?/); + if (!m) return null; + + const type = m[3] ? 'song' : m[1]; + const id = m[3] || m[2]; + return new MusicService(52231, type, `${type}:${id}`); + }, + (uri) => { + const m = uri.match(/https:\/\/tunein.com\/(radio)\/.*(s\d+)/); + return m ? new MusicService(65031, m[1], m[2], 254) : null; + } + ] + + static parse(uri) { + for (const factory of MusicService.FACTORIES) { + const service = factory(uri); + if (service) return service; + } + } + + constructor(serviceId, type, uri, broadcastId) { + this.serviceId = serviceId; + this.type = MusicService.URI_TYPE[type]; + this.encodedUri = encodeURIComponent(uri); + this.broadcastId = broadcastId; + } + + get metadata() { + return ` + + Stream Deck${this.type.class} + SA_RINCON${this.serviceId}_ + + `; + } + + get uri() { + return this.type.prefix + this.encodedUri + (this.broadcastId ? `?sid=${this.broadcastId}` : ''); + } + +} diff --git a/src/com.genericmale.sonos.sdPlugin/stream-deck.js b/src/com.genericmale.sonos.sdPlugin/stream-deck.js new file mode 100644 index 0000000..c47632e --- /dev/null +++ b/src/com.genericmale.sonos.sdPlugin/stream-deck.js @@ -0,0 +1,529 @@ +/** + * @class StreamDeck + * StreamDeck object containing all required code to establish + * communication with SD-Software and the Property Inspector + */ +class StreamDeck { + port; + uuid; + messageType; + appInfo; + actionInfo; + + websocket; + eventList = new Map(); + + /** + * Connect to Stream Deck + * @param port + * @param pluginUUID + * @param registerEvent + * @param info + * @param actionInfo + */ + connect(port, pluginUUID, registerEvent, info, actionInfo) { + this.port = port; + this.uuid = pluginUUID; + this.messageType = registerEvent; + this.appInfo = JSON.parse(info); + this.actionInfo = actionInfo ? JSON.parse(actionInfo) : null; + + if (this.websocket) { + this.websocket.close(); + this.websocket = null; + } + + this.websocket = new WebSocket(`ws://127.0.0.1:${this.port}`); + + this.websocket.onopen = () => { + const json = { + event: this.messageType, + uuid: this.uuid, + }; + + this.websocket.send(JSON.stringify(json)); + + this.emit('connected', { + connection: this.websocket, + port: this.port, + uuid: this.uuid, + actionInfo: this.actionInfo, + appInfo: this.appInfo, + messageType: this.messageType, + }); + }; + + this.websocket.onerror = (evt) => { + const error = `WEBSOCKET ERROR: ${evt}, ${evt.data}, ${evt.code}`; + console.warn(error); + this.logMessage(error); + }; + + this.websocket.onclose = (evt) => { + console.warn('WEBSOCKET CLOSED:', evt); + }; + + this.websocket.onmessage = (evt) => { + const data = evt?.data ? JSON.parse(evt.data) : {}; + const {action, event} = data; + + if (event && event !== '') { + this.emit(event, data); + if (action && action !== '') { + this.emit(`${action}.${event}`, data); + } + } + }; + } + + /** + * Register for an event send by the Stream Deck application + */ + on(name, fn) { + if (!this.eventList.has(name)) { + const subscribers = new Set(); + + const sub = (fn) => { + subscribers.add(fn); + return () => subscribers.delete(fn); + }; + + const pub = (data) => subscribers.forEach((fn) => { + try { + Promise.resolve(fn(data)).catch((e) => { + this.showAlert(data.context); + console.error(e); + }); + } catch (e) { + this.showAlert(data.context); + console.error(e); + } + }); + const pubSub = Object.freeze({pub, sub}); + this.eventList.set(name, pubSub); + } + + return this.eventList.get(name).sub(fn); + } + + /** + * @private + */ + emit(name, data) { + return this.eventList.has(name) && this.eventList.get(name).pub(data); + } + + /** + * Send JSON payload to StreamDeck + * @private + */ + send(event, context, payload, additionalData) { + if (this.websocket) { + try { + const data = Object.assign({}, {event, context, payload}, additionalData); + this.websocket.send(JSON.stringify(data)); + } catch (e) { + console.log('WEBSOCKET EXCEPTION:', e); + } + } + } + + /** + * Save the actions's persistent data. + * @param settings + * @param context + */ + setSettings(settings, context) { + this.send('setSettings', context || this.uuid, settings); + } + + /** + * Request the actions's persistent data + * @param context + * @param timeout + */ + getSettings(context, timeout) { + return new Promise((resolve, reject) => { + const ctx = context || this.uuid; + this.send('getSettings', ctx); + const unsub = this.on('didReceiveSettings', (event) => { + if (event.context === ctx) { + resolve(event.payload.settings); + unsub(); + clearTimeout(handle); + } + }); + const handle = setTimeout(() => { + reject(); + unsub(); + }, timeout || 5000); + }); + } + + /** + * Save the plugin's persistent data + * @param globalSettings + */ + setGlobalSettings(globalSettings) { + this.send('setGlobalSettings', this.uuid, globalSettings); + } + + /** + * Request the plugin's persistent data + */ + getGlobalSettings(timeout) { + return new Promise((resolve, reject) => { + this.send('getGlobalSettings', this.uuid); + const unsub = this.on('didReceiveGlobalSettings', (event) => { + resolve(event.payload.settings); + unsub(); + clearTimeout(handle); + }); + const handle = setTimeout(() => { + reject(); + unsub(); + }, timeout || 5000); + }); + } + + /** + * Opens a URL in the default web browser + * @param url + */ + openUrl(url) { + this.send('openUrl', this.uuid, {url}); + } + + /** + * Write to log file + * @param message + */ + logMessage(message) { + this.send('logMessage', this.uuid, {message}); + } + + /** + * Set the title of the actions's key + * @param context + * @param title + * @param target + * @param state + */ + setTitle(title, target, state, context) { + this.send('setTitle', context || this.uuid, { + title, + target: target || 0, + state + }); + } + + /** + * Set the actions key image + * @param context + * @param image + * @param target + * @param state + */ + setImage(image, target, state, context) { + this.send('setImage', context || this.uuid, { + image, + target: target || 0, + state + }); + } + + /** + * Display alert triangle on actions key + * @param context + */ + showAlert(context) { + this.send('showAlert', context || this.uuid); + } + + /** + * Display ok check mark on actions key + * @param context + */ + showOk(context) { + this.send('showOk', context || this.uuid); + } + + /** + * Set the state of the actions + * @param context + * @param state + */ + setState(state, context) { + this.send('setState', context || this.uuid, {state}); + } + + /** + * Switch the active profile + * @param profile + * @param device + */ + switchToProfile(profile, device) { + this.send('switchToProfile', this.uuid, {profile}, {device}); + } + + /** + * Send payload to property inspector + * @param action + * @param payload + */ + sendToPropertyInspector(payload, action) { + this.send('sendToPropertyInspector', this.uuid, payload, { + action: action || this.actionInfo?.action + }); + } + + /** + * Send payload from the property inspector to the plugin + * @param payload + * @param action + */ + sendToPlugin(payload, action) { + this.send('sendToPlugin', this.uuid, payload, { + action: action || this.actionInfo?.action + }); + } + + /** + * Set an action image from a URL and optionally add some text to it + */ + setImageURL(imageURL, texts, titleParameters, context) { + const size = 72; + const padding = 5; //TODO: make padding configurable + + return new Promise((resolve, reject) => { + if(!imageURL) reject(); + + const image = new Image(); + image.onerror = reject; + image.onload = () => { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + canvas.height = size; + canvas.width = size; + + ctx.drawImage(image, 0, 0, canvas.width, canvas.height); + + if(texts) { + ctx.textBaseline = 'top'; + ctx.textAlign = 'center'; + ctx.shadowColor = "#000000"; + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 1; + + if(titleParameters) { + const fontStyle = titleParameters.fontStyle === 'Regular' ? '' : titleParameters.fontStyle; + ctx.font = `${fontStyle} ${titleParameters.fontSize}pt ${titleParameters.fontFamily || 'Arial'}`; + ctx.fillStyle = titleParameters.titleColor; + } + + if (typeof texts === 'string') + texts = {top: texts}; + if(texts.top) + ctx.fillText(texts.top, canvas.width / 2, padding); + if(texts.middle) + ctx.fillText(texts.middle, canvas.width / 2, (canvas.height - titleParameters.fontSize) / 2); + if(texts.bottom) + ctx.fillText(texts.bottom, canvas.width / 2, canvas.height - titleParameters.fontSize - padding); + } + + this.setImage(canvas.toDataURL('image/png'), 0, null, context); + resolve(); + }; + image.src = imageURL; + }); + } + + /** + * Registers a callback function for when Stream Deck is connected + */ + onConnected(fn) { + this.on('connected', (jsn) => fn(jsn)); + return this; + } + + /** + * Registers a callback function for the didReceiveGlobalSettings event, which fires when calling getGlobalSettings + */ + onDidReceiveGlobalSettings(fn) { + this.on('didReceiveGlobalSettings', (jsn) => fn(jsn)); + return this; + } + + /** + * Registers a callback function for the deviceDidConnect event, which fires when a device is plugged in + */ + onDeviceDidConnect(fn) { + this.on('deviceDidConnect', (jsn) => fn(jsn)); + return this; + } + + /** + * Registers a callback function for the deviceDidDisconnect event, which fires when a device is unplugged + */ + onDeviceDidDisconnect(fn) { + this.on('deviceDidDisconnect', (jsn) => fn(jsn)); + return this; + } + + /** + * Registers a callback function for the applicationDidLaunch event, which fires when the application starts + */ + onApplicationDidLaunch(fn) { + this.on('applicationDidLaunch', (jsn) => fn(jsn)); + return this; + } + + /** + * Registers a callback function for the applicationDidTerminate event, which fires when the application exits + */ + onApplicationDidTerminate(fn) { + this.on('applicationDidTerminate', (jsn) => fn(jsn)); + return this; + } + + /** + * Registers a callback function for the systemDidWakeUp event, which fires when the computer wakes + */ + onSystemDidWakeUp(fn) { + this.on('systemDidWakeUp', (jsn) => fn(jsn)); + return this; + } +} + +/** + * @class Action + * A Stream Deck plugin action, where you can register callback functions for different events + */ +class Action { + streamDeck; + action; + context; + + constructor(streamDeck, action, context) { + this.streamDeck = streamDeck; + this.action = action + this.context = context; + + //action events + this.streamDeck.on(`${this.action}.didReceiveSettings`, (event) => this.onDidReceiveSettings(event)); + this.streamDeck.on(`${this.action}.keyDown`, (event) => this.onKeyDown(event)); + this.streamDeck.on(`${this.action}.keyUp`, (event) => this.onKeyUp(event)); + this.streamDeck.on(`${this.action}.willAppear`, (event) => this.onWillAppear(event)); + this.streamDeck.on(`${this.action}.willDisappear`, (event) => this.onWillDisappear(event)); + this.streamDeck.on(`${this.action}.titleParametersDidChange`, (event) => this.onTitleParametersDidChange(event)); + this.streamDeck.on(`${this.action}.propertyInspectorDidAppear`, (event) => this.onPropertyInspectorDidAppear(event)); + this.streamDeck.on(`${this.action}.propertyInspectorDidDisappear`, (event) => this.onPropertyInspectorDidDisappear(event)); + this.streamDeck.on(`${this.action}.sendToPlugin`, (event) => this.onSendToPlugin(event)); + this.streamDeck.on(`${this.action}.sendToPropertyInspector`, (event) => this.onSendToPropertyInspector(event)); + + //global events + this.streamDeck + .onDidReceiveGlobalSettings((event) => this.onDidReceiveGlobalSettings(event)) + .onDeviceDidConnect((event) => this.onDeviceDidConnect(event)) + .onDeviceDidDisconnect((event) => this.onDeviceDidDisconnect(event)) + .onApplicationDidLaunch((event) => this.onApplicationDidLaunch(event)) + .onApplicationDidTerminate((event) => this.onApplicationDidTerminate(event)) + .onSystemDidWakeUp((event) => this.onSystemDidWakeUp(event)); + } + + /** + * Callback function for the didReceiveSettings event, which fires when calling getSettings + */ + async onDidReceiveSettings(event) { + } + + /** + * Callback function for the didReceiveGlobalSettings event, which fires when calling getGlobalSettings + */ + async onDidReceiveGlobalSettings(event) { + } + + /** + * Callback function for the keyDown event, which fires when pressing a key down + */ + async onKeyDown(event) { + } + + /** + * Callback function for the keyUp event, which fires when releasing a key + */ + async onKeyUp(event) { + } + + /** + * Callback function for the willAppear event, which fires when an action appears on they key + */ + async onWillAppear(event) { + } + + /** + * Callback function for the willAppear event, which fires when an action appears on they key + */ + async onWillDisappear(event) { + } + + /** + * Callback function for the titleParametersDidChange event, which fires when a user changes the key title + */ + async onTitleParametersDidChange(event) { + } + + /** + * Callback function for the deviceDidConnect event, which fires when a device is plugged in + */ + async onDeviceDidConnect(event) { + } + + /** + * Callback function for the deviceDidDisconnect event, which fires when a device is unplugged + */ + async onDeviceDidDisconnect(event) { + } + + /** + * Callback function for the applicationDidLaunch event, which fires when the application starts + */ + async onApplicationDidLaunch(event) { + } + + /** + * Callback function for the applicationDidTerminate event, which fires when the application exits + */ + async onApplicationDidTerminate(event) { + } + + /** + * Callback function for the systemDidWakeUp event, which fires when the computer wakes + */ + async onSystemDidWakeUp(event) { + } + + /** + * Callback function for the propertyInspectorDidAppear event, which fires when the property inspector is displayed + */ + async onPropertyInspectorDidAppear(event) { + } + + /** + * Callback function for the propertyInspectorDidDisappear event, which fires when the property inspector is closed + */ + async onPropertyInspectorDidDisappear(event) { + } + + /** + * Callback function for the sendToPlugin event, which fires when the property inspector uses the sendToPlugin api + */ + async onSendToPlugin(event) { + } + + /** + * Callback function for the sendToPropertyInspector event, which fires when the plugin uses the sendToPropertyInspector api + */ + async onSendToPropertyInspector(event) { + } +}