diff --git a/.gitignore b/.gitignore
index 6bb6d727..255405d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
-
-build/
-
+.project
+.settings/
bin/
+.vscode/launch.json
+.vscode/tasks.json
+.vscode/settings.json
diff --git a/README.md b/README.md
index f102bda8..293e7440 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
-# Crystal
-A Garmin Connect IQ watch face.
+# Crystal-Tesla
+A Garmin Connect IQ watch face based on PixelPathos Crystal.
## Description
-**If you enjoy using Crystal, you can support my work with a small donation:**
-https://goo.gl/vFCE4T
+**If you enjoy this maintained version of Crystal with Tesla integration, you can support my work with a small donation:**
+https://bit.ly/sylvainga
**FAQs, including how to change watch face settings:**
https://github.com/warmsound/crystal-face/wiki/FAQ
@@ -12,248 +12,315 @@ A crystal clear watch face, with LCD-like goal meter segments, written while sno
Features (depending on watch support):
- Big time digits right in the middle, with hours in bold. Leading zero and seconds can be hidden. Hours and minutes colours can be set independently.
-- Up to 3 customisable data fields: HR (historical/live), battery, notifications, calories, distance, alarms, altitude, thermometer, sunrise/sunset, weather (OpenWeatherMap).
-- Up to 3 customisable indicators: Bluetooth, alarms, notifications, Bluetooth/notifications, battery.
-- 2 customisable meters: steps, floors climbed, active minutes (weekly), battery, calories (custom goal). The meters have auto-scaling segments and current/target value display.
+- Up to 3 customisable data fields: HR (historical/live), battery, notifications, calories, distance, alarms, altitude, thermometer, sunrise/sunset, weather (OpenWeatherMap). THE FOLLOWING ADDED by SylvainGa: Garmin Weather, Recovery Time Left, Body Battery, Solar Intensity, Floors climbed and Pulse Ox.
+- Up to 3 customisable indicators: Bluetooth, alarms, notifications, Bluetooth/notifications, battery, THE FOLLOWING ADDED by SylvainGa: Do Not Disturb and Tesla batterie level/status.
+- 2 customisable meters: steps, floors climbed, active minutes (weekly), battery, calories (custom goal), THE FOLLOWING ADDED by SylvainGa: Body Battery. The meters have auto-scaling segments and current/target value display.
- Move bar.
-- 12 colour themes.
+- 12 colour themes, THE FOLLOWING ADDED by SylvainGa: Customizable themes.
+- Complications and touch points added by SylvainGa
The techie bit: to save your watch battery, the goal meters and move bar are drawn from a palette-restricted back buffer, for improved drawing performance, with minimal memory penalty.
-This is my first ever Connect IQ watch face (please be kind!), so I look forward to your feedback, improving the watch face, and bringing it to more devices.
+This is my first modification of a Connect IQ watch face (please be kind!), so I look forward to your feedback, improving the watch face, and bringing it to more devices.
Reviews:
- Video review in Spanish, by Sergio: https://www.youtube.com/watch?v=TZFhnm_y1MM.
-## What's New
+## Below is what has been added by me (SylvainGa).
+
+### 2.23.0
+- Option to lauch a battery widget when the battery icon is held on Complication enabled devices
+
+### 2.22.1
+- Compiled with CIQ 8.2.1
+- Added new device: Venu X1
+
+### 2.22.0
+- At request, there is now an option to have the date format to have a leading zero when there is only one digit.
+
+### 2.21.1
+- Compiled with CIQ 8.1.1
+- Added new devices: Approach50, Descent G2, Forerunner 570s/970 and VivoActive 6
+- Added changes from flowstatedev - Support long press of live HR field to open HR glance and fixed some strings file that got daved in UTF8-BOM instead of plain UTF8 somehow
+
+### 2.21.0
+- Compiled with CIQ 7.4.3
+- By requests, OpenWeatherMap IS BACK! (as a weather service). This service, unlike Garmin, can display the weather station but relies on the last activity with GPS or default latitude/longitude entered in the app parameters for location (fallback in case there is no activity with GPS). Clear the "OpenWeatherMap API Key Override" field in the Settings to revert to Garmin Weather (the default is back to OWM). Like before, this weather data is pulled at intervals (5 minutes).
+- Fixed a crash when the Tesla data is returned as a dictionary instead of a string, although I requested it to be a string
+- Fixed moveBar to not stay hidden after coming back from AOD.
+
+### 2.20.2
+- Fixed what seems a compiler error when timeToRecovery isn't available and yet, the compiler says it is and causes a crash because of that
+
+### 2.20.1
+- No code changes. Only added back Enduro3 and new Fenix8 watches (including Fenix E).
+
+### 2.20.0
+- Compiled with CIQ 7.3.1
+- Added recovery time as an option to the move bar. Once it's cleared, recovery is done.
+- If the move bar is showing the recovery time and complications are enabled/available, touching that field will launch the recovery time widget.
+- Fixed the centering of the time when the AddColon option is active (thanks blueberry-bytes).
+- Removed references to weather city name since Garmin disabled that feature in their latest firmware.
+
+### 2.19.2
+- Compiled with CIQ 7.3.0. Now works with custom complications (used by Tesla-Info)
+- Added Enduro3 and new Fenix8 watches (including Fenix E).
+- Small code optimisation for Telsa's complications. If you also use Tesla-Link and receive complications from it, update that one too!
+
+### 2.19.0
+- Compiled with CIQ 6.4.2 as 7.x currently breaks custom complications (used by Tesla-Info). Has no impact on features and supported watches.
+- Updated the Tesla status when the car is asleep to match the returned data from the new version of Tesla-Link app.
+- Fixes the 412 error introduced by Tesla with the change to the API
+- Weather city name and "local time in city" locations on screen are dependant on what's showing in the data area
+- Added Active calories as a data fiel and goal. This value is calculated and not provided by Garmin so it might be off to what Garmin is showing. On Complication enabled watches, since it shows only Active calories, the calculated rested calories are added to the Calories fields and goals. To get the previous active calories, select Active Calories field or goal.
+
+### 2.18.13
+- Compiled with CIQ 7.1.1
+- Added Forerunner 165 and 165m
+- Updated the Tesla status when the car is asleep to match the returned data from Tessie
+- Fixed a broken weather icon
+
+### 2.18.12
+- Fixed crash when calling a complication while there is already one running
+- Added Battery as a complication (to launch the battery widget)
+
+### 2.18.11
+- Fixed bug in longitude typechecking for second time (thanks AdrienChenu)
+- Altitude reads from Complication if available
+
+### 2.18.10
+- Added Altitude as a Complication
+
+### 2.18.9
+- Adjusted the fonts for the Venu Sq2
+
+### 2.18.8
+- Added support for the VivoActive5
+
+### 2.18.7
+- Added support for the Venu3 and Venu3S
+
+### 2.18.6
+- Added a default custom Complication to launch when pressing anywhere that's it's not a field, indicator or goal configured as a complication. By Default, this field is set to "Flashlight" (new Widget I created), which if installed on the watch, will transform the screen into a flashlight with three intensity, with the launched one being the dimmest
+- Fixed a crash in onPress
+
+### 2.18.5
+- Fixed for crashing when too much data in the background buffer
+- Fixed for not showing goal's max value on watches not having Complications
+
+### 2.18.4
+- Made some conditional compiling so watches that don't support Complications do not include functions related to that. This is to help watches with low allocated watchface memory, like the Venu SQ, to run without crashing because of Out of Memory errors
+- Saw a weird crash in onPress so I added type checking to prevent it from happening again
+
+### 2.18.3
+- Corrected invalid value for Stress read from sensor, not Complications
+- For performance, ignore Tesla-Link Complications if we're told not to use them
+- Changed the logic for when the background process should run next
+- Fixed Always On Display for Tesla Battery
+
+### 2.18.2
+- Fixed a crash on a VenuSQ
+- Fixed a crash when invalid data is received from the background process
+
+### 2.18.1
+- Gave the weather station name its own line so it doesn't hide the Goals current/max fields. Local City Time will still hide these though. This is how it always was.
+- Added an option in Settings (Show weather station name) to show or not the weather station name, defaults to True.
+- Watches that although are at CIQ V3.2.0 and above but are still lacking Garmin Weather will display "N/A" for temperature/humidity/sunrise/sunset.
+- Trying to free some more room so watches with 98KB of watch face memory doesn't crash with Out of Memory errors.
+- Gave the Forerunner 55 access to the weather and humidity since it supports Garmin Weather
+
+### 2.18.0
+- Removed Watch model that are not at least at CIQ 3.3.0. This is required for the new Sunrise/Sunset and Weather library by Garmin. From the stats Garmin shows me about the watch face, none of them had downloaded the watch face anyway.
+- Removed the OpenWeatherMap and rely solely on Garmin Weather. The OWN and GPS was giving too much problem.
+- Added Recovery Time as Complications and Touch points.
+- Added Weather and Sunrise data fields as touch point (but not read from Complications)
+- The area on the screen allocated for "Local time in City" will display the current weather station name if no city was entered.
+- The "Local time in City" has been redone, much simplier, doesn't require Background process anymore but will need some work on your side. The field in the setting is now a Comma Separated Value (CSV) with the first value being the city name, second the latitude of the city and third its longitude. The last two in decimal notation (with a period, not comma). You will have to enter these, which are easy to find in Google Map anyway. No type checking done, beside making sure the latitude and longitude are numbers. If invalid, '???' will be shown for the time.
+- Redid the Tesla code and added the reading of the Tesla-Link Complications to get Tesla data instead of querying Tesla's servers internally. No more Token handling if using Complications and Tesla-Link. Because of the size of the data returned when the vehicle is awake, a watch with just 32KB of background space will not be able to show that data and will show error -403 instead (network response out of memory). If it's your case and your watch support Complication, check the Tesla-Link checkbox in the Settings and install the Tesla-Link widget/app. That one has just enough room to download the data and will send it to Crystal-Tesla if asked to send Complication to it.
+- Added a Setting to select which Tesla vehicle to show. Defaults to 1. If you have more than one vehicle, use this field to select which vehicle to show. If Tesla data is read from Tesla-Link Complication, it's that one that will dictate which vehicle will appear on the watch face. The Settings here will be ignored, just like the tokens. Give it up to 5 minutes to update its data.
+
+### 2.17.4
+- One more attempt at fixing the crash because of the Settings change since 2.17.1
+
+### 2.17.3
+- Main change is the hardening of the Properties reading to fix a crash (crash caused by the new Complication checkbox in Settings on some watches)
+- Replaced the T letter before the Tesla's battery charge in AlwaysOnDisplays to the Tesla Symbol
+
+### 2.17.2
+- Made Complications an optional item, disabled by default since some watches are not reading them properly. Settable through Settings
+- Adjusted the touch points around the Fields, Indicators and Goals value.
+- Increased the size of the touchpoints as the number of Fields on screen decreases (ie, smallest touchpoint boxes sizes are when three Fields are displayed side by side and the largest touchpoint box is when only one field is dislayed). Doesn't apply to Indicators, just Fields.
+- Fixed a few crashes reported through the Error Reporting Application (ERA) including a crash when Theme color override was invalid. If the color stays to what the selected Theme color is, it's because your override is invalid
+
+### 2.17.1
+- Fixed a crash when Complications were received while leaving Always On Display mode
+- Added Steps and Floor climbs as Complication for Goals.
+- Readded the Tesla Battery display to the Always On Display mode
+
+### 2.17.0
+- Tesla-Info now support launching the main Tesla-Link App from the watch face.
+- Heart rate, PulseOx, BodyBattery and Stress Level are now read through complications if available
+- Complication read fields will launch their widget when long pressed. Applies to Fields, Indicators (for Tesla-Info only for now) and Goals.
+- Fixed a few crashes reported through the Error Reporting Application (ERA)
+
+### 2.16.5b
+- Fixed a crash reported through the Error Reporting Application (ERA)
+
+### 2.16.5a
+- Fixed two crashes reported through the Error Reporting Application (ERA)
+
+### 2.16.5
+- Fixed a crash when entering a City in the "Add a local time in City"
+
+### 2.16.4
+- Recompiled with ConnectIQ4.2.4 since that wasn't the issue with the save settings. It was because watches with ICQ 4.2.0+ didn't support the getProperties/setProperties functions that were used throughout the app. I replaced them all with their corresponding Storage or Properties (for settings) getValue/setValue and was finally able to save the settings on my new Venu2. I was unable to reproduce on my old Venu since it was released pre 4.2.0.
+- Added the MARQ® (Gen 2) Athlete / Adventurer / Captain / Golfer / Aviator watches
+
+### 2.16.3
+- Recompiled with ConnectIQ4.1.7 which will hopefully fixed the fail to save settings for everyone with the issue and not create more issues.
+- Fixed the 416x416 watch font missing a '+'
+
+### 2.16.2
+Hopefully fixed the fail to save settings for everyone with the issue.
+
+### 2.16.1
+Double entry in the english string file was (not) causing Connect to fail saving settings on devices but not in simulator.
+
+### 2.16.0
+- Added a optional colon between hours and minutes
+- Bug fix in the default latitude/longitude when the last activity has no GPS coordinates.
+- Notice: Access to stress level is not as stable as the Garmin has access to it. To help here, if a value isn't returned, the last good one is used and the icon is greyed out to indicate the data is stale.
+
+### 2.15.1
+- Reverted to Connect IQ 4.1.7 since there are too many problem with sensors with this 4.2.x version so far. Hopefully this doesn't break the watchface on newest Forerunner 265, 265S and 965.
+- Moved the line between time and date in Always On Display so it doesn't strike through the time.
+
+### 2.15.0
+- Added Stress Level as a goal meter and datafield
+- Consolidated some of the watches that were missing goal meters or datafields. If you select one and get a gray icon, it means it's not available for your watch model. If there is a goal meter or datafield that your watch support but can't see it, let me know.
+- Compiled with Connect IQ 4.2.2 which I hope fixes the missing Body Battery sensor some are seeing
+
+### 2.14.2
+- Added Longitude and Latitude as editable fields in the parameters to allow for a DEFAULT location for sunrise/sunset and OpenWeatherMap weather . Any activity found with GPS data will override this location. This should fix many "gps?" error, which simply means no activity with GPS have been found to locate your position, yet. Keep in mind it can take up to 5 minutes before data is retrieved from OWM or Garmin Weather.
+- The weather icon will be grayed out if the request to get the weather fails for some reason (like Bluetooth off, no Internet access or bad OWM API key). If this happens, the temperature or humidity value displayed will be stale. If you create a file called CRYSTALFACE.TXT in the /GARMIN/APPS/LOGS on your watch (connect to your computer first), it will log inside that file the error code of why it failed (unless it's because BLE is Off). This could be helpful at determining the reason of the failure.
+- Added BodyBattery as a datafield to the Forerunner 55
+- Increased the time and date fonts for the 454x454 devices
+- Fixed the missing "/" in the floor climbs datafield for 416x416 and 454x454 devices
+
+### 2.14.1
+- Compiled with Connect IQ 4.2.1 which added the Forerunner 265, 265s and 965 (first 454x454 watch)
+- Added BodyBattery to the Forerunner 55
+
+### 2.14.0
+- "Hide seconds" has been changed from a checkbox to a list with three entries:
+ - Show seconds
+ - Hide seconds when inactive
+ - Always hide seconds
+
+ Show and Hide seconds behaves like the old toggle but "Hide seconds when inactive" will not display seconds when the watchface is in low power mode (ie, inactive). "Memory-In-Pixel" watch consumes energy when a pixel is changed. Preventing the seconds to update every secondes can help reduce the energy drawn by the watchface. Has no Effect on AMOLED watches.
+
+### 2.13.0
+- Added Body Battery as a Goal Meter
+
+### 2.12.1
+- Removed troubleshooting code left by mistake
+
+### 2.12.0
+- Fixed sunrize/sunset time error when timezone has a 30 minutes offset
+- Added support for Teslas in China. These needs different Tesla servers domain name than the rest of the world. These can be changed through the phone app.
+
The default API and AUTH servers are owner-api.teslamotors.com and auth.tesla.com respectively.
+
For China, they are owner-api.vn.cloud.tesla.cn and auth.tesla.cn
+- Added customizable screen colors. Can be set by entering something other than 0 (or blank) in 'RGB Them override' field
+
The format is RRGGBB (Red Green Blue) in hexadecimal (0-F). You can use this web site to figure out the colors you want. Don't enter the leading '#' though: https://www.rapidtables.com/convert/color/rgb-to-hex.html
+
Checking *Light theme override* will give the watchface light background. Unchecking the field gives it a dark background (usefull for OLED display).
+
These are the standard Garmin color and their hexadecimal equivalent
+ - WHITE FFFFFF
+ - LIGHT GRAY AAAAAA
+ - DARK GRAY 555555
+ - BLACK 000000
+ - RED FF0000
+ - DARK RED AA0000
+ - ORANGE FF5500
+ - YELLOW FFAA00
+ - GREEN 00FF00
+ - DARK GREEN 00AA00
+ - BLUE 00AAFF
+ - DARK BLUE 0000FF
+ - PURPLE AA00FF
+ - PINK FF00FF
-### 2.5.0
-- Add support for Venu® 2 and Venu® 2S (thanks to fallingrock for testing help). Thank you for your patience!
-- Technical update to CIQ 4.0.3.
+### 2.11.0
+- Added Recovery Time Left as a data field
-### 2.4.7
-- Improve German translation (thanks to 2b2bff).
-- Translate Dutch settings (thanks to DRG-developer).
-- Allow override of built-in OpenWeatherMap key, in case that key is blocked.
-- Technical update to CIQ 3.2.5 SDK.
+### 2.10.4
+- Fixed AlwaysOnDisplay of Venu SQ 2 and Venu SQ 2 Music
-### 2.4.6
-- Cycle OpenWeatherMap key to circumvent key abuse that led to blocked account.
-
-### 2.4.5
-- Add support for Korean language (thanks to nanbean).
-- 2nd attempt at settings-related crash fix.
-
-### 2.4.4
-- Add support for Approach® S62, D2 Air, Descent™ Mk2, Garmin Swim™ 2, Rey™, MARQ® Golfer, Venu® Mercedes-Benz Collection, Venu® Sq, Venu® Sq – Music Edition.
-- Fix several settings-related crashes.
-- Update Russian translation (thanks to ya_kazachkov).
-- Correct German translation (thanks to axcro7).
-- Technical update to CIQ 3.2.2 SDK.
-
-### 2.4.3
-- Putative fix for Venu™ crash on 2.80 firmware.
-
-### 2.4.2
-- 2nd attempt at fēnix® 5X crash. Bug in 15.10 firmware (requiresBurnInProtection incorrectly set to true) identified with invaluable help from jeriveraf.
-
-### 2.4.1
-- Putative fix for fēnix® 5X series crash. Thank you everyone for your patience.
-
-### 2.4.0
-- Add support for Venu™, with new always-on layout.
-- Add support for MARQ™ Adventurer and Commander.
-- Technical update to CIQ 3.1.5 SDK.
-
-### 2.3.7
-- Add bespoke fonts and layout for fēnix® 6X.
-- Improve readability of small font for all watches.
-
-### 2.3.6
-- Technical update to CIQ 3.1.4 SDK. Add support for fēnix® 6 series (except fēnix® 6X), Captain Marvel, First Avenger and vívoactive® 4 series.
-
-### 2.3.5
-- Add support for Forerunner® 45.
-
-### 2.3.4
-- Fix crash when changing numeric settings (e.g. "Calories Goal") using Connect IQ Store app.
-
-### 2.3.3
-- New Meter Style options, and new Meter Digits Style setting.
-- Fix issue when setting field or indicator count to 0.
-- Fix display of weather icon on Forerunner® 735XT.
-- Fix German translation typo.
-- Technical update to CIQ 3.0.11 SDK. Add support for Forerunner® 245/245 Music/945 and vívolife.
-
-### 2.3.2
-- Fix issues with weather and humidity not updating.
-- Technical update to CIQ 3.0.10 SDK. Add support for MARQ™ series and vívoactive® 3 Mercedes-Benz.
-
-### 2.3.1
-- Putative fix for intermittent storage-related crashes on fēnix® 5 series, vívoactive® 3 series and Approach® S60.
-- Update Swedish translation (thanks to fredrikaverpil).
-- Technical update to CIQ 3.0.9 SDK. Add support for vívoactive® 3 Music LTE.
-
-### 2.3.0
-- Increase time font size and revise layouts for all watches.
-- Single line time for vívoactive® HR.
-
-### 2.2.6
-- Add "Humidity" data field (uses OpenWeatherMap). Many thanks to jrmcsoftware for implementing this.
-- Technical update to CIQ 3.0.8 SDK.
-
-### 2.2.5
-- "Pressure" data field should use historical data, to respect manual pressure calibration on fēnix® 5 watches (thanks to Allalin72 for help with this).
-
-### 2.2.4
-- Fix issue with move bar not clearing in "Show Filled Segments" mode (thanks to BrettL for reproduction steps).
-- Add "Corn Yellow (Dark)" and "Dayglo Orange (Light)" themes.
-- Add "Pressure" data field.
-- Technical update to CIQ 3.0.7 SDK.
-
-### 2.2.3
-- Remove need to enter OpenWeatherMap key.
-- Technical update to CIQ 3.0.6 SDK.
-
-### 2.2.2
-- Fix issue with stuck "key!" if weather key is used before it has been activated.
-
-### 2.2.1
-- Fix intermittent crash after receiving weather data.
-
-### 2.2.0
-- Add "Weather" data field: CIQ 2.x devices only, requires free OpenWeatherMap API key (https://openweathermap.org/).
-
-### 2.1.0
-- Add "Sunrise/Sunset" data field.
-- Read altitude from more up-to-date source, and enable for all watches.
-- Add Croatian date translation (thanks to Kristijan).
-- Russian translation updates, and string fixes (thanks to xgsa).
-- German translation for settings screen (thanks to dragonito).
-- Technical update to CIQ 3.0.4 SDK.
-
-### 2.0.1
-- Fix crash when changing settings.
-
-### 2.0.0
-- Russian translation for watch face and settings screen (thanks to xgsa).
-- Display of additional time zone: specify city in settings (CIQ 2.x devices only, in beta). See FAQ.
-- Re-enable support for Approach® S60.
-- Technical update to CIQ 3.0.3 SDK.
-
-### 1.8.1
-- Added "Heart Rate (Live 5s)" data field.
-- Read HR from more up-to-date source.
-- Improved clarity of battery indicator.
-- "Hide Hours Leading Zero" now setting applies to both 12- and 24-hour modes.
-- Technical update to CIQ 2.4.9 SDK, to add support for D2™ Delta, D2™ Delta PX, D2™ Delta S.
-
-### 1.8.0
-- Added setting to control number of data fields (0-3).
-- Added setting to control number of indicators (0-3): Bluetooth, alarms, notifications, bluetooth/notifications.
-- Improved memory efficiency.
-- Layout adjustments.
-- Technical update to CIQ 2.4.8 SDK.
-
-### 1.7.4
-- Polish translation for settings screen (thanks to Flugcojt).
-- Swedish translation for settings screen (thanks to hasselrot).
-
-### 1.7.3
-- Update to CIQ 2.4.7 SDK, to add support for fēnix® 5 Plus, fēnix® 5S Plus, fēnix® 5X Plus, vívoactive® 3 Music.
-- Fixed issue with "ft" altitude units displaying incorrectly (thanks to Matt Reiser).
-
-### 1.7.2
-- Altitude units now obey statue/metric setting (thanks to Rick Gorham).
-- Added "Battery (Hide Percentage)" data field (thanks to Paolo Avezzano).
-- Corrected number of move bar segments to 5 (thanks to Viorel).
-- Technical update to CIQ 2.4.6 SDK.
-
-### 1.7.1
-- Re-enabled Forerunner® 920XT, following non-anti-aliased custom font workaround provided by Coleman at Garmin.
-- Corrected French translation (thanks to Ju Neusch).
-
-### 1.7.0
-- Added temperature data field option.
-- Added vivid yellow dark theme.
-- Added meter style setting.
-- Added move bar style setting.
-- Corrected German translations (thanks to Christoph Heymann for help with this).
-- Temporarily removed support for Approach® S60 and Forerunner® 920XT, pending fixes from Garmin - many thanks for your patience.
-- Technical update to CIQ 2.4.5 SDK.
-
-### 1.6.1
-- Added barometric altitude for supported CIQ 2.x devices.
-- Show midnight as "12" instead of "00" in 12-hour mode.
-- Fixed incorrect default settings for vívoactive®.
-
-### 1.6.0
-- Added blue, red and green light themes.
-- Allow colour of hours and minutes to be overridden independently.
-- Allow hiding of hours leading zero in 12 hr mode.
-- Prevent overlapping goal numbers on semi-round watches (thanks to G_stijn for reporting this).
-
-### 1.5.3
-- Fix crash if floors or active minutes goal is set to 0: show disabled meter instead.
-
-### 1.5.2
-- Technical update to CIQ 2.4.4 SDK.
-
-### 1.5.1
-- Added alarms data field option.
-- Rollout to CIQ 1.x devices, part 2: Forerunner® 230, Forerunner® 235, Forerunner® 630, Forerunner® 920XT, vívoactive®.
-
-### 1.5.0
-- Rollout to CIQ 1.x devices, part 1: D2™ Bravo, D2™ Bravo Titanium, fēnix® 3, fēnix® 3 HR.
-
-### 1.4.3
-- Meters can now show a custom calories goal, specified in settings.
-- Fixed issue with wrong strings or crash when changing settings via Garmin Express in non-English locales (thanks to Ezio Pillan for reporting this bug).
-- Added app version to settings page.
-
-### 1.4.2
-- Allow hiding of seconds.
-
-### 1.4.1
-- Reduce battery drain, part 2: optimise per-minute updates (cache drawable references).
-- Allow meters to display battery level.
-
-### 1.4.0
-- Reduce battery drain, part 1: reduce per-second update time from ~13ms to ~5ms (measured on Approach® S60, simulator).
-- Added Red (Dark) and Mono (Dark) themes.
-- Added support for vívoactive® HR.
-
-### 1.3.0
-- Added support for fēnix® 5S, fēnix® Chronos, Forerunner® 735XT.
-- Added Dayglo Orange theme.
-
-### 1.2.1
-- Fixed issue with distance value being too low (thanks to catana.remulus for reporting and assisting with this bug).
-
-### 1.2.0
-- Added support for Approach® S60, D2™ Charlie, Descent™ Mk1, Forerunner® 645, Forerunner® 645 Music, Forerunner® 935, fēnix® 5, fēnix® 5X.
-- Added Cornflower Blue and Lemon Cream themes for better visibility.
-
-**N.B. Due to a vívoactive® 3 firmware bug, this watch face will be stuck on the language that was active at the time of the 3.30-3.40 firmware upgrade. Hopefully Garmin will fix this in a future firmware.**
-
-### 1.1.0
-- Internationalisation: added support for Chinese (Simplified/Traditional), Czech, Danish, Dutch, Finnish, French, German, Hungarian, Italian, Norwegian, Polish, Portugese, Slovak, Slovenian, Spanish, Swedish.
-- Force language to English for unsupported locales, to prevent garbled characters.
-- Fixed issue with battery meter not showing low/critical warning colours soon enough.
-
-### 1.0.1
-- Fixed issue with showing noon as AM, rather than PM (with thanks to JACalvo for reporting this bug).
-- Fixed issue with move bar not updating correctly.
-
-### 1.0.0
-- Initial public release for vívoactive® 3 only.
-
-## Credits
-Icons:
-- "[Distance](https://thenounproject.com/term/distance/1514833/)" icon by Becris from [the Noun Project](https://thenounproject.com).
-- "[Fire](https://thenounproject.com/term/fire/24187/)" icon by Jenny Amer from [the Noun Project](https://thenounproject.com).
-- "[Steps](https://thenounproject.com/term/steps/87667/)" icon by Eugen Belyakoff from [the Noun Project](https://thenounproject.com).
-- "[Upstairs](https://thenounproject.com/term/upstairs/304907/)" icon by Arthur Shlain from [the Noun Project](https://thenounproject.com).
-- "[Stopwatch](https://thenounproject.com/term/stopwatch/319102/)" icon by Rohith M S from [the Noun Project](https://thenounproject.com).
-- "[Mountains](https://thenounproject.com/term/mountains/1468194/)" icon by Deemak Daksina from [the Noun Project](https://thenounproject.com).
-- "[Humidity](https://thenounproject.com/term/humidity/1554816/)" icon by Akriti Bhusal from [the Noun Project](https://thenounproject.com).
+### 2.10.3a
+- Fixed Dutch translations. Thanks ChristopheMB
+
+### 2.10.3
+- Added the Enduro, Venu SQ 2 and Venu SQ 2 Music
+
+### 2.10.2
+- Fixed missing 'Û' in 280x280 font
+
+### 2.10.1
+- Added Forerunner 255, 255 Music, 255s, 255s Music
+
+### 2.10.0
+- Added Body Battery as a data field. Bug fix for Solar Intensity on 390x390 watches
+
+### 2.9.0
+- Added the Solar Intensity as a data field. Relevant only to watches that support solar.
+
+### 2.8.2
+- Added the Forerunner 955 / Solar
+
+### 2.8.1
+- Removed the following watch as they have not enough memory for watch faces to work reliably with the newer versions of this watch face: D2 Bravo, D2 Bravo Titanium, fēnix 3 / tactix Bravo / quatix 3, fēnix 3 HR, Forerunner 230, Forerunner 235, Forerunner 630, Forerunner 735xt, Forerunner 920xt, vívoactive, vívoactive HR and vivolife.
+
+### 2.8.0
+- Added the Tesla battery level to the Always On Display. To stay within the 10% of pixel on, I removed the day of the week from the date to make room for the battery level.
+
+### 2.7.5
+- Added 'Do Not Disturb' as an indicator
+
+### 2.7.4.2
+- Added Descent Mk1, Mk2 and Mk2s as supported devices
+
+### 2.7.4.1
+- Fixed the '/' in the font files missing it.
+
+### 2.7.4
+- Added Floors climbed as a data field. Some fonts do not have the '/' symbol so for now on these watches (the 416x416 resolution watches), it will be displayed as a rectangle (default for non recognized character).
+
+### 2.7.3
+- The Altitude will remain on screen, even if the watch face loses focus. Also fix a very rare occurrence of a crash when displaying seconds and the area where the seconds are to be displayed is overwritten by the move bar.
+
+### 2.7.2
+- Trying to fix the Altitude code so its value doesn't disappear when GPS is lost. Removal of Garmin Swim 2 from supported devices.
+
+### 2.7.1
+- Fixes a crash when Garmin Weather was not available
+
+### 2.7.0
+- Addition of the Garmin Weather API. If you're having issue with the OpenWeatherMap API Key and your watch supports Garmin API 3.2 or higher (see https://developer.garmin.com/connect-iq/compatible-devices/), by clearing the field "OpenWeatherMap API Key Override" in the Settings, it will use the Garmin Weather API instead. Weather Options is available for watches with a Garmin API 2.4 and higher.
+
+### 2.6.3
+- Fix sunrise showing today's time instead of tomorrow's when sunset time has been reached and it's before midnight
+
+### 2.6.2
+- Disables background services for watch that doesn't support it. Features that won't work without background services are Weather, sunrise/sunset and Tesla Info.
+
+### 2.6.1
+- Better handling of errors and can now refresh an access token through the help of the Refresh token (hopefully)
+
+### 2.6.0
+- Added a Tesla battery level as an indicator which is activated by choosing the indicator 'Tesla Info'. If the vehicle is awake, it will display the battery charge level as a percentage, followed by a '+' sign if it's being actively charged. It will also cycle to P on/off for the Preconditioning Status, S on/off for Sentry Status and the vehicle's inside temperature. If the car is asleep, a 's' will be displayed after the battery level and it will only cycle between that and P on/off. If an error is received from the car, it will be displayed in pink instead of the battery level. Scan interval is the standard 5 minutes so give it at least 15 minutes at start to get the access to the car and poll its status.
+
+ You'll need to generate at least a refresh token and enter it in the watch face parameter to give access to your vehicle status. You can get a token through online services or phone apps like Tesla Token. If you give it also an access token, the refresh time before capturing data will be decreased by 5 minutes. Make sure your vehicle is awake for at least 15 minutes when you first launch the watch with the token set so it can connect to it. It will NOT wake the vehicle to retrieve any of the info and it does NOT prevent the vehicle from falling asleep.
+
+### 2.5.x
+- Added PulseOx as a data field
+
+See https://apps.garmin.com/en-US/apps/9fd04d09-8c80-4c81-9257-17cfa0f0081b for previous changes made by Pixel Pathos
diff --git a/always-on-source/AlwaysOnDisplay.mc b/always-on-source/AlwaysOnDisplay.mc
index cd8ad4d0..57a3cf21 100644
--- a/always-on-source/AlwaysOnDisplay.mc
+++ b/always-on-source/AlwaysOnDisplay.mc
@@ -3,6 +3,7 @@ using Toybox.System as Sys;
using Toybox.Application as App;
using Toybox.Time;
using Toybox.Time.Gregorian;
+using Toybox.Application.Storage;
// Draw time, line, date, battery.
// Combine stripped down versions of ThickThinTime and DateLine.
@@ -10,7 +11,7 @@ using Toybox.Time.Gregorian;
class AlwaysOnDisplay extends Ui.Drawable {
private var mBurnInYOffsets;
- private var mHoursFont, mMinutesFont, mSecondsFont, mDateFont, mBatteryFont;
+ private var mHoursFont, mMinutesFont, mSecondsFont, mDateFont, mBatteryFont, mTeslaFont;
// Wide rectangle: time should be moved up slightly to centre within available space.
private var mAdjustY = 0;
@@ -68,13 +69,18 @@ class AlwaysOnDisplay extends Ui.Drawable {
var dateFontOverride = Ui.loadResource(Rez.Strings.DATE_FONT_OVERRIDE);
var dateFont = (resourceMap.hasKey(dateFontOverride)) ? resourceMap[dateFontOverride] : rezFonts.AlwaysOnDateFont;
mDateFont = Ui.loadResource(dateFont);
+
+ if (Storage.getValue("Tesla") != null) {
+ mTeslaFont = Ui.loadResource(Rez.Fonts.IconsFont);
+ }
+
}
function draw(dc) {
// TIME.
var clockTime = Sys.getClockTime();
- var formattedTime = App.getApp().getFormattedTime(clockTime.hour, clockTime.min);
+ var formattedTime = App.getApp().getFormattedTime(clockTime.hour, clockTime.min, clockTime.sec);
formattedTime[:amPm] = formattedTime[:amPm].toUpper();
// Change vertical offset every minute.
@@ -83,13 +89,14 @@ class AlwaysOnDisplay extends Ui.Drawable {
var hours = formattedTime[:hour];
var minutes = formattedTime[:min];
var amPmText = formattedTime[:amPm];
+ var colon = ":"; // SG Addition
var halfDCWidth = dc.getWidth() / 2;
// Centre combined hours and minutes text (not the same as right-aligning hours and left-aligning minutes).
// Font has tabular figures (monospaced numbers) even across different weights, so does not matter which of hours or
// minutes font is used to calculate total width.
- var totalWidth = dc.getTextWidthInPixels(hours + minutes, mHoursFont);
+ var totalWidth = dc.getTextWidthInPixels(hours + colon + minutes, mHoursFont); // SG Added colon
var x = halfDCWidth - (totalWidth / 2);
var y = mTimeY + mAdjustY + burnInYOffset;
@@ -105,6 +112,16 @@ class AlwaysOnDisplay extends Ui.Drawable {
);
x += dc.getTextWidthInPixels(hours, mHoursFont);
+ // SG Addition - Colon.
+ dc.drawText(
+ x,
+ y,
+ mHoursFont,
+ colon,
+ Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+ x += dc.getTextWidthInPixels(colon, mHoursFont);
+
// Minutes.
dc.drawText(
x,
@@ -128,7 +145,7 @@ class AlwaysOnDisplay extends Ui.Drawable {
// LINE.
y = mLineY + burnInYOffset;
- dc.setPenWidth(/* mLineStroke */ 2);
+ dc.setPenWidth(/* mLineStroke */ 1); // SG From 2 to 1
dc.drawLine(halfDCWidth - (mLineWidth / 2), y, halfDCWidth + (mLineWidth / 2), y);
// DATA.
@@ -181,22 +198,82 @@ class AlwaysOnDisplay extends Ui.Drawable {
// Date.
y = mDataY + burnInYOffset;
- dc.drawText(
- mDataLeft,
- y,
- mDateFont,
- Lang.format("$1$ $2$ $3$", [mDayOfWeekString, day, mMonthString]),
- Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER
- );
+ if (Storage.getValue("Tesla") == null) {
+ dc.drawText(
+ mDataLeft,
+ y,
+ mDateFont,
+ Lang.format("$1$ $2$ $3$", [mDayOfWeekString, day, mMonthString]),
+ Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
- // Battery.
- var battery = Math.floor(Sys.getSystemStats().battery);
- dc.drawText(
- dc.getWidth() - mDataLeft,
- y,
- mBatteryFont,
- battery.format(INTEGER_FORMAT) + "%",
- Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER
- );
+ // Battery.
+ var battery = Math.floor(Sys.getSystemStats().battery);
+ dc.drawText(
+ dc.getWidth() - mDataLeft,
+ y,
+ mBatteryFont,
+ battery.format(INTEGER_FORMAT) + "%",
+ Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+ }
+ else {
+ dc.drawText(
+ mDataLeft,
+ y,
+ mDateFont,
+ Lang.format("$1$ $2$", [day, mMonthString]),
+ Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+
+ // Batteries.
+ var watchBattery = Math.floor(Sys.getSystemStats().battery);
+
+ var teslaInfo = Storage.getValue("TeslaInfo");
+ if (teslaInfo == null) {
+ teslaInfo = {};
+ }
+ var chargingState = teslaInfo.get("ChargingState");
+ var error = teslaInfo.get("httpErrorTesla");
+
+ if (chargingState != null) {
+ if (chargingState.equals("Charging")) {
+ chargingState = 1;
+ } else if (chargingState.equals("Sleeping")) {
+ chargingState = 2;
+ } else {
+ chargingState = 0;
+ }
+ } else {
+ chargingState = 0;
+ }
+
+ var vehicleBattery = teslaInfo.get("BatteryLevel");
+ if (error != null && error != 200) {
+ vehicleBattery = error.toNumber().format(INTEGER_FORMAT);
+ } else if (vehicleBattery == null) {
+ vehicleBattery = "???";
+ } else {
+ vehicleBattery = vehicleBattery.toNumber().format(INTEGER_FORMAT) + "%" + (chargingState == 1 ? "+" : (chargingState == 2 ? "s" : ""));
+ }
+
+ var text = vehicleBattery + " " + watchBattery.format(INTEGER_FORMAT) + "%";
+ var widthText = dc.getTextWidthInPixels(text, mBatteryFont);
+
+ dc.drawText(
+ dc.getWidth() - mDataLeft - widthText,
+ y,
+ mTeslaFont,
+ "T",
+ Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+ dc.drawText(
+ dc.getWidth() - mDataLeft,
+ y,
+ mBatteryFont,
+ vehicleBattery + " " + watchBattery.format(INTEGER_FORMAT) + "%",
+ Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+ }
}
}
\ No newline at end of file
diff --git a/manifest.xml b/manifest.xml
index cc45f74b..5823b313 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -1,78 +1,18 @@
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
ces
@@ -99,4 +39,4 @@
-
+
\ No newline at end of file
diff --git a/manifest.xml.prd b/manifest.xml.prd
new file mode 100644
index 00000000..c1752c17
--- /dev/null
+++ b/manifest.xml.prd
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ces
+ dan
+ deu
+ dut
+ eng
+ fin
+ fre
+ hrv
+ hun
+ ita
+ kor
+ nob
+ pol
+ por
+ rus
+ slo
+ slv
+ spa
+ swe
+ zhs
+ zht
+
+
+
+
\ No newline at end of file
diff --git a/monkey.jungle b/monkey.jungle
index a656f7cb..b8aa3c67 100644
--- a/monkey.jungle
+++ b/monkey.jungle
@@ -7,73 +7,94 @@ base.sourcePath = source
fr245.resourcePath = $(fr245.resourcePath);resources-no_floors
fr245m.resourcePath = $(fr245m.resourcePath);resources-no_floors
+# Needs BodyBattery
+fr55.resourcePath = $(fr55.resourcePath);resources-small-time;resources-small-icons
+
# Smaller round watches use small time font.
round-218x218.resourcePath = $(round-218x218.resourcePath);resources-small-time
# Flat tyre watches use small time font and small icons.
# Ditto smallest round watches.
-semiround-215x180.resourcePath = $(semiround-215x180.resourcePath);resources-small-time;resources-small-icons
round-208x208.resourcePath = $(round-208x208.resourcePath);resources-small-time;resources-small-icons
# Rectangle watches generally same as flat tyre, but have some overrides.
rectangle.resourcePath = $(rectangle.resourcePath);resources-small-time;resources-small-icons
-# CIQ 1.x watches only have 16 colours, so cannot support all themes.
-# No Floors or Active Minutes support, so default to showing Battery in right meter, and Calories in the centre field.
-# If a watch also has no HR support, show Distance in left field.
-# No BufferedBitmap support, so exclude buffer-specific variables/functions.
-# No clip support, so goal meter mask required for round/semiround watches.
-
-d2bravo.resourcePath = $(d2bravo.resourcePath);resources-round-218x218-ciq_1.x;resources-ciq_1.x-no_hr
-d2bravo.excludeAnnotations = buffered
-
-d2bravo_titanium.resourcePath = $(d2bravo_titanium.resourcePath);resources-round-218x218-ciq_1.x;resources-ciq_1.x
-d2bravo_titanium.excludeAnnotations = buffered
-
-fenix3.resourcePath = $(fenix3.resourcePath);resources-round-218x218-ciq_1.x;resources-ciq_1.x-no_hr
-fenix3.excludeAnnotations = buffered
-
-fenix3_hr.resourcePath = $(fenix3_hr.resourcePath);resources-round-218x218-ciq_1.x;resources-ciq_1.x
-fenix3_hr.excludeAnnotations = buffered
-
-fr230.resourcePath = $(fr230.resourcePath);resources-semiround-215x180-ciq_1.x;resources-ciq_1.x-no_hr
-fr230.excludeAnnotations = buffered
-
-fr235.resourcePath = $(fr235.resourcePath);resources-semiround-215x180-ciq_1.x;resources-ciq_1.x
-fr235.excludeAnnotations = buffered
-
-fr630.resourcePath = $(fr630.resourcePath);resources-semiround-215x180-ciq_1.x;resources-ciq_1.x-no_hr
-fr630.excludeAnnotations = buffered
-
-fr920xt.resourcePath = $(fr920xt.resourcePath);resources-ciq_1.x-no_hr
-fr920xt.excludeAnnotations = buffered
-
-# Reverse order of resources so that 64-colour themes are permitted.
-# #25: Repeat ciq_1.x-no_hr properties within resources-vivoactive, as properties were not correctly inherited.
-#vivoactive.resourcePath = resources-ciq_1.x-no_hr;$(vivoactive.resourcePath)
-vivoactive.excludeAnnotations = buffered
-
-# #21: Treat fr735xt as CIQ 1.x i.e. unbuffered drawing, due to insufficient memory.
-# Continue to use fr735xt-specific properties and settings, however, as does support active minutes.
-fr735xt.resourcePath = $(fr735xt.resourcePath);resources-semiround-215x180-ciq_1.x
-fr735xt.excludeAnnotations = buffered
-
-# Exclude unused date/indicator code from 60kB devices (extend to other devices as necessary).
-fr735xt.excludeAnnotations = $(fr735xt.excludeAnnotations);double_line_date;horizontal_indicators
-vivoactive_hr.excludeAnnotations = $(vivoactive_hr.excludeAnnotations);double_line_date;vertical_indicators
-
-# #124: fr45's settings.xml repeats whole of resources-ciq_1.x, then overrides, as settings were not correct inherited.
-# Exclude background methods as memory is very limited (extend to other devices as necessary).
-fr45.excludeAnnotations = $(fr45.excludeAnnotations);buffered;background_method;double_line_date;horizontal_indicators
-
-# garminswim2 has same limitations as fr45 (CIQ 1.x, low memory, low colours).
-garminswim2.excludeAnnotations = $(garminswim2.excludeAnnotations);buffered;background_method;double_line_date;horizontal_indicators
-
# #144: Always on display.
venu.sourcePath = $(venu.sourcePath);always-on-source
venu2.sourcePath = $(venu2.sourcePath);always-on-source
venu2s.sourcePath = $(venu2s.sourcePath);always-on-source
+venu2plus.sourcePath = $(venu2plus.sourcePath);always-on-source
+venusq2.sourcePath = $(venusq2.sourcePath);always-on-source
+venusq2m.sourcePath = $(venusq2m.sourcePath);always-on-source
venud.sourcePath = $(venud.sourcePath);always-on-source
venusq.sourcePath = $(venusq.sourcePath);always-on-source
venusqm.sourcePath = $(venusqm.sourcePath);always-on-source
+venu3.sourcePath = $(venu3.sourcePath);always-on-source
+venu3s.sourcePath = $(venu3s.sourcePath);always-on-source
+venux1.sourcePath = $(venux1.sourcePath);always-on-source
d2air.sourcePath = $(d2air.sourcePath);always-on-source
+d2mach1.sourcePath = $(d2mach1.sourcePath);always-on-source
+d2airx10.sourcePath = $(d2airx10.sourcePath);always-on-source
+epix2.sourcePath = $(epix2.sourcePath);always-on-source
+fr965.sourcePath = $(fr965.sourcePath);always-on-source
+fr165.sourcePath = $(fr165.sourcePath);always-on-source
+fr165m.sourcePath = $(fr165m.sourcePath);always-on-source
+fr265.sourcePath = $(fr265.sourcePath);always-on-source
+fr265s.sourcePath = $(fr265s.sourcePath);always-on-source
+marq2.sourcePath = $(marq2.sourcePath);always-on-source
+marq2aviator.sourcePath = $(marq2aviator.sourcePath);always-on-source
+approachs7042mm.sourcePath = $(approachs7042mm.sourcePath);always-on-source
+approachs7047mm.sourcePath = $(approachs7047mm.sourcePath);always-on-source
+epix2pro42mm.sourcePath = $(epix2pro42mm.sourcePath);always-on-source
+epix2pro47mm.sourcePath = $(epix2pro47mm.sourcePath);always-on-source
+epix2pro51mm.sourcePath = $(epix2pro51mm.sourcePath);always-on-source
+fenix843mm.sourcePath = $(fenix843mm.sourcePath);always-on-source
+fenix847mm.sourcePath = $(fenix847mm.sourcePath);always-on-source
+fenixe.sourcePath = $(fenixe.sourcePath);always-on-source
+vivoactive5.sourcePath = $(vivoactive5.sourcePath);always-on-source
+descentmk343mm.sourcePath = $(descentmk343mm.sourcePath);always-on-source
+descentmk351mm.sourcePath = $(descentmk351mm.sourcePath);always-on-source
+approachs50.sourcePath = $(approachs50.sourcePath);always-on-source
+descentg2.sourcePath = $(descentg2.sourcePath);always-on-source
+fr57042mm.sourcePath = $(fr57042mm.sourcePath);always-on-source
+fr57047mm.sourcePath = $(fr57047mm.sourcePath);always-on-source
+fr970.sourcePath = $(fr970.sourcePath);always-on-source
+vivoactive6.sourcePath = $(vivoactive6.sourcePath);always-on-source
+
+
+base.excludeAnnotations = lowMemoryWatchface;bkgnd32kb;noComplications
+descentmk2.excludeAnnotations = lowMemoryWatchface;bkgnd64kb;hasComplications
+descentmk2s.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+enduro.excludeAnnotations = lowMemoryWatchface;bkgnd64kb;hasComplications
+fenix5plus.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+fenix5splus.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+fenix5xplus.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+fenix6.excludeAnnotations = lowMemoryWatchface;bkgnd64kb;hasComplications
+fenix6pro.excludeAnnotations = lowMemoryWatchface;bkgnd64kb;hasComplications
+fenix6s.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+fenix6spro.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+fenix6xpro.excludeAnnotations = lowMemoryWatchface;bkgnd64kb;hasComplications
+fr245.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+fr245m.excludeAnnotations = highMemoryWatchface;bkgnd32kb;hasComplications
+fr55.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+fr745.excludeAnnotations = highMemoryWatchface;bkgnd32kb;hasComplications
+fr945.excludeAnnotations = highMemoryWatchface;bkgnd32kb;hasComplications
+fr945lte.excludeAnnotations = highMemoryWatchface;bkgnd32kb;hasComplications
+legacyherocaptainmarvel.excludeAnnotations = lowMemoryWatchface;bkgnd32kb;hasComplications
+legacyherofirstavenger.excludeAnnotations = lowMemoryWatchface;bkgnd32kb;hasComplications
+legacysagadarthvader.excludeAnnotations = lowMemoryWatchface;bkgnd32kb;hasComplications
+legacysagarey.excludeAnnotations = lowMemoryWatchface;bkgnd32kb;hasComplications
+marqadventurer.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+marqathlete.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+marqaviator.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+marqcaptain.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+marqcommander.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+marqdriver.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+marqexpedition.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+marqgolfer.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+venu.excludeAnnotations = lowMemoryWatchface;bkgnd64kb;hasComplications
+venusq.excludeAnnotations = highMemoryWatchface;bkgnd64kb;hasComplications
+venusqm.excludeAnnotations = lowMemoryWatchface;bkgnd64kb;hasComplications
+vivoactive4.excludeAnnotations = lowMemoryWatchface;bkgnd32kb;hasComplications
+vivoactive4s.excludeAnnotations = lowMemoryWatchface;bkgnd32kb;hasComplications
diff --git a/prototypes/AOD.jpg b/prototypes/AOD.jpg
new file mode 100644
index 00000000..0cbc933b
Binary files /dev/null and b/prototypes/AOD.jpg differ
diff --git a/prototypes/Crystal-Tesla.jpg b/prototypes/Crystal-Tesla.jpg
new file mode 100644
index 00000000..94c22d42
Binary files /dev/null and b/prototypes/Crystal-Tesla.jpg differ
diff --git a/prototypes/Epix2.jpg b/prototypes/Epix2.jpg
new file mode 100644
index 00000000..c3fd70fb
Binary files /dev/null and b/prototypes/Epix2.jpg differ
diff --git a/prototypes/Fenix7.jpg b/prototypes/Fenix7.jpg
new file mode 100644
index 00000000..acc935f7
Binary files /dev/null and b/prototypes/Fenix7.jpg differ
diff --git a/prototypes/cover-image-Beta.jpg b/prototypes/cover-image-Beta.jpg
new file mode 100644
index 00000000..e9c12be6
Binary files /dev/null and b/prototypes/cover-image-Beta.jpg differ
diff --git a/resources-approachs60/settings/properties.xml b/resources-approachs60/settings/properties.xml
deleted file mode 100644
index c0e58606..00000000
--- a/resources-approachs60/settings/properties.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- 2
-
-
- 4
-
-
\ No newline at end of file
diff --git a/resources-approachs60/settings/settings.xml b/resources-approachs60/settings/settings.xml
deleted file mode 100644
index b50722b3..00000000
--- a/resources-approachs60/settings/settings.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
- @Strings.Steps
-
- @Strings.ActiveMinutes
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.Steps
-
- @Strings.ActiveMinutes
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
diff --git a/resources-approachs62/settings/properties.xml b/resources-approachs62/settings/properties.xml
deleted file mode 100644
index 2782de9e..00000000
--- a/resources-approachs62/settings/properties.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
- 2
-
-
\ No newline at end of file
diff --git a/resources-approachs62/settings/settings.xml b/resources-approachs62/settings/settings.xml
deleted file mode 100644
index f74f5684..00000000
--- a/resources-approachs62/settings/settings.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
- @Strings.Steps
-
- @Strings.ActiveMinutes
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.Steps
-
- @Strings.ActiveMinutes
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.HeartRate
- @Strings.HeartRateLive5s
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
-
- @Strings.HeartRate
- @Strings.HeartRateLive5s
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
-
- @Strings.HeartRate
- @Strings.HeartRateLive5s
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
diff --git a/resources-ces/strings/strings.xml b/resources-ces/strings/strings.xml
index a32f18c1..bfb7aa00 100644
--- a/resources-ces/strings/strings.xml
+++ b/resources-ces/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Lis
Pro
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-ciq_1.x-no_hr/settings/properties.xml b/resources-ciq_1.x-no_hr/settings/properties.xml
deleted file mode 100644
index cb2de3ec..00000000
--- a/resources-ciq_1.x-no_hr/settings/properties.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- -1
- 3
-
-
- 4
-
-
\ No newline at end of file
diff --git a/resources-ciq_1.x-no_hr/settings/settings.xml b/resources-ciq_1.x-no_hr/settings/settings.xml
deleted file mode 100644
index b9ffed38..00000000
--- a/resources-ciq_1.x-no_hr/settings/settings.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
- @Strings.ThemeBlueDark
- @Strings.ThemePinkDark
- @Strings.ThemeRedDark
- @Strings.ThemeGreenDark
-
-
-
- @Strings.ThemeCornYellowDark
- @Strings.ThemeDaygloOrangeDark
- @Strings.ThemeMonoDark
- @Strings.ThemeMonoLight
- @Strings.ThemeBlueLight
- @Strings.ThemeGreenLight
- @Strings.ThemeRedLight
- @Strings.ThemeDaygloOrangeLight
-
-
-
-
-
- @Strings.Steps
-
-
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.Steps
-
-
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
-
-
-
diff --git a/resources-ciq_1.x/settings/settings.xml b/resources-ciq_1.x/settings/settings.xml
deleted file mode 100644
index f394bc41..00000000
--- a/resources-ciq_1.x/settings/settings.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
- @Strings.ThemeBlueDark
- @Strings.ThemePinkDark
- @Strings.ThemeRedDark
- @Strings.ThemeGreenDark
-
-
-
- @Strings.ThemeCornYellowDark
- @Strings.ThemeDaygloOrangeDark
- @Strings.ThemeMonoDark
- @Strings.ThemeMonoLight
- @Strings.ThemeBlueLight
- @Strings.ThemeGreenLight
- @Strings.ThemeRedLight
- @Strings.ThemeDaygloOrangeLight
-
-
-
-
-
- @Strings.Steps
-
-
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.Steps
-
-
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.HeartRate
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
- @Strings.HeartRate
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
- @Strings.HeartRate
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
-
-
-
diff --git a/resources-dan/strings/strings.xml b/resources-dan/strings/strings.xml
index 25596ac4..ba79299a 100644
--- a/resources-dan/strings/strings.xml
+++ b/resources-dan/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Nov
Dec
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-deu/strings/strings.xml b/resources-deu/strings/strings.xml
index fc22c229..7ace5c3a 100644
--- a/resources-deu/strings/strings.xml
+++ b/resources-deu/strings/strings.xml
@@ -1,7 +1,6 @@
Crystal
- App Version
Theme
Stunden Farbe
@@ -14,8 +13,12 @@
Städtische Lokalzeit hinzufügen (Beta)
Move Bar Style
Sekunden ausblenden
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Führende Nullen ausblenden
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Anzahl der Datenfelder
Datenfeld 1
@@ -57,8 +60,12 @@
Schritte
Stockwerke
- Aktive Minuten (Wöchentlich)
+ Solar Intensity
+ Body Battery
+ Recovery Time
+ Aktive Minuten (Wöchentlich)
Kalorien (manuelles Ziel)
+ Active Calories (Manual Goal)
Aus
Herzfrequenz
@@ -67,6 +74,7 @@
Batterie (Prozente ausgeblendet)
Hinweise
Kalorien
+ Active Calories
Distanz
Alarme
Höhe
@@ -102,4 +110,24 @@
Nov
Dez
+
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-dut/strings/strings.xml b/resources-dut/strings/strings.xml
index c0d17187..2b2513e9 100644
--- a/resources-dut/strings/strings.xml
+++ b/resources-dut/strings/strings.xml
@@ -1,22 +1,24 @@
-
Crystal
- App Versie
Thema
Uren Kleur
Minuten Kleur
Linker Meter
Rechter Meter
- Calorien Doel (1-10,000kCal)
+ Calorieën Doel (1-10,000kCal)
Meter Stijl
Meter Getallen Stijl
Voeg Lokale Tijd In Stad Toe (Beta)
Beweeg Balk Stijl
Verberg Seconden
- Verberg Eerste Nul Bij Uuren
- OpenWeatherMap API Key Override
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
+ Verberg Eerste Nul Bij Uren
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Hoeveelheid Datavelden
Data Veld 1
@@ -58,24 +60,29 @@
Stappen
Trappen Beklommen
- Active Minuten (Wekelijks)
- Calorien (Manueel Doel)
+ Zonne-intensiteit
+ Body Battery
+ Recovery Time
+ Actieve Minuten (Wekelijks)
+ Calorieën (Manueel Doel)
+ Active Calories (Manual Goal)
Uit
- Hartslage
+ Hartslag
Hartslag (Live 5s)
Batterij
Batterij (Verberg Percentage)
Notificaties
- Calorien
+ Calorieën
+ Active Calories
Afstand
Alarmen
Hoogte
Thermometer
Bluetooth
Bluetooth/Notificaties
- Zonopkomst / -Ondergang
- Weeer
+ Zonsopkomst / -Ondergang
+ Weer
Vochtigheid
Luchtdruk
@@ -103,4 +110,24 @@
Nov
Dec
+
+ Battery Numeric
+ Pulsoximeter
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-fin/strings/strings.xml b/resources-fin/strings/strings.xml
index 8be0eaf1..0d97cc49 100644
--- a/resources-fin/strings/strings.xml
+++ b/resources-fin/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Mar
Jou
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-ciq_1.x/settings/properties.xml b/resources-fr55/settings/properties.xml
similarity index 73%
rename from resources-ciq_1.x/settings/properties.xml
rename to resources-fr55/settings/properties.xml
index 0981fb4b..eaad25bc 100644
--- a/resources-ciq_1.x/settings/properties.xml
+++ b/resources-fr55/settings/properties.xml
@@ -1,5 +1,6 @@
+
-1
3
diff --git a/resources-fr735xt/settings/settings.xml b/resources-fr55/settings/settings.xml
similarity index 55%
rename from resources-fr735xt/settings/settings.xml
rename to resources-fr55/settings/settings.xml
index 83800a64..b83d66ab 100644
--- a/resources-fr735xt/settings/settings.xml
+++ b/resources-fr55/settings/settings.xml
@@ -1,46 +1,58 @@
+
+
- @Strings.ThemeBlueDark
- @Strings.ThemePinkDark
- @Strings.ThemeRedDark
- @Strings.ThemeGreenDark
+ @Strings.ThemeBlueDark
+ @Strings.ThemePinkDark
+ @Strings.ThemeRedDark
+ @Strings.ThemeGreenDark
@Strings.ThemeCornYellowDark
- @Strings.ThemeDaygloOrangeDark
- @Strings.ThemeMonoDark
- @Strings.ThemeMonoLight
+
+
+
@Strings.ThemeBlueLight
@Strings.ThemeGreenLight
@Strings.ThemeRedLight
- @Strings.ThemeDaygloOrangeLight
+
+
@Strings.Steps
- @Strings.ActiveMinutes
+
@Strings.Battery
@Strings.CaloriesManualGoal
- @Strings.Off
+ @Strings.ActiveCaloriesManualGoal
+ @Strings.BodyBattery
+ @Strings.StressLevel
+ @Strings.Off
+
@Strings.Steps
- @Strings.ActiveMinutes
+
@Strings.Battery
@Strings.CaloriesManualGoal
- @Strings.Off
+ @Strings.ActiveCaloriesManualGoal
+ @Strings.BodyBattery
+ @Strings.StressLevel
+ @Strings.Off
+
@Strings.HeartRate
@@ -49,6 +61,7 @@
@Strings.BatteryHidePercentage
@Strings.Notifications
@Strings.Calories
+ @Strings.ActiveCalories
@Strings.Distance
@Strings.Alarms
@Strings.Altitude
@@ -57,9 +70,13 @@
@Strings.SunriseSunset
@Strings.Weather
@Strings.Humidity
+ @Strings.BodyBattery
+ @Strings.RecoveryTime
+ @Strings.StressLevel
+
@Strings.HeartRate
@@ -68,6 +85,7 @@
@Strings.BatteryHidePercentage
@Strings.Notifications
@Strings.Calories
+ @Strings.ActiveCalories
@Strings.Distance
@Strings.Alarms
@Strings.Altitude
@@ -76,9 +94,13 @@
@Strings.SunriseSunset
@Strings.Weather
@Strings.Humidity
+ @Strings.BodyBattery
+ @Strings.RecoveryTime
+ @Strings.StressLevel
+
@Strings.HeartRate
@@ -87,6 +109,7 @@
@Strings.BatteryHidePercentage
@Strings.Notifications
@Strings.Calories
+ @Strings.ActiveCalories
@Strings.Distance
@Strings.Alarms
@Strings.Altitude
@@ -95,7 +118,32 @@
@Strings.SunriseSunset
@Strings.Weather
@Strings.Humidity
+ @Strings.BodyBattery
+ @Strings.RecoveryTime
+ @Strings.StressLevel
+
+
+
+
+
+
+
+
+
+
+
+ @Strings.FromTheme
+
+ @Strings.Mono
+
+
+
+ @Strings.FromTheme
+
+ @Strings.Mono
+
+
diff --git a/resources-fr735xt/settings/properties.xml b/resources-fr735xt/settings/properties.xml
deleted file mode 100644
index 2782de9e..00000000
--- a/resources-fr735xt/settings/properties.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
- 2
-
-
\ No newline at end of file
diff --git a/resources-fr920xt/fonts/fonts.xml b/resources-fr920xt/fonts/fonts.xml
deleted file mode 100644
index 75736182..00000000
--- a/resources-fr920xt/fonts/fonts.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/resources-fre/strings/strings.fre b/resources-fre/strings/strings.fre
new file mode 100644
index 00000000..e8dc9c5a
--- /dev/null
+++ b/resources-fre/strings/strings.fre
@@ -0,0 +1,106 @@
+
+
+
+ Crystal
+ Version de l'appli
+
+ Thme
+ Couleur des heures
+ Couleur des minutes
+ Compteur de gauche
+ Compteur de droite
+ Objectif de calories (1-10,000kCal)
+ Apparence des compteurs
+ Apparence des champs numriques
+ Ajout de l'heure d'une ville (Beta)
+ Apparence de la barre d'activit
+ Masquer les secondes
+ Masquer le zro avant l'heure
+ OpenWeatherMap API Key Override
+
+ Nombre de champs de donnes
+ Champs de donnes 1
+ Champs de donnes 2
+ Champs de donnes 3
+
+ Nombre d'indicateurs
+ Indicateur 1
+ Indicateur 2
+ Indicateur 3
+
+ ( partir du thme)
+ Monochrome brillant
+ Monochrome
+
+ Tous les segments (fusionns)
+ Segments remplis seulement (fusionns)
+ Tous les segments
+ Segments remplis seulement
+ Masqu
+ Actuel/Objectif
+ Actuel
+
+ Bleu (sur fond noir)
+ Rose (sur fond noir)
+ Rouge (sur fond noir)
+ Vert(sur fond noir)
+ Bleu pale (sur fond noir)
+ Crme (sur fond noir)
+ Jaune vif (sur fond noir)
+ Orange (sur fond noir)
+ Monochrome (sur fond noir)
+ Monochrome (sur fond blanc)
+ Bleu (sur fond blanc)
+ Rouge (sur fond blanc)
+ Vert (sur fond blanc)
+ Orange (sur fond blanc)
+ Jaune fonc (sur fond noir)
+
+ Pas
+ tages montes
+ Minutes actives (hebdo)
+ Calories (objectif manuel)
+ Masqu
+
+ Rythme cardiaque
+ Rythme cardiaque (actif 5s)
+ Pile
+ Pile (Pourcentage masqu)
+ Notifications
+ Calories
+ Distance
+ Alarmes
+ Altitude
+ Thermomtre
+ Bluetooth
+ Bluetooth/Notifications
+ Lever/Coucher du soleil
+ Mto
+ Humidit
+ Pression
+
+
+
+
+ Dim
+ Lun
+ Mar
+ Mer
+ Jeu
+ Ven
+ Sam
+
+ Jan
+ Fv
+ Mar
+ Avr
+ Mai
+ Juin
+ Juil
+ Aot
+ Sep
+ Oct
+ Nov
+ Dc
+
+
diff --git a/resources-fre/strings/strings.org b/resources-fre/strings/strings.org
new file mode 100644
index 00000000..37d23e41
--- /dev/null
+++ b/resources-fre/strings/strings.org
@@ -0,0 +1,106 @@
+
+
+
+ Crystal
+ App Version
+
+ Thème
+ Hours Colour
+ Minutes Colour
+ Left Meter
+ Right Meter
+ Calories Goal (1-10,000kCal)
+ Meter Style
+ Meter Digits Style
+ Add Local Time in City (Beta)
+ Move Bar Style
+ Hide Seconds
+ Hide Hours Leading Zero
+ OpenWeatherMap API Key Override
+
+ Number Of Data Fields
+ Data Field 1
+ Data Field 2
+ Data Field 3
+
+ Number Of Indicators
+ Indicator 1
+ Indicator 2
+ Indicator 3
+
+ (From Theme)
+ Mono Highlight
+ Mono
+
+ All Segments (Merged)
+ Filled Segments (Merged)
+ All Segments
+ Filled Segments
+ Hidden
+ Current/Target
+ Current
+
+ Blue (Dark)
+ Pink (Dark)
+ Red (Dark)
+ Green (Dark)
+ Cornflower Blue (Dark)
+ Lemon Cream (Dark)
+ Vivid Yellow (Dark)
+ Dayglo Orange (Dark)
+ Mono (Dark)
+ Mono (Light)
+ Blue (Light)
+ Red (Light)
+ Green (Light)
+ Dayglo Orange (Light)
+ Corn Yellow (Dark)
+
+ Steps
+ Floors Climbed
+ Active Minutes (Weekly)
+ Calories (Manual Goal)
+ Off
+
+ Heart Rate
+ Heart Rate (Live 5s)
+ Battery
+ Battery (Hide Percentage)
+ Notifications
+ Calories
+ Distance
+ Alarms
+ Altitude
+ Thermometer
+ Bluetooth
+ Bluetooth/Notifications
+ Sunrise/Sunset
+ Weather
+ Humidity
+ Pressure
+
+
+
+
+ Dim
+ Lun
+ Mar
+ Mer
+ Jeu
+ Ven
+ Sam
+
+ Jan
+ Fev
+ Mar
+ Avr
+ Mai
+ Juin
+ Juil
+ Aout
+ Sep
+ Oct
+ Nov
+ Dec
+
+
diff --git a/resources-fre/strings/strings.xml b/resources-fre/strings/strings.xml
index 86a4c4cb..75750ba2 100644
--- a/resources-fre/strings/strings.xml
+++ b/resources-fre/strings/strings.xml
@@ -1,83 +1,90 @@
-
Crystal
- App Version
- Theme
- Hours Colour
- Minutes Colour
- Left Meter
- Right Meter
- Calories Goal (1-10,000kCal)
- Meter Style
- Meter Digits Style
- Add Local Time in City (Beta)
- Move Bar Style
- Hide Seconds
- Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Thème
+ Couleur des heures
+ Couleur des minutes
+ Compteur de gauche
+ Compteur de droite
+ Objectif de calories (1-10,000kCal)
+ Apparence des compteurs
+ Apparence des champs numériques
+ Ajout de l'heure d'une ville (Beta)
+ Apparence de la barre d'activité
+ Masquer les secondes
+ Toujours afficher
+ Afficher sauf quand inactif
+ Toujours cacher
+ Masquer le zéro avant l'heure
+ Masquer le zéro avant la date
+ Ajouter un deux-points entre les heures et minutes
- Number Of Data Fields
- Data Field 1
- Data Field 2
- Data Field 3
+ Nombre de champs de données
+ Champs de données 1
+ Champs de données 2
+ Champs de données 3
- Number Of Indicators
- Indicator 1
- Indicator 2
- Indicator 3
+ Nombre d'indicateurs
+ Indicateur 1
+ Indicateur 2
+ Indicateur 3
- (From Theme)
- Mono Highlight
- Mono
+ (À partir du thème)
+ Monochrome brillant
+ Monochrome
- All Segments (Merged)
- Filled Segments (Merged)
- All Segments
- Filled Segments
- Hidden
- Current/Target
- Current
+ Tous les segments (fusionnés)
+ Segments remplis seulement (fusionnés)
+ Tous les segments
+ Segments remplis seulement
+ Masqué
+ Actuel/Objectif
+ Actuel
- Blue (Dark)
- Pink (Dark)
- Red (Dark)
- Green (Dark)
- Cornflower Blue (Dark)
- Lemon Cream (Dark)
- Vivid Yellow (Dark)
- Dayglo Orange (Dark)
- Mono (Dark)
- Mono (Light)
- Blue (Light)
- Red (Light)
- Green (Light)
- Dayglo Orange (Light)
- Corn Yellow (Dark)
+ Bleu (sur fond noir)
+ Rose (sur fond noir)
+ Rouge (sur fond noir)
+ Vert(sur fond noir)
+ Bleu pale (sur fond noir)
+ Crème (sur fond noir)
+ Jaune vif (sur fond noir)
+ Orange (sur fond noir)
+ Monochrome (sur fond noir)
+ Monochrome (sur fond blanc)
+ Bleu (sur fond blanc)
+ Rouge (sur fond blanc)
+ Vert (sur fond blanc)
+ Orange (sur fond blanc)
+ Jaune foncé (sur fond noir)
- Steps
- Floors Climbed
- Active Minutes (Weekly)
- Calories (Manual Goal)
- Off
+ Pas
+ Étages montées
+ Intensité solaire
+ Batterie corporelle
+ Temps de recouvrement
+ Minutes actives (hebdo)
+ Calories (objectif manuel)
+ Calories actives (objectif manuel)
+ Masqué
- Heart Rate
- Heart Rate (Live 5s)
- Battery
- Battery (Hide Percentage)
+ Rythme cardiaque
+ Rythme cardiaque (actif 5s)
+ Pile
+ Pile (Pourcentage masqué)
Notifications
Calories
+ Calories active
Distance
- Alarms
+ Alarmes
Altitude
- Thermometer
+ Thermomètre
Bluetooth
Bluetooth/Notifications
- Sunrise/Sunset
- Weather
- Humidity
- Pressure
+ Lever/Coucher du soleil
+ Météo
+ Humidité
+ Pression
@@ -91,16 +98,35 @@
Sam
Jan
- Fev
+ Fév
Mar
Avr
Mai
Juin
Juil
- Aout
+ Août
Sep
Oct
Nov
- Dec
+ Déc
+ Batterie Numérique
+ Pulse Ox
+ Information Tesla
+ Tesla Access Token
+ Tesla Refresh Token
+ Location du serveur API de Tesla
+ Location du serveur Auth de Tesla
+ Entrez le nom de domaine du serveur
+ Ne Pas Déranger
+ Remplacement du thème par RGB
+ En hexadécimal en utilisant ce format RRGGBB. Si celui-ci est différent de 0, c'est cette combinaison de couleurs qui sera utilisée à la place du thème
+ Remplacement du thème Clair
+ Niveau de stress
+ Utilisez les complications, si disponible
+ Utilisez les Complications de Tesla-Link pour l'info Tesla
+ Quel véhicle afficher?
+ Montrer le nom de la station météo?
+ Long nom de la complication par défaut
+ Long nom de la complication de la Battery
diff --git a/resources-hrv/strings/strings.xml b/resources-hrv/strings/strings.xml
index c276bbdd..00284274 100644
--- a/resources-hrv/strings/strings.xml
+++ b/resources-hrv/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Stu
Pro
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-hun/strings/strings.xml b/resources-hun/strings/strings.xml
index ea52a8c5..904a8083 100644
--- a/resources-hun/strings/strings.xml
+++ b/resources-hun/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
nov
dec
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-ita/strings/strings.xml b/resources-ita/strings/strings.xml
index fe6c592f..dc413616 100644
--- a/resources-ita/strings/strings.xml
+++ b/resources-ita/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Nov
Dic
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-kor/strings/strings.xml b/resources-kor/strings/strings.xml
index cc6715cf..f5db64eb 100644
--- a/resources-kor/strings/strings.xml
+++ b/resources-kor/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
11월
12월
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-no_floors/settings/settings.xml b/resources-no_floors/settings/settings.xml
index 88f9799d..34de3768 100644
--- a/resources-no_floors/settings/settings.xml
+++ b/resources-no_floors/settings/settings.xml
@@ -6,7 +6,10 @@
@Strings.ActiveMinutes
@Strings.Battery
@Strings.CaloriesManualGoal
- @Strings.Off
+ @Strings.ActiveCaloriesManualGoal
+ @Strings.BodyBattery
+ @Strings.StressLevel
+ @Strings.Off
@@ -17,7 +20,10 @@
@Strings.ActiveMinutes
@Strings.Battery
@Strings.CaloriesManualGoal
- @Strings.Off
+ @Strings.ActiveCaloriesManualGoal
+ @Strings.BodyBattery
+ @Strings.StressLevel
+ @Strings.Off
\ No newline at end of file
diff --git a/resources-nob/strings/strings.xml b/resources-nob/strings/strings.xml
index edb90006..e0acc9f0 100644
--- a/resources-nob/strings/strings.xml
+++ b/resources-nob/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Nov
Des
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-pol/strings/strings.xml b/resources-pol/strings/strings.xml
index ed28931d..6c0659ea 100644
--- a/resources-pol/strings/strings.xml
+++ b/resources-pol/strings/strings.xml
@@ -1,7 +1,6 @@
Crystal
- Wersja
Motyw
Kolor Godzin
@@ -14,8 +13,12 @@
Add Local Time in City (Beta)
Wygląd Move Bar'a
Ukryj Sekundy
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Ukryj Zero Poprzedzające Godzinę
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Liczba Pól z Danymi
Pole Danych 1
@@ -57,8 +60,12 @@
Kroki
Pokonane Piętra
+ Solar Intensity
+ Body Battery
+ Recovery Time
Aktywne Minuty (Tygodniowo)
Spalone Kalorie (Ręczny Cel)
+ Active Calories (Manual Goal)
Off
Tętno
@@ -67,6 +74,7 @@
Bateria (Sama Wartość)
Powiadomienia
Kalorie
+ Active Calories
Odległość
Budziki
Wysokość
@@ -102,4 +110,24 @@
Lis
Gru
+
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-por/strings/strings.xml b/resources-por/strings/strings.xml
index d0e1a467..58821cf4 100644
--- a/resources-por/strings/strings.xml
+++ b/resources-por/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Nov
Dez
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-rectangle-148x205/fonts/fonts.xml b/resources-rectangle-148x205/fonts/fonts.xml
deleted file mode 100644
index caea187e..00000000
--- a/resources-rectangle-148x205/fonts/fonts.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall.fnt b/resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall.fnt
deleted file mode 100644
index fb557496..00000000
--- a/resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall.fnt
+++ /dev/null
@@ -1,14 +0,0 @@
-info face="Titillium Web" size=-48 bold=1 italic=0 charset="" unicode=1 stretchH=110 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=37 base=37 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="titillium-web-bold-48-extra-tall_0.png"
-chars count=10
-char id=48 x=0 y=0 width=26 height=37 xoffset=0 yoffset=0 xadvance=27 page=0 chnl=15
-char id=49 x=228 y=0 width=19 height=35 xoffset=2 yoffset=1 xadvance=27 page=0 chnl=15
-char id=50 x=156 y=0 width=22 height=36 xoffset=2 yoffset=0 xadvance=27 page=0 chnl=15
-char id=51 x=107 y=0 width=23 height=37 xoffset=2 yoffset=0 xadvance=27 page=0 chnl=15
-char id=52 x=202 y=0 width=25 height=35 xoffset=1 yoffset=1 xadvance=27 page=0 chnl=15
-char id=53 x=131 y=0 width=24 height=36 xoffset=1 yoffset=1 xadvance=27 page=0 chnl=15
-char id=54 x=81 y=0 width=25 height=37 xoffset=1 yoffset=0 xadvance=27 page=0 chnl=15
-char id=55 x=179 y=0 width=22 height=36 xoffset=2 yoffset=1 xadvance=27 page=0 chnl=15
-char id=56 x=27 y=0 width=26 height=37 xoffset=0 yoffset=0 xadvance=27 page=0 chnl=15
-char id=57 x=54 y=0 width=26 height=37 xoffset=0 yoffset=0 xadvance=27 page=0 chnl=15
diff --git a/resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall_0.png b/resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall_0.png
deleted file mode 100644
index c2c6ab04..00000000
Binary files a/resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall_0.png and /dev/null differ
diff --git a/resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall.fnt b/resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall.fnt
deleted file mode 100644
index 4ecde7fb..00000000
--- a/resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall.fnt
+++ /dev/null
@@ -1,14 +0,0 @@
-info face="Titillium Web Light" size=-48 bold=0 italic=0 charset="" unicode=1 stretchH=110 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=37 base=37 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="titillium-web-light-48-extra-tall_0.png"
-chars count=10
-char id=48 x=28 y=0 width=26 height=37 xoffset=1 yoffset=0 xadvance=27 page=0 chnl=15
-char id=49 x=231 y=0 width=15 height=35 xoffset=5 yoffset=1 xadvance=27 page=0 chnl=15
-char id=50 x=157 y=0 width=23 height=36 xoffset=2 yoffset=0 xadvance=27 page=0 chnl=15
-char id=51 x=108 y=0 width=23 height=37 xoffset=2 yoffset=0 xadvance=27 page=0 chnl=15
-char id=52 x=204 y=0 width=26 height=35 xoffset=1 yoffset=1 xadvance=27 page=0 chnl=15
-char id=53 x=132 y=0 width=24 height=36 xoffset=2 yoffset=1 xadvance=27 page=0 chnl=15
-char id=54 x=55 y=0 width=26 height=37 xoffset=1 yoffset=0 xadvance=27 page=0 chnl=15
-char id=55 x=181 y=0 width=22 height=36 xoffset=3 yoffset=1 xadvance=27 page=0 chnl=15
-char id=56 x=0 y=0 width=27 height=37 xoffset=0 yoffset=0 xadvance=27 page=0 chnl=15
-char id=57 x=82 y=0 width=25 height=37 xoffset=1 yoffset=0 xadvance=27 page=0 chnl=15
diff --git a/resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall_0.png b/resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall_0.png
deleted file mode 100644
index ccebab55..00000000
Binary files a/resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall_0.png and /dev/null differ
diff --git a/resources-rectangle-148x205/layouts/layout.xml b/resources-rectangle-148x205/layouts/layout.xml
deleted file mode 100644
index ca94f62e..00000000
--- a/resources-rectangle-148x205/layouts/layout.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
- :left
- 6
- 205
- 2
-
-
-
- :right
- 6
- 205
- 2
-
-
-
- 34
- 80
- 180
- 196
- 178
- 11
- 137
-
-
-
- 33
- 115
- 11
- 30
- 24
-
-
-
- 57
-
-
-
- 74
- 154
- 32
- 22
-
-
-
- 105
- 113
-
-
-
-
-
-
-
- -6
-
-
- 0
-
-
-
- 23
- 130
- 75
- 7
- 3
-
-
-
\ No newline at end of file
diff --git a/resources-rectangle-205x148/fonts/fonts.xml b/resources-rectangle-205x148/fonts/fonts.xml
index dec28d6e..80b93802 100644
--- a/resources-rectangle-205x148/fonts/fonts.xml
+++ b/resources-rectangle-205x148/fonts/fonts.xml
@@ -7,7 +7,7 @@
-
+
diff --git a/resources-rectangle-205x148/fonts/namum-gothic-kor-16.fnt b/resources-rectangle-205x148/fonts/namum-gothic-kor-16.fnt
index 61fc88fb..b3fa1733 100644
--- a/resources-rectangle-205x148/fonts/namum-gothic-kor-16.fnt
+++ b/resources-rectangle-205x148/fonts/namum-gothic-kor-16.fnt
@@ -1,24 +1,24 @@
-info face="NanumGothicExtraBold" size=16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=16 base=13 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="namum-gothic-kor-16_0.png"
-chars count=20
-char id=32 x=191 y=0 width=2 height=1 xoffset=0 yoffset=15 xadvance=4 page=0 chnl=15
-char id=40 x=0 y=0 width=5 height=14 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=15
-char id=41 x=6 y=0 width=5 height=14 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=15
-char id=48 x=104 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
-char id=49 x=172 y=0 width=4 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
-char id=50 x=140 y=0 width=7 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
-char id=51 x=148 y=0 width=7 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
-char id=52 x=94 y=0 width=9 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
-char id=53 x=156 y=0 width=7 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
-char id=54 x=113 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
-char id=55 x=164 y=0 width=7 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
-char id=56 x=122 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
-char id=57 x=131 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
-char id=44552 x=27 y=0 width=13 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
-char id=47785 x=41 y=0 width=13 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
-char id=49688 x=55 y=0 width=13 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
-char id=50900 x=69 y=0 width=12 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
-char id=51068 x=82 y=0 width=11 height=13 xoffset=1 yoffset=2 xadvance=13 page=0 chnl=15
-char id=53664 x=177 y=0 width=13 height=10 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=15
-char id=54868 x=12 y=0 width=14 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
+info face="NanumGothicExtraBold" size=16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=16 base=13 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="namum-gothic-kor-16_0.png"
+chars count=20
+char id=32 x=191 y=0 width=2 height=1 xoffset=0 yoffset=15 xadvance=4 page=0 chnl=15
+char id=40 x=0 y=0 width=5 height=14 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=15
+char id=41 x=6 y=0 width=5 height=14 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=15
+char id=48 x=104 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
+char id=49 x=172 y=0 width=4 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=50 x=140 y=0 width=7 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
+char id=51 x=148 y=0 width=7 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
+char id=52 x=94 y=0 width=9 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
+char id=53 x=156 y=0 width=7 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=54 x=113 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
+char id=55 x=164 y=0 width=7 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
+char id=56 x=122 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
+char id=57 x=131 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15
+char id=44552 x=27 y=0 width=13 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
+char id=47785 x=41 y=0 width=13 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
+char id=49688 x=55 y=0 width=13 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
+char id=50900 x=69 y=0 width=12 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
+char id=51068 x=82 y=0 width=11 height=13 xoffset=1 yoffset=2 xadvance=13 page=0 chnl=15
+char id=53664 x=177 y=0 width=13 height=10 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=15
+char id=54868 x=12 y=0 width=14 height=13 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15
diff --git a/resources-rectangle-205x148/fonts/noto-sans-cjk-sc-medium-16.fnt b/resources-rectangle-205x148/fonts/noto-sans-cjk-sc-medium-16.fnt
index 6b3d7750..f3d4a86a 100644
--- a/resources-rectangle-205x148/fonts/noto-sans-cjk-sc-medium-16.fnt
+++ b/resources-rectangle-205x148/fonts/noto-sans-cjk-sc-medium-16.fnt
@@ -1,30 +1,30 @@
-info face="Noto Sans CJK SC Medium" size=-16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=24 base=19 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="noto-sans-cjk-sc-medium-16_0.png"
-chars count=26
-char id=10 x=50 y=16 width=3 height=1 xoffset=-1 yoffset=23 xadvance=4 page=0 chnl=15
-char id=32 x=54 y=16 width=3 height=1 xoffset=-1 yoffset=23 xadvance=4 page=0 chnl=15
-char id=48 x=18 y=16 width=7 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=49 x=219 y=0 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=50 x=228 y=0 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=51 x=237 y=0 width=8 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
-char id=52 x=199 y=0 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
-char id=53 x=246 y=0 width=8 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
-char id=54 x=0 y=17 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=55 x=209 y=0 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
-char id=56 x=9 y=17 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=57 x=26 y=16 width=7 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=19968 x=34 y=16 width=15 height=2 xoffset=1 yoffset=12 xadvance=16 page=0 chnl=15
-char id=19971 x=110 y=0 width=15 height=14 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
-char id=19977 x=169 y=0 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
-char id=20061 x=0 y=0 width=14 height=16 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=20108 x=184 y=0 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
-char id=20116 x=153 y=0 width=15 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
-char id=20843 x=93 y=0 width=16 height=14 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
-char id=20845 x=15 y=0 width=15 height=15 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=21313 x=31 y=0 width=15 height=15 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=22235 x=63 y=0 width=14 height=15 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
-char id=26085 x=141 y=0 width=11 height=14 xoffset=3 yoffset=6 xadvance=16 page=0 chnl=15
-char id=26143 x=126 y=0 width=14 height=14 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
-char id=26376 x=78 y=0 width=14 height=15 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
-char id=26399 x=47 y=0 width=15 height=15 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+info face="Noto Sans CJK SC Medium" size=-16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=24 base=19 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-cjk-sc-medium-16_0.png"
+chars count=26
+char id=10 x=50 y=16 width=3 height=1 xoffset=-1 yoffset=23 xadvance=4 page=0 chnl=15
+char id=32 x=54 y=16 width=3 height=1 xoffset=-1 yoffset=23 xadvance=4 page=0 chnl=15
+char id=48 x=18 y=16 width=7 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=49 x=219 y=0 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=50 x=228 y=0 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=51 x=237 y=0 width=8 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
+char id=52 x=199 y=0 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
+char id=53 x=246 y=0 width=8 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
+char id=54 x=0 y=17 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=55 x=209 y=0 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
+char id=56 x=9 y=17 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=57 x=26 y=16 width=7 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=19968 x=34 y=16 width=15 height=2 xoffset=1 yoffset=12 xadvance=16 page=0 chnl=15
+char id=19971 x=110 y=0 width=15 height=14 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=19977 x=169 y=0 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=20061 x=0 y=0 width=14 height=16 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=20108 x=184 y=0 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=20116 x=153 y=0 width=15 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=20843 x=93 y=0 width=16 height=14 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=20845 x=15 y=0 width=15 height=15 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=21313 x=31 y=0 width=15 height=15 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=22235 x=63 y=0 width=14 height=15 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=26085 x=141 y=0 width=11 height=14 xoffset=3 yoffset=6 xadvance=16 page=0 chnl=15
+char id=26143 x=126 y=0 width=14 height=14 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=26376 x=78 y=0 width=14 height=15 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=26399 x=47 y=0 width=15 height=15 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
diff --git a/resources-rectangle-205x148/fonts/noto-sans-cjk-tc-medium-16.fnt b/resources-rectangle-205x148/fonts/noto-sans-cjk-tc-medium-16.fnt
index 6552f496..63073c2f 100644
--- a/resources-rectangle-205x148/fonts/noto-sans-cjk-tc-medium-16.fnt
+++ b/resources-rectangle-205x148/fonts/noto-sans-cjk-tc-medium-16.fnt
@@ -1,30 +1,30 @@
-info face="Noto Sans CJK TC Medium" size=-16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=24 base=19 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="noto-sans-cjk-tc-medium-16_0.png"
-chars count=26
-char id=10 x=50 y=16 width=3 height=1 xoffset=-1 yoffset=23 xadvance=4 page=0 chnl=15
-char id=32 x=54 y=16 width=3 height=1 xoffset=-1 yoffset=23 xadvance=4 page=0 chnl=15
-char id=48 x=18 y=16 width=7 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=49 x=217 y=0 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=50 x=226 y=0 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=51 x=235 y=0 width=8 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
-char id=52 x=197 y=0 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
-char id=53 x=244 y=0 width=8 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
-char id=54 x=0 y=17 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=55 x=207 y=0 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
-char id=56 x=9 y=17 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=57 x=26 y=16 width=7 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
-char id=19968 x=34 y=16 width=15 height=2 xoffset=1 yoffset=12 xadvance=16 page=0 chnl=15
-char id=19971 x=109 y=0 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=19977 x=167 y=0 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
-char id=20061 x=0 y=0 width=14 height=16 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=20108 x=182 y=0 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
-char id=20116 x=151 y=0 width=15 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
-char id=20843 x=93 y=0 width=15 height=14 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
-char id=20845 x=15 y=0 width=15 height=15 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=21313 x=31 y=0 width=15 height=15 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=22235 x=63 y=0 width=14 height=15 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
-char id=26085 x=139 y=0 width=11 height=14 xoffset=3 yoffset=6 xadvance=16 page=0 chnl=15
-char id=26143 x=124 y=0 width=14 height=14 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
-char id=26376 x=78 y=0 width=14 height=15 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
-char id=26399 x=47 y=0 width=15 height=15 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+info face="Noto Sans CJK TC Medium" size=-16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=24 base=19 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-cjk-tc-medium-16_0.png"
+chars count=26
+char id=10 x=50 y=16 width=3 height=1 xoffset=-1 yoffset=23 xadvance=4 page=0 chnl=15
+char id=32 x=54 y=16 width=3 height=1 xoffset=-1 yoffset=23 xadvance=4 page=0 chnl=15
+char id=48 x=18 y=16 width=7 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=49 x=217 y=0 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=50 x=226 y=0 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=51 x=235 y=0 width=8 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
+char id=52 x=197 y=0 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
+char id=53 x=244 y=0 width=8 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
+char id=54 x=0 y=17 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=55 x=207 y=0 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15
+char id=56 x=9 y=17 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=57 x=26 y=16 width=7 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15
+char id=19968 x=34 y=16 width=15 height=2 xoffset=1 yoffset=12 xadvance=16 page=0 chnl=15
+char id=19971 x=109 y=0 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=19977 x=167 y=0 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=20061 x=0 y=0 width=14 height=16 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=20108 x=182 y=0 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=20116 x=151 y=0 width=15 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=20843 x=93 y=0 width=15 height=14 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=20845 x=15 y=0 width=15 height=15 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=21313 x=31 y=0 width=15 height=15 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=22235 x=63 y=0 width=14 height=15 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=26085 x=139 y=0 width=11 height=14 xoffset=3 yoffset=6 xadvance=16 page=0 chnl=15
+char id=26143 x=124 y=0 width=14 height=14 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=26376 x=78 y=0 width=14 height=15 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=26399 x=47 y=0 width=15 height=15 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
diff --git a/resources-rectangle-205x148/fonts/noto-sans-rus-bold-16.fnt b/resources-rectangle-205x148/fonts/noto-sans-rus-bold-16.fnt
index c4e15ff6..cb192fd2 100644
--- a/resources-rectangle-205x148/fonts/noto-sans-rus-bold-16.fnt
+++ b/resources-rectangle-205x148/fonts/noto-sans-rus-bold-16.fnt
@@ -1,47 +1,47 @@
-info face="Noto Sans" size=-16 bold=1 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=22 base=17 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="noto-sans-rus-bold-16_0.png"
-chars count=43
-char id=32 x=250 y=13 width=3 height=1 xoffset=-1 yoffset=21 xadvance=4 page=0 chnl=15
-char id=48 x=163 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
-char id=49 x=242 y=13 width=7 height=11 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
-char id=50 x=153 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
-char id=51 x=143 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
-char id=52 x=211 y=13 width=10 height=11 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=15
-char id=53 x=232 y=13 width=9 height=11 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
-char id=54 x=133 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
-char id=55 x=222 y=13 width=9 height=11 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
-char id=56 x=123 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
-char id=57 x=183 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
-char id=1040 x=180 y=0 width=13 height=12 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=15
-char id=1041 x=103 y=13 width=9 height=12 xoffset=1 yoffset=5 xadvance=10 page=0 chnl=15
-char id=1042 x=81 y=13 width=10 height=12 xoffset=1 yoffset=5 xadvance=11 page=0 chnl=15
-char id=1043 x=202 y=13 width=8 height=12 xoffset=1 yoffset=5 xadvance=9 page=0 chnl=15
-char id=1044 x=30 y=0 width=14 height=15 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=15
-char id=1045 x=193 y=13 width=8 height=12 xoffset=1 yoffset=5 xadvance=9 page=0 chnl=15
-char id=1046 x=58 y=0 width=17 height=12 xoffset=-1 yoffset=5 xadvance=15 page=0 chnl=15
-char id=1047 x=92 y=13 width=10 height=12 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=15
-char id=1048 x=12 y=16 width=11 height=12 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
-char id=1049 x=0 y=0 width=11 height=16 xoffset=1 yoffset=1 xadvance=13 page=0 chnl=15
-char id=1050 x=24 y=16 width=11 height=12 xoffset=1 yoffset=5 xadvance=11 page=0 chnl=15
-char id=1051 x=221 y=0 width=12 height=12 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=15
-char id=1052 x=194 y=0 width=13 height=12 xoffset=1 yoffset=5 xadvance=15 page=0 chnl=15
-char id=1053 x=59 y=13 width=10 height=12 xoffset=1 yoffset=5 xadvance=12 page=0 chnl=15
-char id=1054 x=166 y=0 width=13 height=12 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
-char id=1055 x=48 y=16 width=10 height=12 xoffset=1 yoffset=5 xadvance=12 page=0 chnl=15
-char id=1056 x=246 y=0 width=9 height=12 xoffset=1 yoffset=5 xadvance=10 page=0 chnl=15
-char id=1057 x=70 y=13 width=10 height=12 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=15
-char id=1058 x=113 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
-char id=1059 x=208 y=0 width=12 height=12 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=15
-char id=1060 x=109 y=0 width=14 height=12 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=15
-char id=1061 x=152 y=0 width=13 height=12 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=15
-char id=1062 x=45 y=0 width=12 height=15 xoffset=1 yoffset=5 xadvance=12 page=0 chnl=15
-char id=1063 x=0 y=17 width=11 height=12 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15
-char id=1064 x=93 y=0 width=15 height=12 xoffset=1 yoffset=5 xadvance=17 page=0 chnl=15
-char id=1065 x=12 y=0 width=17 height=15 xoffset=1 yoffset=5 xadvance=18 page=0 chnl=15
-char id=1066 x=138 y=0 width=13 height=12 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=15
-char id=1067 x=124 y=0 width=13 height=12 xoffset=1 yoffset=5 xadvance=14 page=0 chnl=15
-char id=1068 x=173 y=13 width=9 height=12 xoffset=1 yoffset=5 xadvance=10 page=0 chnl=15
-char id=1069 x=234 y=0 width=11 height=12 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=15
-char id=1070 x=76 y=0 width=16 height=12 xoffset=1 yoffset=5 xadvance=17 page=0 chnl=15
-char id=1071 x=36 y=16 width=11 height=12 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=15
+info face="Noto Sans" size=-16 bold=1 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=22 base=17 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-rus-bold-16_0.png"
+chars count=43
+char id=32 x=250 y=13 width=3 height=1 xoffset=-1 yoffset=21 xadvance=4 page=0 chnl=15
+char id=48 x=163 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
+char id=49 x=242 y=13 width=7 height=11 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
+char id=50 x=153 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
+char id=51 x=143 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
+char id=52 x=211 y=13 width=10 height=11 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=15
+char id=53 x=232 y=13 width=9 height=11 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
+char id=54 x=133 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
+char id=55 x=222 y=13 width=9 height=11 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
+char id=56 x=123 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
+char id=57 x=183 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
+char id=1040 x=180 y=0 width=13 height=12 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=15
+char id=1041 x=103 y=13 width=9 height=12 xoffset=1 yoffset=5 xadvance=10 page=0 chnl=15
+char id=1042 x=81 y=13 width=10 height=12 xoffset=1 yoffset=5 xadvance=11 page=0 chnl=15
+char id=1043 x=202 y=13 width=8 height=12 xoffset=1 yoffset=5 xadvance=9 page=0 chnl=15
+char id=1044 x=30 y=0 width=14 height=15 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=15
+char id=1045 x=193 y=13 width=8 height=12 xoffset=1 yoffset=5 xadvance=9 page=0 chnl=15
+char id=1046 x=58 y=0 width=17 height=12 xoffset=-1 yoffset=5 xadvance=15 page=0 chnl=15
+char id=1047 x=92 y=13 width=10 height=12 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=15
+char id=1048 x=12 y=16 width=11 height=12 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
+char id=1049 x=0 y=0 width=11 height=16 xoffset=1 yoffset=1 xadvance=13 page=0 chnl=15
+char id=1050 x=24 y=16 width=11 height=12 xoffset=1 yoffset=5 xadvance=11 page=0 chnl=15
+char id=1051 x=221 y=0 width=12 height=12 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=15
+char id=1052 x=194 y=0 width=13 height=12 xoffset=1 yoffset=5 xadvance=15 page=0 chnl=15
+char id=1053 x=59 y=13 width=10 height=12 xoffset=1 yoffset=5 xadvance=12 page=0 chnl=15
+char id=1054 x=166 y=0 width=13 height=12 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
+char id=1055 x=48 y=16 width=10 height=12 xoffset=1 yoffset=5 xadvance=12 page=0 chnl=15
+char id=1056 x=246 y=0 width=9 height=12 xoffset=1 yoffset=5 xadvance=10 page=0 chnl=15
+char id=1057 x=70 y=13 width=10 height=12 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=15
+char id=1058 x=113 y=13 width=9 height=12 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15
+char id=1059 x=208 y=0 width=12 height=12 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=15
+char id=1060 x=109 y=0 width=14 height=12 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=15
+char id=1061 x=152 y=0 width=13 height=12 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=15
+char id=1062 x=45 y=0 width=12 height=15 xoffset=1 yoffset=5 xadvance=12 page=0 chnl=15
+char id=1063 x=0 y=17 width=11 height=12 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15
+char id=1064 x=93 y=0 width=15 height=12 xoffset=1 yoffset=5 xadvance=17 page=0 chnl=15
+char id=1065 x=12 y=0 width=17 height=15 xoffset=1 yoffset=5 xadvance=18 page=0 chnl=15
+char id=1066 x=138 y=0 width=13 height=12 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=15
+char id=1067 x=124 y=0 width=13 height=12 xoffset=1 yoffset=5 xadvance=14 page=0 chnl=15
+char id=1068 x=173 y=13 width=9 height=12 xoffset=1 yoffset=5 xadvance=10 page=0 chnl=15
+char id=1069 x=234 y=0 width=11 height=12 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=15
+char id=1070 x=76 y=0 width=16 height=12 xoffset=1 yoffset=5 xadvance=17 page=0 chnl=15
+char id=1071 x=36 y=16 width=11 height=12 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=15
diff --git a/resources-rectangle-205x148/fonts/titillium-web-bold-54.fnt b/resources-rectangle-205x148/fonts/titillium-web-bold-54.fnt
index bc476b44..ee9fe3bb 100644
--- a/resources-rectangle-205x148/fonts/titillium-web-bold-54.fnt
+++ b/resources-rectangle-205x148/fonts/titillium-web-bold-54.fnt
@@ -1,14 +1,14 @@
-info face="Titillium Web" size=-54 bold=1 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=38 base=38 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="titillium-web-bold-54_0.png"
-chars count=10
-char id=48 x=0 y=0 width=30 height=38 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=15
-char id=49 x=230 y=0 width=21 height=36 xoffset=3 yoffset=1 xadvance=30 page=0 chnl=15
-char id=50 x=177 y=0 width=26 height=37 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=15
-char id=51 x=122 y=0 width=26 height=38 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=15
-char id=52 x=0 y=39 width=28 height=36 xoffset=1 yoffset=1 xadvance=30 page=0 chnl=15
-char id=53 x=149 y=0 width=27 height=37 xoffset=2 yoffset=1 xadvance=30 page=0 chnl=15
-char id=54 x=62 y=0 width=29 height=38 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=15
-char id=55 x=204 y=0 width=25 height=37 xoffset=3 yoffset=1 xadvance=30 page=0 chnl=15
-char id=56 x=31 y=0 width=30 height=38 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=15
-char id=57 x=92 y=0 width=29 height=38 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=15
+info face="Titillium Web" size=-54 bold=1 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=38 base=38 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-bold-54_0.png"
+chars count=10
+char id=48 x=0 y=0 width=30 height=38 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=15
+char id=49 x=230 y=0 width=21 height=36 xoffset=3 yoffset=1 xadvance=30 page=0 chnl=15
+char id=50 x=177 y=0 width=26 height=37 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=15
+char id=51 x=122 y=0 width=26 height=38 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=15
+char id=52 x=0 y=39 width=28 height=36 xoffset=1 yoffset=1 xadvance=30 page=0 chnl=15
+char id=53 x=149 y=0 width=27 height=37 xoffset=2 yoffset=1 xadvance=30 page=0 chnl=15
+char id=54 x=62 y=0 width=29 height=38 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=15
+char id=55 x=204 y=0 width=25 height=37 xoffset=3 yoffset=1 xadvance=30 page=0 chnl=15
+char id=56 x=31 y=0 width=30 height=38 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=15
+char id=57 x=92 y=0 width=29 height=38 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=15
diff --git a/resources-rectangle-205x148/fonts/titillium-web-light-54.fnt b/resources-rectangle-205x148/fonts/titillium-web-light-54.fnt
index 929f1269..e0dfd7b6 100644
--- a/resources-rectangle-205x148/fonts/titillium-web-light-54.fnt
+++ b/resources-rectangle-205x148/fonts/titillium-web-light-54.fnt
@@ -1,14 +1,15 @@
-info face="Titillium Web Light" size=-54 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=38 base=38 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="titillium-web-light-54_0.png"
-chars count=10
-char id=48 x=30 y=0 width=28 height=38 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=15
-char id=49 x=0 y=39 width=17 height=36 xoffset=5 yoffset=1 xadvance=30 page=0 chnl=15
-char id=50 x=170 y=0 width=25 height=37 xoffset=3 yoffset=0 xadvance=30 page=0 chnl=15
-char id=51 x=116 y=0 width=26 height=38 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=15
-char id=52 x=222 y=0 width=29 height=36 xoffset=1 yoffset=1 xadvance=30 page=0 chnl=15
-char id=53 x=143 y=0 width=26 height=37 xoffset=2 yoffset=1 xadvance=30 page=0 chnl=15
-char id=54 x=88 y=0 width=27 height=38 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=15
-char id=55 x=196 y=0 width=25 height=37 xoffset=3 yoffset=1 xadvance=30 page=0 chnl=15
-char id=56 x=0 y=0 width=29 height=38 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=15
-char id=57 x=59 y=0 width=28 height=38 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=15
+info face="Titillium Web Light" size=-54 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=38 base=38 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-light-54_0.png"
+chars count=10
+char id=48 x=30 y=0 width=28 height=38 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=15
+char id=49 x=0 y=39 width=17 height=36 xoffset=5 yoffset=1 xadvance=30 page=0 chnl=15
+char id=50 x=170 y=0 width=25 height=37 xoffset=3 yoffset=0 xadvance=30 page=0 chnl=15
+char id=51 x=116 y=0 width=26 height=38 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=15
+char id=52 x=222 y=0 width=29 height=36 xoffset=1 yoffset=1 xadvance=30 page=0 chnl=15
+char id=53 x=143 y=0 width=26 height=37 xoffset=2 yoffset=1 xadvance=30 page=0 chnl=15
+char id=54 x=88 y=0 width=27 height=38 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=15
+char id=55 x=196 y=0 width=25 height=37 xoffset=3 yoffset=1 xadvance=30 page=0 chnl=15
+char id=56 x=0 y=0 width=29 height=38 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=15
+char id=57 x=59 y=0 width=28 height=38 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=15
+char id=58 x=20 y=39 width=10 height=38 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15
diff --git a/resources-rectangle-205x148/fonts/titillium-web-light-54_0.png b/resources-rectangle-205x148/fonts/titillium-web-light-54_0.png
index b5b01ed0..143345f3 100644
Binary files a/resources-rectangle-205x148/fonts/titillium-web-light-54_0.png and b/resources-rectangle-205x148/fonts/titillium-web-light-54_0.png differ
diff --git a/resources-rectangle-205x148/layouts/layout.xml b/resources-rectangle-205x148/layouts/layout.xml
deleted file mode 100644
index 1c8140d2..00000000
--- a/resources-rectangle-205x148/layouts/layout.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
- :left
- 6
- 148
- 2
-
-
-
- :right
- 6
- 148
- 2
-
-
-
- 42
- 121
- 122
- 138
- 120
- 14
- 191
-
-
-
- 92
- 174
- 14
- 33
- 24
-
-
-
- 15
- 14
- 33
-
-
-
- 23
- 80
- 26
- 20
-
-
-
- 137
- 85
-
-
-
-
-
-
-
- -5
-
-
- 4
-
-
-
- 45
- 102
- 87
- 7
- 3
-
-
-
\ No newline at end of file
diff --git a/resources-rectangle-205x148/settings/settings.xml b/resources-rectangle-205x148/settings/settings.xml
deleted file mode 100644
index 67715ed0..00000000
--- a/resources-rectangle-205x148/settings/settings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/resources-rectangle-240x240/fonts/fonts.xml b/resources-rectangle-240x240/fonts/fonts.xml
index 0e2c8c73..14f817ec 100644
--- a/resources-rectangle-240x240/fonts/fonts.xml
+++ b/resources-rectangle-240x240/fonts/fonts.xml
@@ -3,7 +3,7 @@
-
+
@@ -12,13 +12,13 @@
-
+
-
+
-
+
diff --git a/resources-rectangle-240x240/layouts/layout.xml b/resources-rectangle-240x240/layouts/layout.xml
index b04c3918..87543f9e 100644
--- a/resources-rectangle-240x240/layouts/layout.xml
+++ b/resources-rectangle-240x240/layouts/layout.xml
@@ -19,6 +19,8 @@
49
142
+ 174
+ 190
206
222
202
diff --git a/resources-rectangle-240x240/settings/properties.xml b/resources-rectangle-240x240/settings/properties.xml
deleted file mode 100644
index 2782de9e..00000000
--- a/resources-rectangle-240x240/settings/properties.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
- 2
-
-
\ No newline at end of file
diff --git a/resources-rectangle-240x240/settings/settings.xml b/resources-rectangle-240x240/settings/settings.xml
deleted file mode 100644
index f74f5684..00000000
--- a/resources-rectangle-240x240/settings/settings.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
- @Strings.Steps
-
- @Strings.ActiveMinutes
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.Steps
-
- @Strings.ActiveMinutes
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.HeartRate
- @Strings.HeartRateLive5s
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
-
- @Strings.HeartRate
- @Strings.HeartRateLive5s
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
-
- @Strings.HeartRate
- @Strings.HeartRateLive5s
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
- @Strings.Weather
- @Strings.Humidity
-
-
-
-
diff --git a/resources-rectangle-320x360/fonts/fonts.xml b/resources-rectangle-320x360/fonts/fonts.xml
new file mode 100644
index 00000000..3e4aa06c
--- /dev/null
+++ b/resources-rectangle-320x360/fonts/fonts.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources-rectangle-320x360/layouts/layout.xml b/resources-rectangle-320x360/layouts/layout.xml
new file mode 100644
index 00000000..90d2e6c7
--- /dev/null
+++ b/resources-rectangle-320x360/layouts/layout.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+ :left
+ 12
+ 360
+ 3
+
+
+
+ :right
+ 12
+ 360
+ 3
+
+
+
+ 65
+ 189
+ 261
+ 285
+ 309
+ 333
+ 303
+ 29
+ 291
+
+
+
+ 87
+ 234
+ 30
+ 53
+ 37
+
+
+
+ 104
+
+
+
+ 32
+ 189
+ 48
+ 27
+
+
+
+ 3
+ 229
+ 233
+ 8
+
+
+
+ 53
+ 264
+ 164
+ 17
+ 4
+
+
+
+
+
+
+ [-57, -29, 29, 57]
+ -2
+ 153
+ 200
+
+ 216
+
+ 225
+ 65
+
+
+
diff --git a/resources-rectangle-448x486/fonts/fonts.xml b/resources-rectangle-448x486/fonts/fonts.xml
new file mode 100644
index 00000000..d651fc57
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/fonts.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources-rectangle-448x486/fonts/namum-gothic-kor-42.bmfc b/resources-rectangle-448x486/fonts/namum-gothic-kor-42.bmfc
new file mode 100644
index 00000000..aca274c2
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/namum-gothic-kor-42.bmfc
@@ -0,0 +1,55 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=NanumGothicExtraBold
+fontFile=
+charSet=0
+fontSize=42
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=32,40-41,48-57,44552,47785,49688,50900,51068,53664,54868
+
+# imported icon images
diff --git a/resources-rectangle-448x486/fonts/namum-gothic-kor-42.fnt b/resources-rectangle-448x486/fonts/namum-gothic-kor-42.fnt
new file mode 100644
index 00000000..97fe239c
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/namum-gothic-kor-42.fnt
@@ -0,0 +1,24 @@
+info face="NanumGothicExtraBold" size=42 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=42 base=34 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="namum-gothic-kor-42_0.png"
+chars count=20
+char id=32 x=191 y=35 width=2 height=1 xoffset=0 yoffset=41 xadvance=10 page=0 chnl=15
+char id=40 x=31 y=0 width=11 height=35 xoffset=2 yoffset=5 xadvance=13 page=0 chnl=15
+char id=41 x=43 y=0 width=11 height=35 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
+char id=48 x=22 y=36 width=19 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=49 x=243 y=0 width=11 height=27 xoffset=3 yoffset=8 xadvance=22 page=0 chnl=15
+char id=50 x=82 y=35 width=18 height=27 xoffset=1 yoffset=8 xadvance=22 page=0 chnl=15
+char id=51 x=101 y=35 width=18 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=52 x=0 y=36 width=21 height=27 xoffset=0 yoffset=8 xadvance=22 page=0 chnl=15
+char id=53 x=139 y=35 width=17 height=27 xoffset=3 yoffset=8 xadvance=22 page=0 chnl=15
+char id=54 x=42 y=36 width=19 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=55 x=120 y=35 width=18 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=56 x=222 y=0 width=20 height=30 xoffset=1 yoffset=7 xadvance=22 page=0 chnl=15
+char id=57 x=62 y=35 width=19 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=44552 x=90 y=0 width=33 height=34 xoffset=0 yoffset=5 xadvance=34 page=0 chnl=15
+char id=47785 x=124 y=0 width=33 height=34 xoffset=0 yoffset=5 xadvance=34 page=0 chnl=15
+char id=49688 x=158 y=0 width=33 height=34 xoffset=0 yoffset=5 xadvance=34 page=0 chnl=15
+char id=50900 x=0 y=0 width=30 height=35 xoffset=1 yoffset=4 xadvance=34 page=0 chnl=15
+char id=51068 x=192 y=0 width=29 height=34 xoffset=2 yoffset=5 xadvance=34 page=0 chnl=15
+char id=53664 x=157 y=35 width=33 height=26 xoffset=0 yoffset=7 xadvance=34 page=0 chnl=15
+char id=54868 x=55 y=0 width=34 height=34 xoffset=0 yoffset=5 xadvance=34 page=0 chnl=15
diff --git a/resources-rectangle-448x486/fonts/namum-gothic-kor-42_0.png b/resources-rectangle-448x486/fonts/namum-gothic-kor-42_0.png
new file mode 100644
index 00000000..5f09960b
Binary files /dev/null and b/resources-rectangle-448x486/fonts/namum-gothic-kor-42_0.png differ
diff --git a/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42.bmfc b/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42.bmfc
new file mode 100644
index 00000000..9b85ec32
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42.bmfc
@@ -0,0 +1,56 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Noto Sans CJK SC Medium
+fontFile=
+charSet=0
+fontSize=-42
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=10,32,48-57,19968,19971,19977,20061,20108,20116,20843,20845,21313,22235,26085,26143,26376,26399
+
+
+# imported icon images
diff --git a/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42.fnt b/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42.fnt
new file mode 100644
index 00000000..ee5e7127
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42.fnt
@@ -0,0 +1,30 @@
+info face="Noto Sans CJK SC Medium" size=-42 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=62 base=49 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-cjk-sc-medium-42_0.png"
+chars count=26
+char id=10 x=242 y=33 width=2 height=1 xoffset=0 yoffset=61 xadvance=9 page=0 chnl=15
+char id=32 x=245 y=33 width=2 height=1 xoffset=0 yoffset=61 xadvance=9 page=0 chnl=15
+char id=48 x=66 y=77 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=49 x=236 y=0 width=18 height=32 xoffset=3 yoffset=17 xadvance=24 page=0 chnl=15
+char id=50 x=0 y=78 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=51 x=22 y=78 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=52 x=219 y=38 width=22 height=32 xoffset=0 yoffset=17 xadvance=24 page=0 chnl=15
+char id=53 x=44 y=77 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=54 x=87 y=77 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=55 x=108 y=76 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=56 x=129 y=76 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=57 x=150 y=74 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=19968 x=209 y=71 width=39 height=5 xoffset=2 yoffset=30 xadvance=42 page=0 chnl=15
+char id=19971 x=157 y=0 width=39 height=37 xoffset=1 yoffset=14 xadvance=42 page=0 chnl=15
+char id=19977 x=181 y=38 width=37 height=32 xoffset=3 yoffset=17 xadvance=42 page=0 chnl=15
+char id=20061 x=0 y=0 width=39 height=39 xoffset=1 yoffset=13 xadvance=42 page=0 chnl=15
+char id=20108 x=171 y=74 width=37 height=29 xoffset=2 yoffset=19 xadvance=42 page=0 chnl=15
+char id=20116 x=142 y=40 width=38 height=33 xoffset=2 yoffset=17 xadvance=42 page=0 chnl=15
+char id=20843 x=35 y=40 width=40 height=36 xoffset=1 yoffset=16 xadvance=42 page=0 chnl=15
+char id=20845 x=40 y=0 width=38 height=39 xoffset=2 yoffset=13 xadvance=42 page=0 chnl=15
+char id=21313 x=79 y=0 width=38 height=39 xoffset=2 yoffset=13 xadvance=42 page=0 chnl=15
+char id=22235 x=106 y=40 width=35 height=35 xoffset=3 yoffset=16 xadvance=42 page=0 chnl=15
+char id=26085 x=76 y=40 width=29 height=36 xoffset=7 yoffset=16 xadvance=42 page=0 chnl=15
+char id=26143 x=197 y=0 width=38 height=37 xoffset=2 yoffset=14 xadvance=42 page=0 chnl=15
+char id=26376 x=0 y=40 width=34 height=37 xoffset=1 yoffset=15 xadvance=42 page=0 chnl=15
+char id=26399 x=118 y=0 width=38 height=39 xoffset=1 yoffset=13 xadvance=42 page=0 chnl=15
diff --git a/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42_0.png b/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42_0.png
new file mode 100644
index 00000000..f10704df
Binary files /dev/null and b/resources-rectangle-448x486/fonts/noto-sans-cjk-sc-medium-42_0.png differ
diff --git a/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42.bmfc b/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42.bmfc
new file mode 100644
index 00000000..cfeb4fa6
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42.bmfc
@@ -0,0 +1,56 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Noto Sans CJK TC Medium
+fontFile=
+charSet=0
+fontSize=-42
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=10,32,48-57,19968,19971,19977,20061,20108,20116,20843,20845,21313,22235,26085,26143,26376,26399
+
+
+# imported icon images
diff --git a/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42.fnt b/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42.fnt
new file mode 100644
index 00000000..815d906b
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42.fnt
@@ -0,0 +1,30 @@
+info face="Noto Sans CJK TC Medium" size=-42 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=62 base=49 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-cjk-tc-medium-42_0.png"
+chars count=26
+char id=10 x=240 y=33 width=2 height=1 xoffset=0 yoffset=61 xadvance=9 page=0 chnl=15
+char id=32 x=243 y=33 width=2 height=1 xoffset=0 yoffset=61 xadvance=9 page=0 chnl=15
+char id=48 x=66 y=77 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=49 x=236 y=0 width=18 height=32 xoffset=3 yoffset=17 xadvance=24 page=0 chnl=15
+char id=50 x=0 y=78 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=51 x=22 y=78 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=52 x=217 y=38 width=22 height=32 xoffset=0 yoffset=17 xadvance=24 page=0 chnl=15
+char id=53 x=44 y=77 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=54 x=87 y=77 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=55 x=108 y=76 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=56 x=129 y=76 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=57 x=150 y=74 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=19968 x=209 y=72 width=39 height=5 xoffset=2 yoffset=30 xadvance=42 page=0 chnl=15
+char id=19971 x=35 y=40 width=38 height=36 xoffset=2 yoffset=14 xadvance=42 page=0 chnl=15
+char id=19977 x=179 y=39 width=37 height=32 xoffset=3 yoffset=17 xadvance=42 page=0 chnl=15
+char id=20061 x=0 y=0 width=39 height=39 xoffset=1 yoffset=13 xadvance=42 page=0 chnl=15
+char id=20108 x=171 y=74 width=37 height=29 xoffset=2 yoffset=19 xadvance=42 page=0 chnl=15
+char id=20116 x=140 y=40 width=38 height=33 xoffset=2 yoffset=17 xadvance=42 page=0 chnl=15
+char id=20843 x=157 y=0 width=39 height=38 xoffset=1 yoffset=15 xadvance=42 page=0 chnl=15
+char id=20845 x=40 y=0 width=38 height=39 xoffset=2 yoffset=13 xadvance=42 page=0 chnl=15
+char id=21313 x=79 y=0 width=38 height=39 xoffset=2 yoffset=13 xadvance=42 page=0 chnl=15
+char id=22235 x=104 y=40 width=35 height=35 xoffset=3 yoffset=16 xadvance=42 page=0 chnl=15
+char id=26085 x=74 y=40 width=29 height=36 xoffset=7 yoffset=16 xadvance=42 page=0 chnl=15
+char id=26143 x=197 y=0 width=38 height=37 xoffset=2 yoffset=14 xadvance=42 page=0 chnl=15
+char id=26376 x=0 y=40 width=34 height=37 xoffset=1 yoffset=15 xadvance=42 page=0 chnl=15
+char id=26399 x=118 y=0 width=38 height=39 xoffset=1 yoffset=13 xadvance=42 page=0 chnl=15
diff --git a/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42_0.png b/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42_0.png
new file mode 100644
index 00000000..90257042
Binary files /dev/null and b/resources-rectangle-448x486/fonts/noto-sans-cjk-tc-medium-42_0.png differ
diff --git a/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42.bmfc b/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42.bmfc
new file mode 100644
index 00000000..ee3827c9
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42.bmfc
@@ -0,0 +1,55 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Noto Sans
+fontFile=
+charSet=0
+fontSize=-42
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=1
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=32,48-57,1040-1071
+
+# imported icon images
diff --git a/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42.fnt b/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42.fnt
new file mode 100644
index 00000000..3a4dbd1e
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42.fnt
@@ -0,0 +1,47 @@
+info face="Noto Sans" size=-42 bold=1 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=58 base=45 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-rus-bold-42_0.png"
+chars count=43
+char id=32 x=241 y=0 width=2 height=1 xoffset=0 yoffset=57 xadvance=11 page=0 chnl=15
+char id=48 x=96 y=40 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=49 x=136 y=135 width=15 height=30 xoffset=2 yoffset=15 xadvance=23 page=0 chnl=15
+char id=50 x=0 y=74 width=21 height=31 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=51 x=118 y=40 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=52 x=0 y=137 width=23 height=30 xoffset=0 yoffset=15 xadvance=23 page=0 chnl=15
+char id=53 x=22 y=74 width=20 height=31 xoffset=1 yoffset=15 xadvance=23 page=0 chnl=15
+char id=54 x=140 y=33 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=55 x=93 y=135 width=21 height=30 xoffset=1 yoffset=15 xadvance=23 page=0 chnl=15
+char id=56 x=162 y=33 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=57 x=74 y=40 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=1040 x=190 y=65 width=29 height=30 xoffset=0 yoffset=15 xadvance=29 page=0 chnl=15
+char id=1041 x=24 y=137 width=22 height=30 xoffset=3 yoffset=15 xadvance=27 page=0 chnl=15
+char id=1042 x=213 y=96 width=23 height=30 xoffset=3 yoffset=15 xadvance=28 page=0 chnl=15
+char id=1043 x=115 y=135 width=20 height=30 xoffset=3 yoffset=15 xadvance=23 page=0 chnl=15
+char id=1044 x=73 y=0 width=32 height=39 xoffset=0 yoffset=15 xadvance=32 page=0 chnl=15
+char id=1045 x=237 y=96 width=18 height=30 xoffset=3 yoffset=15 xadvance=23 page=0 chnl=15
+char id=1046 x=43 y=74 width=40 height=30 xoffset=0 yoffset=15 xadvance=39 page=0 chnl=15
+char id=1047 x=0 y=41 width=24 height=32 xoffset=2 yoffset=14 xadvance=27 page=0 chnl=15
+char id=1048 x=29 y=106 width=28 height=30 xoffset=3 yoffset=15 xadvance=34 page=0 chnl=15
+char id=1049 x=0 y=0 width=28 height=40 xoffset=3 yoffset=5 xadvance=34 page=0 chnl=15
+char id=1050 x=58 y=105 width=25 height=30 xoffset=3 yoffset=15 xadvance=28 page=0 chnl=15
+char id=1051 x=213 y=33 width=28 height=31 xoffset=0 yoffset=15 xadvance=31 page=0 chnl=15
+char id=1052 x=124 y=73 width=33 height=30 xoffset=3 yoffset=15 xadvance=39 page=0 chnl=15
+char id=1053 x=136 y=104 width=25 height=30 xoffset=3 yoffset=15 xadvance=32 page=0 chnl=15
+char id=1054 x=211 y=0 width=29 height=32 xoffset=2 yoffset=14 xadvance=33 page=0 chnl=15
+char id=1055 x=84 y=104 width=25 height=30 xoffset=3 yoffset=15 xadvance=31 page=0 chnl=15
+char id=1056 x=47 y=137 width=22 height=30 xoffset=3 yoffset=15 xadvance=26 page=0 chnl=15
+char id=1057 x=50 y=40 width=23 height=32 xoffset=2 yoffset=14 xadvance=27 page=0 chnl=15
+char id=1058 x=188 y=97 width=24 height=30 xoffset=0 yoffset=15 xadvance=24 page=0 chnl=15
+char id=1059 x=184 y=33 width=28 height=31 xoffset=0 yoffset=15 xadvance=28 page=0 chnl=15
+char id=1060 x=177 y=0 width=33 height=32 xoffset=1 yoffset=14 xadvance=36 page=0 chnl=15
+char id=1061 x=0 y=106 width=28 height=30 xoffset=0 yoffset=15 xadvance=28 page=0 chnl=15
+char id=1062 x=106 y=0 width=29 height=39 xoffset=3 yoffset=15 xadvance=33 page=0 chnl=15
+char id=1063 x=110 y=104 width=25 height=30 xoffset=2 yoffset=15 xadvance=30 page=0 chnl=15
+char id=1064 x=84 y=73 width=39 height=30 xoffset=3 yoffset=15 xadvance=45 page=0 chnl=15
+char id=1065 x=29 y=0 width=43 height=39 xoffset=3 yoffset=15 xadvance=47 page=0 chnl=15
+char id=1066 x=220 y=65 width=29 height=30 xoffset=0 yoffset=15 xadvance=30 page=0 chnl=15
+char id=1067 x=158 y=66 width=31 height=30 xoffset=3 yoffset=15 xadvance=38 page=0 chnl=15
+char id=1068 x=70 y=136 width=22 height=30 xoffset=3 yoffset=15 xadvance=27 page=0 chnl=15
+char id=1069 x=25 y=41 width=24 height=32 xoffset=1 yoffset=14 xadvance=28 page=0 chnl=15
+char id=1070 x=136 y=0 width=40 height=32 xoffset=3 yoffset=14 xadvance=45 page=0 chnl=15
+char id=1071 x=162 y=97 width=25 height=30 xoffset=0 yoffset=15 xadvance=28 page=0 chnl=15
diff --git a/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42_0.png b/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42_0.png
new file mode 100644
index 00000000..07eaca80
Binary files /dev/null and b/resources-rectangle-448x486/fonts/noto-sans-rus-bold-42_0.png differ
diff --git a/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall.bmfc b/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall.bmfc
new file mode 100644
index 00000000..02e6d3c6
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall.bmfc
@@ -0,0 +1,59 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web
+fontFile=
+charSet=0
+fontSize=-128
+aa=2
+scaleH=105
+useSmoothing=1
+isBold=1
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+widthPaddingFactor=0.00
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=48-57
+
+# imported icon images
diff --git a/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall.fnt b/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall.fnt
new file mode 100644
index 00000000..f1440e72
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall.fnt
@@ -0,0 +1,15 @@
+info face="Titillium Web" size=-128 bold=1 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=205 base=153 scaleW=256 scaleH=256 pages=2 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-bold-128-tall_0.png"
+page id=1 file="titillium-web-bold-128-tall_1.png"
+chars count=10
+char id=48 x=0 y=0 width=66 height=93 xoffset=3 yoffset=62 xadvance=71 page=0 chnl=15
+char id=49 x=63 y=0 width=44 height=89 xoffset=10 yoffset=64 xadvance=71 page=1 chnl=15
+char id=50 x=124 y=94 width=55 height=91 xoffset=8 yoffset=62 xadvance=71 page=0 chnl=15
+char id=51 x=197 y=0 width=57 height=93 xoffset=7 yoffset=62 xadvance=71 page=0 chnl=15
+char id=52 x=0 y=0 width=62 height=89 xoffset=5 yoffset=64 xadvance=71 page=1 chnl=15
+char id=53 x=64 y=94 width=59 height=91 xoffset=6 yoffset=64 xadvance=71 page=0 chnl=15
+char id=54 x=67 y=0 width=64 height=93 xoffset=4 yoffset=62 xadvance=71 page=0 chnl=15
+char id=55 x=180 y=94 width=54 height=91 xoffset=9 yoffset=64 xadvance=71 page=0 chnl=15
+char id=56 x=132 y=0 width=64 height=93 xoffset=4 yoffset=62 xadvance=71 page=0 chnl=15
+char id=57 x=0 y=94 width=63 height=93 xoffset=4 yoffset=62 xadvance=71 page=0 chnl=15
diff --git a/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall_0.png b/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall_0.png
new file mode 100644
index 00000000..d578889f
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall_0.png differ
diff --git a/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall_1.png b/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall_1.png
new file mode 100644
index 00000000..c57427ff
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-bold-128-tall_1.png differ
diff --git a/resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall.bmfc b/resources-rectangle-448x486/fonts/titillium-web-bold-85-tall.bmfc
similarity index 96%
rename from resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall.bmfc
rename to resources-rectangle-448x486/fonts/titillium-web-bold-85-tall.bmfc
index a4307e4d..9b48b734 100644
--- a/resources-rectangle-148x205/fonts/titillium-web-bold-48-extra-tall.bmfc
+++ b/resources-rectangle-448x486/fonts/titillium-web-bold-85-tall.bmfc
@@ -5,9 +5,9 @@ fileVersion=1
fontName=Titillium Web
fontFile=
charSet=0
-fontSize=-48
+fontSize=-85
aa=1
-scaleH=110
+scaleH=105
useSmoothing=1
isBold=1
isItalic=0
diff --git a/resources-rectangle-448x486/fonts/titillium-web-bold-85-tall.fnt b/resources-rectangle-448x486/fonts/titillium-web-bold-85-tall.fnt
new file mode 100644
index 00000000..8f6efb2e
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-bold-85-tall.fnt
@@ -0,0 +1,14 @@
+info face="Titillium Web" size=-85 bold=1 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=136 base=101 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-bold-85-tall_0.png"
+chars count=10
+char id=48 x=0 y=0 width=44 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
+char id=49 x=122 y=62 width=30 height=59 xoffset=6 yoffset=42 xadvance=48 page=0 chnl=15
+char id=50 x=217 y=0 width=37 height=60 xoffset=5 yoffset=41 xadvance=48 page=0 chnl=15
+char id=51 x=177 y=0 width=39 height=61 xoffset=4 yoffset=41 xadvance=48 page=0 chnl=15
+char id=52 x=79 y=62 width=42 height=59 xoffset=3 yoffset=42 xadvance=48 page=0 chnl=15
+char id=53 x=0 y=62 width=40 height=60 xoffset=4 yoffset=42 xadvance=48 page=0 chnl=15
+char id=54 x=134 y=0 width=42 height=61 xoffset=3 yoffset=41 xadvance=48 page=0 chnl=15
+char id=55 x=41 y=62 width=37 height=60 xoffset=5 yoffset=42 xadvance=48 page=0 chnl=15
+char id=56 x=45 y=0 width=44 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
+char id=57 x=90 y=0 width=43 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
diff --git a/resources-rectangle-448x486/fonts/titillium-web-bold-85-tall_0.png b/resources-rectangle-448x486/fonts/titillium-web-bold-85-tall_0.png
new file mode 100644
index 00000000..4a14baf8
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-bold-85-tall_0.png differ
diff --git a/resources-rectangle-448x486/fonts/titillium-web-light-128-tall.bmfc b/resources-rectangle-448x486/fonts/titillium-web-light-128-tall.bmfc
new file mode 100644
index 00000000..fbeca927
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-light-128-tall.bmfc
@@ -0,0 +1,59 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web Light
+fontFile=
+charSet=0
+fontSize=-128
+aa=2
+scaleH=105
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+widthPaddingFactor=0.00
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=48-58
+
+# imported icon images
diff --git a/resources-rectangle-448x486/fonts/titillium-web-light-128-tall.fnt b/resources-rectangle-448x486/fonts/titillium-web-light-128-tall.fnt
new file mode 100644
index 00000000..6e215bd0
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-light-128-tall.fnt
@@ -0,0 +1,16 @@
+info face="Titillium Web Light" size=-128 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=205 base=153 scaleW=256 scaleH=256 pages=2 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-light-128-tall_0.png"
+page id=1 file="titillium-web-light-128-tall_1.png"
+chars count=11
+char id=48 x=64 y=0 width=61 height=92 xoffset=6 yoffset=62 xadvance=71 page=0 chnl=15
+char id=49 x=221 y=93 width=34 height=89 xoffset=15 yoffset=64 xadvance=71 page=0 chnl=15
+char id=50 x=56 y=93 width=54 height=91 xoffset=9 yoffset=62 xadvance=71 page=0 chnl=15
+char id=51 x=0 y=93 width=55 height=92 xoffset=8 yoffset=62 xadvance=71 page=0 chnl=15
+char id=52 x=0 y=0 width=62 height=89 xoffset=5 yoffset=64 xadvance=71 page=1 chnl=15
+char id=53 x=111 y=93 width=56 height=90 xoffset=9 yoffset=64 xadvance=71 page=0 chnl=15
+char id=54 x=126 y=0 width=59 height=92 xoffset=7 yoffset=62 xadvance=71 page=0 chnl=15
+char id=55 x=168 y=93 width=52 height=90 xoffset=10 yoffset=64 xadvance=71 page=0 chnl=15
+char id=56 x=0 y=0 width=63 height=92 xoffset=4 yoffset=62 xadvance=71 page=0 chnl=15
+char id=57 x=186 y=0 width=59 height=92 xoffset=6 yoffset=62 xadvance=71 page=0 chnl=15
+char id=58 x=246 y=0 width=9 height=59 xoffset=9 yoffset=94 xadvance=26 page=0 chnl=15
diff --git a/resources-rectangle-448x486/fonts/titillium-web-light-128-tall_0.png b/resources-rectangle-448x486/fonts/titillium-web-light-128-tall_0.png
new file mode 100644
index 00000000..18af9743
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-light-128-tall_0.png differ
diff --git a/resources-rectangle-448x486/fonts/titillium-web-light-128-tall_1.png b/resources-rectangle-448x486/fonts/titillium-web-light-128-tall_1.png
new file mode 100644
index 00000000..e4417050
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-light-128-tall_1.png differ
diff --git a/resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall.bmfc b/resources-rectangle-448x486/fonts/titillium-web-light-85-tall.bmfc
similarity index 96%
rename from resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall.bmfc
rename to resources-rectangle-448x486/fonts/titillium-web-light-85-tall.bmfc
index 671ef93d..07f5271e 100644
--- a/resources-rectangle-148x205/fonts/titillium-web-light-48-extra-tall.bmfc
+++ b/resources-rectangle-448x486/fonts/titillium-web-light-85-tall.bmfc
@@ -5,9 +5,9 @@ fileVersion=1
fontName=Titillium Web Light
fontFile=
charSet=0
-fontSize=-48
+fontSize=-85
aa=1
-scaleH=110
+scaleH=105
useSmoothing=1
isBold=0
isItalic=0
diff --git a/resources-rectangle-448x486/fonts/titillium-web-light-85-tall.fnt b/resources-rectangle-448x486/fonts/titillium-web-light-85-tall.fnt
new file mode 100644
index 00000000..4a1645c7
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-light-85-tall.fnt
@@ -0,0 +1,15 @@
+info face="Titillium Web Light" size=-85 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=136 base=101 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-light-85-tall_0.png"
+chars count=10
+char id=48 x=44 y=0 width=41 height=61 xoffset=3 yoffset=41 xadvance=48 page=0 chnl=15
+char id=49 x=117 y=62 width=23 height=59 xoffset=10 yoffset=42 xadvance=48 page=0 chnl=15
+char id=50 x=0 y=62 width=36 height=60 xoffset=6 yoffset=41 xadvance=48 page=0 chnl=15
+char id=51 x=168 y=0 width=37 height=61 xoffset=5 yoffset=41 xadvance=48 page=0 chnl=15
+char id=52 x=74 y=62 width=42 height=59 xoffset=3 yoffset=42 xadvance=48 page=0 chnl=15
+char id=53 x=206 y=0 width=38 height=60 xoffset=5 yoffset=42 xadvance=48 page=0 chnl=15
+char id=54 x=86 y=0 width=40 height=61 xoffset=4 yoffset=41 xadvance=48 page=0 chnl=15
+char id=55 x=37 y=62 width=36 height=60 xoffset=6 yoffset=42 xadvance=48 page=0 chnl=15
+char id=56 x=0 y=0 width=43 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
+char id=57 x=127 y=0 width=40 height=61 xoffset=3 yoffset=41 xadvance=48 page=0 chnl=15
+char id=58 x=145 y=62 width=12 height=61 xoffset=3 yoffset=41 xadvance=12 page=0 chnl=15
diff --git a/resources-rectangle-448x486/fonts/titillium-web-light-85-tall_0.png b/resources-rectangle-448x486/fonts/titillium-web-light-85-tall_0.png
new file mode 100644
index 00000000..14126c87
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-light-85-tall_0.png differ
diff --git a/resources-rectangle-448x486/fonts/titillium-web-semibold-30.bmfc b/resources-rectangle-448x486/fonts/titillium-web-semibold-30.bmfc
new file mode 100644
index 00000000..233b5488
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-semibold-30.bmfc
@@ -0,0 +1,57 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web SemiBold
+fontFile=
+charSet=0
+fontSize=-30
+aa=1
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=1
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=32,48-57,65-90,192-223,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292
+chars=294,296,298,300,302,304,308,310,313,315,317,321,323,325,327,330,332,334,336,338,340,342,344,346
+chars=348,350,352,356,358,360,362,364,366,368,370,372,374,376-377,379,381
+
+# imported icon images
diff --git a/resources-rectangle-448x486/fonts/titillium-web-semibold-30.fnt b/resources-rectangle-448x486/fonts/titillium-web-semibold-30.fnt
new file mode 100644
index 00000000..b892fcce
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-semibold-30.fnt
@@ -0,0 +1,555 @@
+info face="Titillium Web SemiBold" size=-30 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=46 base=34 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-semibold-30_0.png"
+chars count=129
+char id=32 x=251 y=145 width=3 height=1 xoffset=-1 yoffset=45 xadvance=7 page=0 chnl=15
+char id=48 x=194 y=146 width=17 height=22 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=49 x=243 y=169 width=11 height=20 xoffset=2 yoffset=14 xadvance=17 page=0 chnl=15
+char id=50 x=224 y=191 width=15 height=21 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15
+char id=51 x=49 y=175 width=15 height=22 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15
+char id=52 x=89 y=219 width=16 height=20 xoffset=0 yoffset=14 xadvance=17 page=0 chnl=15
+char id=53 x=208 y=191 width=15 height=21 xoffset=1 yoffset=14 xadvance=17 page=0 chnl=15
+char id=54 x=229 y=146 width=16 height=22 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=55 x=31 y=222 width=14 height=21 xoffset=1 yoffset=14 xadvance=17 page=0 chnl=15
+char id=56 x=176 y=147 width=17 height=22 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=57 x=212 y=146 width=16 height=22 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=65 x=205 y=169 width=18 height=21 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15
+char id=66 x=140 y=194 width=16 height=21 xoffset=2 yoffset=13 xadvance=18 page=0 chnl=15
+char id=67 x=33 y=177 width=15 height=22 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=68 x=106 y=195 width=16 height=21 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=15
+char id=69 x=16 y=222 width=14 height=21 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=15
+char id=70 x=46 y=222 width=14 height=21 xoffset=2 yoffset=13 xadvance=16 page=0 chnl=15
+char id=71 x=0 y=177 width=16 height=22 xoffset=1 yoffset=13 xadvance=18 page=0 chnl=15
+char id=72 x=0 y=200 width=17 height=21 xoffset=2 yoffset=13 xadvance=20 page=0 chnl=15
+char id=73 x=246 y=145 width=4 height=21 xoffset=2 yoffset=13 xadvance=8 page=0 chnl=15
+char id=74 x=86 y=148 width=7 height=24 xoffset=0 yoffset=13 xadvance=9 page=0 chnl=15
+char id=75 x=240 y=191 width=15 height=21 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=15
+char id=76 x=75 y=219 width=13 height=21 xoffset=2 yoffset=13 xadvance=14 page=0 chnl=15
+char id=77 x=120 y=172 width=22 height=21 xoffset=2 yoffset=13 xadvance=25 page=0 chnl=15
+char id=78 x=54 y=198 width=17 height=21 xoffset=2 yoffset=13 xadvance=21 page=0 chnl=15
+char id=79 x=139 y=148 width=18 height=22 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15
+char id=80 x=89 y=197 width=16 height=21 xoffset=2 yoffset=13 xadvance=18 page=0 chnl=15
+char id=81 x=48 y=148 width=18 height=26 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15
+char id=82 x=191 y=192 width=16 height=21 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=15
+char id=83 x=17 y=177 width=15 height=22 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=84 x=72 y=197 width=16 height=21 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=85 x=158 y=147 width=17 height=22 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15
+char id=86 x=224 y=169 width=18 height=21 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15
+char id=87 x=65 y=175 width=27 height=21 xoffset=0 yoffset=13 xadvance=27 page=0 chnl=15
+char id=88 x=36 y=200 width=17 height=21 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=89 x=18 y=200 width=17 height=21 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=90 x=0 y=222 width=15 height=21 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=192 x=153 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=193 x=58 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=194 x=77 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=195 x=96 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=196 x=159 y=119 width=18 height=27 xoffset=0 yoffset=7 xadvance=18 page=0 chnl=15
+char id=197 x=67 y=148 width=18 height=26 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=15
+char id=198 x=93 y=173 width=26 height=21 xoffset=0 yoffset=13 xadvance=26 page=0 chnl=15
+char id=199 x=207 y=89 width=15 height=28 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=200 x=0 y=120 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=201 x=60 y=119 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=202 x=75 y=119 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=203 x=15 y=149 width=14 height=27 xoffset=2 yoffset=7 xadvance=17 page=0 chnl=15
+char id=204 x=245 y=0 width=9 height=28 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=205 x=130 y=119 width=9 height=28 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15
+char id=206 x=104 y=119 width=12 height=28 xoffset=-2 yoffset=6 xadvance=8 page=0 chnl=15
+char id=207 x=245 y=117 width=10 height=27 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=208 x=185 y=170 width=19 height=21 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15
+char id=209 x=0 y=91 width=17 height=28 xoffset=2 yoffset=6 xadvance=21 page=0 chnl=15
+char id=210 x=226 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=211 x=207 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=212 x=188 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=213 x=169 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=214 x=39 y=61 width=18 height=28 xoffset=1 yoffset=7 xadvance=20 page=0 chnl=15
+char id=215 x=106 y=217 width=14 height=13 xoffset=1 yoffset=20 xadvance=17 page=0 chnl=15
+char id=216 x=134 y=61 width=18 height=28 xoffset=1 yoffset=10 xadvance=20 page=0 chnl=15
+char id=217 x=54 y=31 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=218 x=36 y=31 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=219 x=18 y=31 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=220 x=36 y=90 width=17 height=28 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=15
+char id=221 x=18 y=91 width=17 height=28 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=222 x=157 y=193 width=16 height=21 xoffset=2 yoffset=13 xadvance=18 page=0 chnl=15
+char id=223 x=121 y=148 width=17 height=23 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
+char id=256 x=140 y=119 width=18 height=27 xoffset=0 yoffset=7 xadvance=18 page=0 chnl=15
+char id=258 x=115 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=260 x=0 y=62 width=19 height=28 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15
+char id=262 x=156 y=30 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=264 x=124 y=31 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=266 x=223 y=89 width=15 height=28 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=268 x=204 y=30 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=270 x=141 y=90 width=16 height=28 xoffset=2 yoffset=6 xadvance=19 page=0 chnl=15
+char id=272 x=165 y=170 width=19 height=21 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15
+char id=274 x=230 y=118 width=14 height=27 xoffset=2 yoffset=7 xadvance=17 page=0 chnl=15
+char id=276 x=15 y=120 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=278 x=0 y=149 width=14 height=27 xoffset=2 yoffset=7 xadvance=17 page=0 chnl=15
+char id=280 x=30 y=120 width=14 height=28 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=15
+char id=282 x=45 y=119 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=284 x=107 y=31 width=16 height=29 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=15
+char id=286 x=90 y=31 width=16 height=29 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=15
+char id=288 x=158 y=90 width=16 height=28 xoffset=1 yoffset=7 xadvance=18 page=0 chnl=15
+char id=290 x=86 y=0 width=16 height=30 xoffset=1 yoffset=13 xadvance=18 page=0 chnl=15
+char id=292 x=172 y=60 width=17 height=28 xoffset=2 yoffset=6 xadvance=20 page=0 chnl=15
+char id=294 x=143 y=171 width=21 height=21 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15
+char id=296 x=117 y=119 width=12 height=28 xoffset=-2 yoffset=6 xadvance=8 page=0 chnl=15
+char id=298 x=30 y=149 width=12 height=27 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=15
+char id=300 x=244 y=59 width=11 height=28 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=302 x=248 y=29 width=7 height=28 xoffset=0 yoffset=13 xadvance=8 page=0 chnl=15
+char id=304 x=43 y=149 width=4 height=27 xoffset=2 yoffset=7 xadvance=8 page=0 chnl=15
+char id=308 x=0 y=0 width=12 height=31 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=15
+char id=310 x=120 y=0 width=15 height=30 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=15
+char id=313 x=90 y=119 width=13 height=28 xoffset=2 yoffset=6 xadvance=14 page=0 chnl=15
+char id=315 x=136 y=0 width=13 height=30 xoffset=2 yoffset=13 xadvance=14 page=0 chnl=15
+char id=317 x=61 y=220 width=13 height=21 xoffset=2 yoffset=13 xadvance=15 page=0 chnl=15
+char id=321 x=123 y=194 width=16 height=21 xoffset=-1 yoffset=13 xadvance=14 page=0 chnl=15
+char id=323 x=208 y=60 width=17 height=28 xoffset=2 yoffset=6 xadvance=21 page=0 chnl=15
+char id=325 x=68 y=0 width=17 height=30 xoffset=2 yoffset=13 xadvance=21 page=0 chnl=15
+char id=327 x=190 y=60 width=17 height=28 xoffset=2 yoffset=6 xadvance=21 page=0 chnl=15
+char id=330 x=178 y=118 width=17 height=27 xoffset=2 yoffset=13 xadvance=21 page=0 chnl=15
+char id=332 x=20 y=61 width=18 height=28 xoffset=1 yoffset=7 xadvance=20 page=0 chnl=15
+char id=334 x=150 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=336 x=13 y=0 width=18 height=30 xoffset=1 yoffset=5 xadvance=20 page=0 chnl=15
+char id=338 x=94 y=148 width=26 height=23 xoffset=1 yoffset=12 xadvance=27 page=0 chnl=15
+char id=340 x=124 y=90 width=16 height=28 xoffset=2 yoffset=6 xadvance=19 page=0 chnl=15
+char id=342 x=103 y=0 width=16 height=30 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=15
+char id=344 x=107 y=90 width=16 height=28 xoffset=2 yoffset=6 xadvance=19 page=0 chnl=15
+char id=346 x=172 y=30 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=348 x=188 y=30 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=350 x=175 y=89 width=15 height=28 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=352 x=140 y=31 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=356 x=90 y=90 width=16 height=28 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=358 x=174 y=192 width=16 height=21 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=360 x=0 y=32 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=362 x=226 y=59 width=17 height=28 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=15
+char id=364 x=72 y=31 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=366 x=50 y=0 width=17 height=30 xoffset=1 yoffset=5 xadvance=19 page=0 chnl=15
+char id=368 x=32 y=0 width=17 height=30 xoffset=1 yoffset=5 xadvance=19 page=0 chnl=15
+char id=370 x=54 y=90 width=17 height=28 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15
+char id=372 x=220 y=30 width=27 height=28 xoffset=0 yoffset=6 xadvance=27 page=0 chnl=15
+char id=374 x=72 y=90 width=17 height=28 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=376 x=196 y=118 width=17 height=27 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15
+char id=377 x=239 y=88 width=15 height=28 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=379 x=214 y=118 width=15 height=27 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=381 x=191 y=89 width=15 height=28 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+kernings count=421
+kerning first=65 second=84 amount=-1
+kerning first=65 second=356 amount=-1
+kerning first=65 second=358 amount=-1
+kerning first=65 second=87 amount=-1
+kerning first=65 second=372 amount=-1
+kerning first=65 second=89 amount=-2
+kerning first=65 second=221 amount=-2
+kerning first=65 second=374 amount=-2
+kerning first=65 second=376 amount=-2
+kerning first=68 second=89 amount=-1
+kerning first=68 second=221 amount=-1
+kerning first=68 second=374 amount=-1
+kerning first=68 second=376 amount=-1
+kerning first=76 second=84 amount=-3
+kerning first=76 second=356 amount=-3
+kerning first=76 second=358 amount=-3
+kerning first=76 second=87 amount=-1
+kerning first=76 second=372 amount=-1
+kerning first=76 second=89 amount=-3
+kerning first=76 second=221 amount=-3
+kerning first=76 second=374 amount=-3
+kerning first=76 second=376 amount=-3
+kerning first=79 second=89 amount=-1
+kerning first=79 second=221 amount=-1
+kerning first=79 second=374 amount=-1
+kerning first=79 second=376 amount=-1
+kerning first=81 second=89 amount=-1
+kerning first=81 second=221 amount=-1
+kerning first=81 second=374 amount=-1
+kerning first=81 second=376 amount=-1
+kerning first=82 second=89 amount=-1
+kerning first=82 second=221 amount=-1
+kerning first=82 second=374 amount=-1
+kerning first=82 second=376 amount=-1
+kerning first=84 second=65 amount=-1
+kerning first=84 second=192 amount=-1
+kerning first=84 second=193 amount=-1
+kerning first=84 second=194 amount=-1
+kerning first=84 second=195 amount=-1
+kerning first=84 second=196 amount=-1
+kerning first=84 second=197 amount=-1
+kerning first=84 second=256 amount=-1
+kerning first=84 second=258 amount=-1
+kerning first=84 second=260 amount=-1
+kerning first=87 second=65 amount=-1
+kerning first=87 second=192 amount=-1
+kerning first=87 second=193 amount=-1
+kerning first=87 second=194 amount=-1
+kerning first=87 second=195 amount=-1
+kerning first=87 second=196 amount=-1
+kerning first=87 second=197 amount=-1
+kerning first=87 second=256 amount=-1
+kerning first=87 second=258 amount=-1
+kerning first=87 second=260 amount=-1
+kerning first=89 second=67 amount=-1
+kerning first=89 second=199 amount=-1
+kerning first=89 second=262 amount=-1
+kerning first=89 second=264 amount=-1
+kerning first=89 second=266 amount=-1
+kerning first=89 second=268 amount=-1
+kerning first=89 second=71 amount=-1
+kerning first=89 second=79 amount=-1
+kerning first=89 second=81 amount=-1
+kerning first=89 second=210 amount=-1
+kerning first=89 second=211 amount=-1
+kerning first=89 second=212 amount=-1
+kerning first=89 second=213 amount=-1
+kerning first=89 second=214 amount=-1
+kerning first=89 second=216 amount=-1
+kerning first=89 second=284 amount=-1
+kerning first=89 second=286 amount=-1
+kerning first=89 second=288 amount=-1
+kerning first=89 second=290 amount=-1
+kerning first=89 second=332 amount=-1
+kerning first=89 second=334 amount=-1
+kerning first=89 second=336 amount=-1
+kerning first=89 second=338 amount=-1
+kerning first=89 second=83 amount=-1
+kerning first=89 second=346 amount=-1
+kerning first=89 second=348 amount=-1
+kerning first=89 second=350 amount=-1
+kerning first=89 second=352 amount=-1
+kerning first=89 second=65 amount=-2
+kerning first=89 second=192 amount=-2
+kerning first=89 second=193 amount=-2
+kerning first=89 second=194 amount=-2
+kerning first=89 second=195 amount=-2
+kerning first=89 second=196 amount=-2
+kerning first=89 second=197 amount=-2
+kerning first=89 second=256 amount=-2
+kerning first=89 second=258 amount=-2
+kerning first=89 second=260 amount=-2
+kerning first=89 second=74 amount=-1
+kerning first=89 second=308 amount=-1
+kerning first=192 second=84 amount=-1
+kerning first=192 second=356 amount=-1
+kerning first=192 second=358 amount=-1
+kerning first=192 second=87 amount=-1
+kerning first=192 second=372 amount=-1
+kerning first=192 second=89 amount=-2
+kerning first=192 second=221 amount=-2
+kerning first=192 second=374 amount=-2
+kerning first=192 second=376 amount=-2
+kerning first=193 second=84 amount=-1
+kerning first=193 second=356 amount=-1
+kerning first=193 second=358 amount=-1
+kerning first=193 second=87 amount=-1
+kerning first=193 second=372 amount=-1
+kerning first=193 second=89 amount=-2
+kerning first=193 second=221 amount=-2
+kerning first=193 second=374 amount=-2
+kerning first=193 second=376 amount=-2
+kerning first=194 second=84 amount=-1
+kerning first=194 second=356 amount=-1
+kerning first=194 second=358 amount=-1
+kerning first=194 second=87 amount=-1
+kerning first=194 second=372 amount=-1
+kerning first=194 second=89 amount=-2
+kerning first=194 second=221 amount=-2
+kerning first=194 second=374 amount=-2
+kerning first=194 second=376 amount=-2
+kerning first=195 second=84 amount=-1
+kerning first=195 second=356 amount=-1
+kerning first=195 second=358 amount=-1
+kerning first=195 second=87 amount=-1
+kerning first=195 second=372 amount=-1
+kerning first=195 second=89 amount=-2
+kerning first=195 second=221 amount=-2
+kerning first=195 second=374 amount=-2
+kerning first=195 second=376 amount=-2
+kerning first=196 second=84 amount=-1
+kerning first=196 second=356 amount=-1
+kerning first=196 second=358 amount=-1
+kerning first=196 second=87 amount=-1
+kerning first=196 second=372 amount=-1
+kerning first=196 second=89 amount=-2
+kerning first=196 second=221 amount=-2
+kerning first=196 second=374 amount=-2
+kerning first=196 second=376 amount=-2
+kerning first=197 second=84 amount=-1
+kerning first=197 second=356 amount=-1
+kerning first=197 second=358 amount=-1
+kerning first=197 second=87 amount=-1
+kerning first=197 second=372 amount=-1
+kerning first=197 second=89 amount=-2
+kerning first=197 second=221 amount=-2
+kerning first=197 second=374 amount=-2
+kerning first=197 second=376 amount=-2
+kerning first=208 second=89 amount=-1
+kerning first=208 second=221 amount=-1
+kerning first=208 second=374 amount=-1
+kerning first=208 second=376 amount=-1
+kerning first=210 second=89 amount=-1
+kerning first=210 second=221 amount=-1
+kerning first=210 second=374 amount=-1
+kerning first=210 second=376 amount=-1
+kerning first=211 second=89 amount=-1
+kerning first=211 second=221 amount=-1
+kerning first=211 second=374 amount=-1
+kerning first=211 second=376 amount=-1
+kerning first=212 second=89 amount=-1
+kerning first=212 second=221 amount=-1
+kerning first=212 second=374 amount=-1
+kerning first=212 second=376 amount=-1
+kerning first=213 second=89 amount=-1
+kerning first=213 second=221 amount=-1
+kerning first=213 second=374 amount=-1
+kerning first=213 second=376 amount=-1
+kerning first=214 second=89 amount=-1
+kerning first=214 second=221 amount=-1
+kerning first=214 second=374 amount=-1
+kerning first=214 second=376 amount=-1
+kerning first=216 second=89 amount=-1
+kerning first=216 second=221 amount=-1
+kerning first=216 second=374 amount=-1
+kerning first=216 second=376 amount=-1
+kerning first=221 second=67 amount=-1
+kerning first=221 second=199 amount=-1
+kerning first=221 second=262 amount=-1
+kerning first=221 second=264 amount=-1
+kerning first=221 second=266 amount=-1
+kerning first=221 second=268 amount=-1
+kerning first=221 second=71 amount=-1
+kerning first=221 second=79 amount=-1
+kerning first=221 second=81 amount=-1
+kerning first=221 second=210 amount=-1
+kerning first=221 second=211 amount=-1
+kerning first=221 second=212 amount=-1
+kerning first=221 second=213 amount=-1
+kerning first=221 second=214 amount=-1
+kerning first=221 second=216 amount=-1
+kerning first=221 second=284 amount=-1
+kerning first=221 second=286 amount=-1
+kerning first=221 second=288 amount=-1
+kerning first=221 second=290 amount=-1
+kerning first=221 second=332 amount=-1
+kerning first=221 second=334 amount=-1
+kerning first=221 second=336 amount=-1
+kerning first=221 second=338 amount=-1
+kerning first=221 second=83 amount=-1
+kerning first=221 second=346 amount=-1
+kerning first=221 second=348 amount=-1
+kerning first=221 second=350 amount=-1
+kerning first=221 second=352 amount=-1
+kerning first=221 second=65 amount=-2
+kerning first=221 second=192 amount=-2
+kerning first=221 second=193 amount=-2
+kerning first=221 second=194 amount=-2
+kerning first=221 second=195 amount=-2
+kerning first=221 second=196 amount=-2
+kerning first=221 second=197 amount=-2
+kerning first=221 second=256 amount=-2
+kerning first=221 second=258 amount=-2
+kerning first=221 second=260 amount=-2
+kerning first=221 second=74 amount=-1
+kerning first=221 second=308 amount=-1
+kerning first=256 second=84 amount=-1
+kerning first=256 second=356 amount=-1
+kerning first=256 second=358 amount=-1
+kerning first=256 second=87 amount=-1
+kerning first=256 second=372 amount=-1
+kerning first=256 second=89 amount=-2
+kerning first=256 second=221 amount=-2
+kerning first=256 second=374 amount=-2
+kerning first=256 second=376 amount=-2
+kerning first=258 second=84 amount=-1
+kerning first=258 second=356 amount=-1
+kerning first=258 second=358 amount=-1
+kerning first=258 second=87 amount=-1
+kerning first=258 second=372 amount=-1
+kerning first=258 second=89 amount=-2
+kerning first=258 second=221 amount=-2
+kerning first=258 second=374 amount=-2
+kerning first=258 second=376 amount=-2
+kerning first=260 second=84 amount=-1
+kerning first=260 second=356 amount=-1
+kerning first=260 second=358 amount=-1
+kerning first=260 second=87 amount=-1
+kerning first=260 second=372 amount=-1
+kerning first=260 second=89 amount=-2
+kerning first=260 second=221 amount=-2
+kerning first=260 second=374 amount=-2
+kerning first=260 second=376 amount=-2
+kerning first=270 second=89 amount=-1
+kerning first=270 second=221 amount=-1
+kerning first=270 second=374 amount=-1
+kerning first=270 second=376 amount=-1
+kerning first=272 second=89 amount=-1
+kerning first=272 second=221 amount=-1
+kerning first=272 second=374 amount=-1
+kerning first=272 second=376 amount=-1
+kerning first=313 second=84 amount=-3
+kerning first=313 second=356 amount=-3
+kerning first=313 second=358 amount=-3
+kerning first=313 second=87 amount=-1
+kerning first=313 second=372 amount=-1
+kerning first=313 second=89 amount=-3
+kerning first=313 second=221 amount=-3
+kerning first=313 second=374 amount=-3
+kerning first=313 second=376 amount=-3
+kerning first=315 second=84 amount=-3
+kerning first=315 second=356 amount=-3
+kerning first=315 second=358 amount=-3
+kerning first=315 second=87 amount=-1
+kerning first=315 second=372 amount=-1
+kerning first=315 second=89 amount=-3
+kerning first=315 second=221 amount=-3
+kerning first=315 second=374 amount=-3
+kerning first=315 second=376 amount=-3
+kerning first=317 second=84 amount=-3
+kerning first=317 second=356 amount=-3
+kerning first=317 second=358 amount=-3
+kerning first=317 second=87 amount=-1
+kerning first=317 second=372 amount=-1
+kerning first=317 second=89 amount=-3
+kerning first=317 second=221 amount=-3
+kerning first=317 second=374 amount=-3
+kerning first=317 second=376 amount=-3
+kerning first=321 second=84 amount=-3
+kerning first=321 second=356 amount=-3
+kerning first=321 second=358 amount=-3
+kerning first=321 second=87 amount=-1
+kerning first=321 second=372 amount=-1
+kerning first=321 second=89 amount=-3
+kerning first=321 second=221 amount=-3
+kerning first=321 second=374 amount=-3
+kerning first=321 second=376 amount=-3
+kerning first=332 second=89 amount=-1
+kerning first=332 second=221 amount=-1
+kerning first=332 second=374 amount=-1
+kerning first=332 second=376 amount=-1
+kerning first=334 second=89 amount=-1
+kerning first=334 second=221 amount=-1
+kerning first=334 second=374 amount=-1
+kerning first=334 second=376 amount=-1
+kerning first=336 second=89 amount=-1
+kerning first=336 second=221 amount=-1
+kerning first=336 second=374 amount=-1
+kerning first=336 second=376 amount=-1
+kerning first=340 second=89 amount=-1
+kerning first=340 second=221 amount=-1
+kerning first=340 second=374 amount=-1
+kerning first=340 second=376 amount=-1
+kerning first=342 second=89 amount=-1
+kerning first=342 second=221 amount=-1
+kerning first=342 second=374 amount=-1
+kerning first=342 second=376 amount=-1
+kerning first=344 second=89 amount=-1
+kerning first=344 second=221 amount=-1
+kerning first=344 second=374 amount=-1
+kerning first=344 second=376 amount=-1
+kerning first=356 second=65 amount=-1
+kerning first=356 second=192 amount=-1
+kerning first=356 second=193 amount=-1
+kerning first=356 second=194 amount=-1
+kerning first=356 second=195 amount=-1
+kerning first=356 second=196 amount=-1
+kerning first=356 second=197 amount=-1
+kerning first=356 second=256 amount=-1
+kerning first=356 second=258 amount=-1
+kerning first=356 second=260 amount=-1
+kerning first=358 second=65 amount=-1
+kerning first=358 second=192 amount=-1
+kerning first=358 second=193 amount=-1
+kerning first=358 second=194 amount=-1
+kerning first=358 second=195 amount=-1
+kerning first=358 second=196 amount=-1
+kerning first=358 second=197 amount=-1
+kerning first=358 second=256 amount=-1
+kerning first=358 second=258 amount=-1
+kerning first=358 second=260 amount=-1
+kerning first=372 second=65 amount=-1
+kerning first=372 second=192 amount=-1
+kerning first=372 second=193 amount=-1
+kerning first=372 second=194 amount=-1
+kerning first=372 second=195 amount=-1
+kerning first=372 second=196 amount=-1
+kerning first=372 second=197 amount=-1
+kerning first=372 second=256 amount=-1
+kerning first=372 second=258 amount=-1
+kerning first=372 second=260 amount=-1
+kerning first=374 second=67 amount=-1
+kerning first=374 second=199 amount=-1
+kerning first=374 second=262 amount=-1
+kerning first=374 second=264 amount=-1
+kerning first=374 second=266 amount=-1
+kerning first=374 second=268 amount=-1
+kerning first=374 second=71 amount=-1
+kerning first=374 second=79 amount=-1
+kerning first=374 second=81 amount=-1
+kerning first=374 second=210 amount=-1
+kerning first=374 second=211 amount=-1
+kerning first=374 second=212 amount=-1
+kerning first=374 second=213 amount=-1
+kerning first=374 second=214 amount=-1
+kerning first=374 second=216 amount=-1
+kerning first=374 second=284 amount=-1
+kerning first=374 second=286 amount=-1
+kerning first=374 second=288 amount=-1
+kerning first=374 second=290 amount=-1
+kerning first=374 second=332 amount=-1
+kerning first=374 second=334 amount=-1
+kerning first=374 second=336 amount=-1
+kerning first=374 second=338 amount=-1
+kerning first=374 second=83 amount=-1
+kerning first=374 second=346 amount=-1
+kerning first=374 second=348 amount=-1
+kerning first=374 second=350 amount=-1
+kerning first=374 second=352 amount=-1
+kerning first=374 second=65 amount=-2
+kerning first=374 second=192 amount=-2
+kerning first=374 second=193 amount=-2
+kerning first=374 second=194 amount=-2
+kerning first=374 second=195 amount=-2
+kerning first=374 second=196 amount=-2
+kerning first=374 second=197 amount=-2
+kerning first=374 second=256 amount=-2
+kerning first=374 second=258 amount=-2
+kerning first=374 second=260 amount=-2
+kerning first=374 second=74 amount=-1
+kerning first=374 second=308 amount=-1
+kerning first=376 second=67 amount=-1
+kerning first=376 second=199 amount=-1
+kerning first=376 second=262 amount=-1
+kerning first=376 second=264 amount=-1
+kerning first=376 second=266 amount=-1
+kerning first=376 second=268 amount=-1
+kerning first=376 second=71 amount=-1
+kerning first=376 second=79 amount=-1
+kerning first=376 second=81 amount=-1
+kerning first=376 second=210 amount=-1
+kerning first=376 second=211 amount=-1
+kerning first=376 second=212 amount=-1
+kerning first=376 second=213 amount=-1
+kerning first=376 second=214 amount=-1
+kerning first=376 second=216 amount=-1
+kerning first=376 second=284 amount=-1
+kerning first=376 second=286 amount=-1
+kerning first=376 second=288 amount=-1
+kerning first=376 second=290 amount=-1
+kerning first=376 second=332 amount=-1
+kerning first=376 second=334 amount=-1
+kerning first=376 second=336 amount=-1
+kerning first=376 second=338 amount=-1
+kerning first=376 second=83 amount=-1
+kerning first=376 second=346 amount=-1
+kerning first=376 second=348 amount=-1
+kerning first=376 second=350 amount=-1
+kerning first=376 second=352 amount=-1
+kerning first=376 second=65 amount=-2
+kerning first=376 second=192 amount=-2
+kerning first=376 second=193 amount=-2
+kerning first=376 second=194 amount=-2
+kerning first=376 second=195 amount=-2
+kerning first=376 second=196 amount=-2
+kerning first=376 second=197 amount=-2
+kerning first=376 second=256 amount=-2
+kerning first=376 second=258 amount=-2
+kerning first=376 second=260 amount=-2
+kerning first=376 second=74 amount=-1
+kerning first=376 second=308 amount=-1
diff --git a/resources-rectangle-448x486/fonts/titillium-web-semibold-30_0.png b/resources-rectangle-448x486/fonts/titillium-web-semibold-30_0.png
new file mode 100644
index 00000000..d6834032
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-semibold-30_0.png differ
diff --git a/resources-rectangle-448x486/fonts/titillium-web-semibold-45.bmfc b/resources-rectangle-448x486/fonts/titillium-web-semibold-45.bmfc
new file mode 100644
index 00000000..4c1ad06e
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-semibold-45.bmfc
@@ -0,0 +1,61 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web SemiBold
+fontFile=
+charSet=0
+fontSize=-45
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+widthPaddingFactor=0.00
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=32,48-57,65-90,192-223,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292
+chars=294,296,298,300,302,304,308,310,313,315,317,321,323,325,327,330,332,334,336,338,340,342,344,346
+chars=348,350,352,356,358,360,362,364,366,368,370,372,374,376-377,379,381
+
+# imported icon images
diff --git a/resources-rectangle-448x486/fonts/titillium-web-semibold-45.fnt b/resources-rectangle-448x486/fonts/titillium-web-semibold-45.fnt
new file mode 100644
index 00000000..033f5edb
--- /dev/null
+++ b/resources-rectangle-448x486/fonts/titillium-web-semibold-45.fnt
@@ -0,0 +1,688 @@
+info face="Titillium Web SemiBold" size=-45 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=69 base=51 scaleW=256 scaleH=256 pages=2 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-semibold-45_0.png"
+page id=1 file="titillium-web-semibold-45_1.png"
+chars count=129
+char id=32 x=251 y=44 width=2 height=1 xoffset=0 yoffset=68 xadvance=10 page=0 chnl=15
+char id=48 x=139 y=85 width=23 height=32 xoffset=1 yoffset=20 xadvance=25 page=1 chnl=15
+char id=49 x=192 y=182 width=15 height=30 xoffset=4 yoffset=21 xadvance=25 page=1 chnl=15
+char id=50 x=88 y=189 width=20 height=31 xoffset=3 yoffset=20 xadvance=25 page=1 chnl=15
+char id=51 x=235 y=85 width=20 height=32 xoffset=2 yoffset=20 xadvance=25 page=1 chnl=15
+char id=52 x=169 y=183 width=22 height=30 xoffset=1 yoffset=21 xadvance=25 page=1 chnl=15
+char id=53 x=23 y=191 width=21 height=31 xoffset=2 yoffset=21 xadvance=25 page=1 chnl=15
+char id=54 x=211 y=85 width=23 height=32 xoffset=1 yoffset=20 xadvance=25 page=1 chnl=15
+char id=55 x=130 y=189 width=19 height=31 xoffset=3 yoffset=21 xadvance=25 page=1 chnl=15
+char id=56 x=187 y=85 width=23 height=32 xoffset=1 yoffset=20 xadvance=25 page=1 chnl=15
+char id=57 x=0 y=126 width=22 height=32 xoffset=1 yoffset=20 xadvance=25 page=1 chnl=15
+char id=65 x=196 y=118 width=25 height=31 xoffset=1 yoffset=20 xadvance=27 page=1 chnl=15
+char id=66 x=219 y=150 width=22 height=31 xoffset=3 yoffset=20 xadvance=27 page=1 chnl=15
+char id=67 x=117 y=85 width=21 height=33 xoffset=2 yoffset=19 xadvance=24 page=1 chnl=15
+char id=68 x=100 y=157 width=23 height=31 xoffset=3 yoffset=20 xadvance=29 page=1 chnl=15
+char id=69 x=67 y=191 width=20 height=31 xoffset=3 yoffset=20 xadvance=25 page=1 chnl=15
+char id=70 x=109 y=189 width=20 height=31 xoffset=3 yoffset=20 xadvance=24 page=1 chnl=15
+char id=71 x=132 y=222 width=23 height=33 xoffset=2 yoffset=19 xadvance=27 page=0 chnl=15
+char id=72 x=26 y=159 width=24 height=31 xoffset=3 yoffset=20 xadvance=30 page=1 chnl=15
+char id=73 x=248 y=131 width=5 height=31 xoffset=3 yoffset=20 xadvance=12 page=0 chnl=15
+char id=74 x=181 y=220 width=10 height=35 xoffset=0 yoffset=20 xadvance=13 page=0 chnl=15
+char id=75 x=196 y=150 width=22 height=31 xoffset=3 yoffset=20 xadvance=26 page=1 chnl=15
+char id=76 x=150 y=183 width=18 height=31 xoffset=3 yoffset=20 xadvance=21 page=1 chnl=15
+char id=77 x=105 y=125 width=32 height=31 xoffset=3 yoffset=20 xadvance=38 page=1 chnl=15
+char id=78 x=51 y=159 width=24 height=31 xoffset=3 yoffset=20 xadvance=31 page=1 chnl=15
+char id=79 x=105 y=222 width=26 height=33 xoffset=2 yoffset=19 xadvance=29 page=0 chnl=15
+char id=80 x=0 y=191 width=22 height=31 xoffset=3 yoffset=20 xadvance=26 page=1 chnl=15
+char id=81 x=64 y=85 width=26 height=39 xoffset=2 yoffset=19 xadvance=29 page=1 chnl=15
+char id=82 x=172 y=150 width=23 height=31 xoffset=3 yoffset=20 xadvance=28 page=1 chnl=15
+char id=83 x=156 y=221 width=22 height=33 xoffset=1 yoffset=19 xadvance=24 page=0 chnl=15
+char id=84 x=124 y=157 width=23 height=31 xoffset=0 yoffset=20 xadvance=23 page=1 chnl=15
+char id=85 x=163 y=85 width=23 height=32 xoffset=3 yoffset=20 xadvance=29 page=1 chnl=15
+char id=86 x=169 y=118 width=26 height=31 xoffset=0 yoffset=20 xadvance=26 page=1 chnl=15
+char id=87 x=65 y=125 width=39 height=31 xoffset=1 yoffset=20 xadvance=41 page=1 chnl=15
+char id=88 x=222 y=118 width=25 height=31 xoffset=0 yoffset=20 xadvance=25 page=1 chnl=15
+char id=89 x=0 y=159 width=25 height=31 xoffset=0 yoffset=20 xadvance=24 page=1 chnl=15
+char id=90 x=45 y=191 width=21 height=31 xoffset=1 yoffset=20 xadvance=24 page=1 chnl=15
+char id=192 x=0 y=92 width=25 height=43 xoffset=1 yoffset=8 xadvance=27 page=0 chnl=15
+char id=193 x=26 y=92 width=25 height=43 xoffset=1 yoffset=8 xadvance=27 page=0 chnl=15
+char id=194 x=27 y=180 width=25 height=42 xoffset=1 yoffset=9 xadvance=27 page=0 chnl=15
+char id=195 x=79 y=180 width=25 height=42 xoffset=1 yoffset=9 xadvance=27 page=0 chnl=15
+char id=196 x=54 y=43 width=25 height=41 xoffset=1 yoffset=10 xadvance=27 page=1 chnl=15
+char id=197 x=91 y=85 width=25 height=39 xoffset=1 yoffset=12 xadvance=27 page=1 chnl=15
+char id=198 x=0 y=223 width=37 height=32 xoffset=0 yoffset=19 xadvance=39 page=0 chnl=15
+char id=199 x=68 y=136 width=21 height=43 xoffset=2 yoffset=19 xadvance=24 page=0 chnl=15
+char id=200 x=134 y=134 width=20 height=43 xoffset=3 yoffset=8 xadvance=25 page=0 chnl=15
+char id=201 x=155 y=134 width=20 height=43 xoffset=3 yoffset=8 xadvance=25 page=0 chnl=15
+char id=202 x=137 y=0 width=20 height=42 xoffset=3 yoffset=9 xadvance=25 page=1 chnl=15
+char id=203 x=177 y=43 width=20 height=41 xoffset=3 yoffset=10 xadvance=25 page=1 chnl=15
+char id=204 x=176 y=133 width=12 height=43 xoffset=-1 yoffset=8 xadvance=12 page=0 chnl=15
+char id=205 x=189 y=133 width=12 height=43 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15
+char id=206 x=179 y=0 width=17 height=42 xoffset=-2 yoffset=9 xadvance=12 page=1 chnl=15
+char id=207 x=240 y=42 width=15 height=41 xoffset=-1 yoffset=10 xadvance=12 page=1 chnl=15
+char id=208 x=65 y=223 width=26 height=32 xoffset=1 yoffset=19 xadvance=29 page=0 chnl=15
+char id=209 x=131 y=179 width=24 height=42 xoffset=3 yoffset=9 xadvance=31 page=0 chnl=15
+char id=210 x=210 y=0 width=26 height=44 xoffset=2 yoffset=8 xadvance=29 page=0 chnl=15
+char id=211 x=156 y=0 width=26 height=44 xoffset=2 yoffset=8 xadvance=29 page=0 chnl=15
+char id=212 x=117 y=46 width=26 height=43 xoffset=2 yoffset=9 xadvance=29 page=0 chnl=15
+char id=213 x=171 y=45 width=26 height=43 xoffset=2 yoffset=9 xadvance=29 page=0 chnl=15
+char id=214 x=0 y=180 width=26 height=42 xoffset=2 yoffset=10 xadvance=29 page=0 chnl=15
+char id=215 x=208 y=182 width=20 height=20 xoffset=2 yoffset=30 xadvance=25 page=1 chnl=15
+char id=216 x=144 y=46 width=26 height=43 xoffset=2 yoffset=14 xadvance=29 page=0 chnl=15
+char id=217 x=48 y=47 width=23 height=44 xoffset=3 yoffset=8 xadvance=29 page=0 chnl=15
+char id=218 x=0 y=47 width=23 height=44 xoffset=3 yoffset=8 xadvance=29 page=0 chnl=15
+char id=219 x=173 y=89 width=23 height=43 xoffset=3 yoffset=9 xadvance=29 page=0 chnl=15
+char id=220 x=48 y=0 width=23 height=42 xoffset=3 yoffset=10 xadvance=29 page=1 chnl=15
+char id=221 x=225 y=45 width=25 height=43 xoffset=0 yoffset=8 xadvance=24 page=0 chnl=15
+char id=222 x=23 y=126 width=22 height=32 xoffset=3 yoffset=19 xadvance=27 page=1 chnl=15
+char id=223 x=192 y=220 width=23 height=34 xoffset=3 yoffset=18 xadvance=27 page=0 chnl=15
+char id=256 x=0 y=85 width=25 height=40 xoffset=1 yoffset=11 xadvance=27 page=1 chnl=15
+char id=258 x=53 y=180 width=25 height=42 xoffset=1 yoffset=9 xadvance=27 page=0 chnl=15
+char id=260 x=0 y=43 width=26 height=41 xoffset=1 yoffset=20 xadvance=27 page=1 chnl=15
+char id=262 x=95 y=46 width=21 height=44 xoffset=2 yoffset=8 xadvance=24 page=0 chnl=15
+char id=264 x=90 y=135 width=21 height=43 xoffset=2 yoffset=9 xadvance=24 page=0 chnl=15
+char id=266 x=94 y=0 width=21 height=42 xoffset=2 yoffset=10 xadvance=24 page=1 chnl=15
+char id=268 x=46 y=136 width=21 height=43 xoffset=2 yoffset=9 xadvance=24 page=0 chnl=15
+char id=270 x=206 y=176 width=23 height=42 xoffset=3 yoffset=9 xadvance=29 page=0 chnl=15
+char id=272 x=38 y=223 width=26 height=32 xoffset=1 yoffset=19 xadvance=29 page=0 chnl=15
+char id=274 x=26 y=85 width=20 height=40 xoffset=3 yoffset=11 xadvance=25 page=1 chnl=15
+char id=276 x=158 y=0 width=20 height=42 xoffset=3 yoffset=9 xadvance=25 page=1 chnl=15
+char id=278 x=219 y=43 width=20 height=41 xoffset=3 yoffset=10 xadvance=25 page=1 chnl=15
+char id=280 x=198 y=43 width=20 height=41 xoffset=3 yoffset=20 xadvance=25 page=1 chnl=15
+char id=282 x=116 y=0 width=20 height=42 xoffset=3 yoffset=9 xadvance=25 page=1 chnl=15
+char id=284 x=149 y=90 width=23 height=43 xoffset=2 yoffset=9 xadvance=27 page=0 chnl=15
+char id=286 x=101 y=91 width=23 height=43 xoffset=2 yoffset=9 xadvance=27 page=0 chnl=15
+char id=288 x=230 y=176 width=23 height=42 xoffset=2 yoffset=10 xadvance=27 page=0 chnl=15
+char id=290 x=0 y=0 width=23 height=46 xoffset=2 yoffset=19 xadvance=27 page=0 chnl=15
+char id=292 x=181 y=177 width=24 height=42 xoffset=3 yoffset=9 xadvance=30 page=0 chnl=15
+char id=294 x=138 y=119 width=30 height=31 xoffset=0 yoffset=20 xadvance=31 page=1 chnl=15
+char id=296 x=197 y=0 width=17 height=42 xoffset=-2 yoffset=9 xadvance=12 page=1 chnl=15
+char id=298 x=47 y=85 width=16 height=40 xoffset=-1 yoffset=11 xadvance=12 page=1 chnl=15
+char id=300 x=215 y=0 width=16 height=42 xoffset=-1 yoffset=9 xadvance=12 page=1 chnl=15
+char id=302 x=244 y=89 width=9 height=41 xoffset=0 yoffset=20 xadvance=12 page=0 chnl=15
+char id=304 x=242 y=133 width=5 height=41 xoffset=3 yoffset=10 xadvance=12 page=0 chnl=15
+char id=308 x=47 y=0 width=16 height=46 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=310 x=24 y=0 width=22 height=46 xoffset=3 yoffset=19 xadvance=26 page=0 chnl=15
+char id=313 x=237 y=0 width=18 height=43 xoffset=3 yoffset=8 xadvance=21 page=0 chnl=15
+char id=315 x=137 y=0 width=18 height=45 xoffset=3 yoffset=20 xadvance=21 page=0 chnl=15
+char id=317 x=46 y=126 width=18 height=32 xoffset=3 yoffset=19 xadvance=22 page=1 chnl=15
+char id=321 x=76 y=157 width=23 height=31 xoffset=-1 yoffset=20 xadvance=21 page=1 chnl=15
+char id=323 x=52 y=92 width=24 height=43 xoffset=3 yoffset=8 xadvance=31 page=0 chnl=15
+char id=325 x=64 y=0 width=24 height=45 xoffset=3 yoffset=20 xadvance=31 page=0 chnl=15
+char id=327 x=156 y=178 width=24 height=42 xoffset=3 yoffset=9 xadvance=31 page=0 chnl=15
+char id=330 x=106 y=43 width=24 height=41 xoffset=3 yoffset=20 xadvance=31 page=1 chnl=15
+char id=332 x=27 y=43 width=26 height=41 xoffset=2 yoffset=11 xadvance=29 page=1 chnl=15
+char id=334 x=198 y=45 width=26 height=43 xoffset=2 yoffset=9 xadvance=29 page=0 chnl=15
+char id=336 x=183 y=0 width=26 height=44 xoffset=2 yoffset=8 xadvance=29 page=0 chnl=15
+char id=338 x=216 y=219 width=38 height=33 xoffset=2 yoffset=19 xadvance=41 page=0 chnl=15
+char id=340 x=197 y=89 width=23 height=43 xoffset=3 yoffset=8 xadvance=28 page=0 chnl=15
+char id=342 x=89 y=0 width=23 height=45 xoffset=3 yoffset=20 xadvance=28 page=0 chnl=15
+char id=344 x=24 y=0 width=23 height=42 xoffset=3 yoffset=9 xadvance=28 page=1 chnl=15
+char id=346 x=72 y=46 width=22 height=44 xoffset=1 yoffset=8 xadvance=24 page=0 chnl=15
+char id=348 x=0 y=136 width=22 height=43 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15
+char id=350 x=23 y=136 width=22 height=43 xoffset=1 yoffset=19 xadvance=24 page=0 chnl=15
+char id=352 x=221 y=89 width=22 height=43 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15
+char id=356 x=0 y=0 width=23 height=42 xoffset=0 yoffset=9 xadvance=23 page=1 chnl=15
+char id=358 x=148 y=151 width=23 height=31 xoffset=0 yoffset=20 xadvance=24 page=1 chnl=15
+char id=360 x=125 y=90 width=23 height=43 xoffset=3 yoffset=9 xadvance=29 page=0 chnl=15
+char id=362 x=131 y=43 width=23 height=41 xoffset=3 yoffset=11 xadvance=29 page=1 chnl=15
+char id=364 x=77 y=91 width=23 height=43 xoffset=3 yoffset=9 xadvance=29 page=0 chnl=15
+char id=366 x=113 y=0 width=23 height=45 xoffset=3 yoffset=7 xadvance=29 page=0 chnl=15
+char id=368 x=24 y=47 width=23 height=44 xoffset=3 yoffset=8 xadvance=29 page=0 chnl=15
+char id=370 x=232 y=0 width=23 height=41 xoffset=3 yoffset=20 xadvance=29 page=1 chnl=15
+char id=372 x=202 y=133 width=39 height=42 xoffset=1 yoffset=9 xadvance=41 page=0 chnl=15
+char id=374 x=105 y=179 width=25 height=42 xoffset=0 yoffset=9 xadvance=24 page=0 chnl=15
+char id=376 x=80 y=43 width=25 height=41 xoffset=0 yoffset=10 xadvance=24 page=1 chnl=15
+char id=377 x=112 y=135 width=21 height=43 xoffset=1 yoffset=8 xadvance=24 page=0 chnl=15
+char id=379 x=155 y=43 width=21 height=41 xoffset=1 yoffset=10 xadvance=24 page=1 chnl=15
+char id=381 x=72 y=0 width=21 height=42 xoffset=1 yoffset=9 xadvance=24 page=1 chnl=15
+kernings count=553
+kerning first=65 second=86 amount=-1
+kerning first=376 second=308 amount=-1
+kerning first=376 second=74 amount=-1
+kerning first=376 second=260 amount=-2
+kerning first=376 second=258 amount=-2
+kerning first=376 second=256 amount=-2
+kerning first=66 second=89 amount=-1
+kerning first=376 second=197 amount=-2
+kerning first=376 second=196 amount=-2
+kerning first=376 second=195 amount=-2
+kerning first=376 second=194 amount=-2
+kerning first=376 second=193 amount=-2
+kerning first=376 second=192 amount=-2
+kerning first=376 second=65 amount=-2
+kerning first=66 second=221 amount=-1
+kerning first=376 second=352 amount=-1
+kerning first=376 second=350 amount=-1
+kerning first=376 second=348 amount=-1
+kerning first=376 second=346 amount=-1
+kerning first=376 second=83 amount=-1
+kerning first=376 second=338 amount=-1
+kerning first=66 second=374 amount=-1
+kerning first=66 second=376 amount=-1
+kerning first=376 second=336 amount=-1
+kerning first=68 second=88 amount=-1
+kerning first=376 second=334 amount=-1
+kerning first=70 second=65 amount=-1
+kerning first=376 second=332 amount=-1
+kerning first=70 second=192 amount=-1
+kerning first=70 second=193 amount=-1
+kerning first=70 second=194 amount=-1
+kerning first=70 second=195 amount=-1
+kerning first=70 second=196 amount=-1
+kerning first=70 second=197 amount=-1
+kerning first=70 second=198 amount=-1
+kerning first=70 second=256 amount=-1
+kerning first=70 second=258 amount=-1
+kerning first=70 second=260 amount=-1
+kerning first=376 second=290 amount=-1
+kerning first=376 second=288 amount=-1
+kerning first=76 second=86 amount=-2
+kerning first=376 second=286 amount=-1
+kerning first=79 second=88 amount=-1
+kerning first=376 second=284 amount=-1
+kerning first=80 second=65 amount=-1
+kerning first=376 second=216 amount=-1
+kerning first=376 second=214 amount=-1
+kerning first=80 second=88 amount=-1
+kerning first=80 second=89 amount=-1
+kerning first=80 second=192 amount=-1
+kerning first=80 second=193 amount=-1
+kerning first=80 second=194 amount=-1
+kerning first=80 second=195 amount=-1
+kerning first=80 second=196 amount=-1
+kerning first=80 second=197 amount=-1
+kerning first=80 second=198 amount=-1
+kerning first=80 second=221 amount=-1
+kerning first=80 second=256 amount=-1
+kerning first=80 second=258 amount=-1
+kerning first=80 second=260 amount=-1
+kerning first=376 second=213 amount=-1
+kerning first=80 second=374 amount=-1
+kerning first=80 second=376 amount=-1
+kerning first=376 second=212 amount=-1
+kerning first=81 second=88 amount=-1
+kerning first=376 second=211 amount=-1
+kerning first=376 second=210 amount=-1
+kerning first=376 second=81 amount=-1
+kerning first=376 second=79 amount=-1
+kerning first=376 second=71 amount=-1
+kerning first=84 second=198 amount=-2
+kerning first=376 second=268 amount=-1
+kerning first=86 second=65 amount=-1
+kerning first=376 second=266 amount=-1
+kerning first=376 second=264 amount=-1
+kerning first=86 second=74 amount=-1
+kerning first=376 second=262 amount=-1
+kerning first=376 second=199 amount=-1
+kerning first=376 second=67 amount=-1
+kerning first=86 second=192 amount=-1
+kerning first=86 second=193 amount=-1
+kerning first=86 second=194 amount=-1
+kerning first=86 second=195 amount=-1
+kerning first=86 second=196 amount=-1
+kerning first=86 second=197 amount=-1
+kerning first=86 second=198 amount=-1
+kerning first=374 second=308 amount=-1
+kerning first=374 second=74 amount=-1
+kerning first=374 second=260 amount=-2
+kerning first=374 second=258 amount=-2
+kerning first=374 second=256 amount=-2
+kerning first=374 second=197 amount=-2
+kerning first=374 second=196 amount=-2
+kerning first=86 second=256 amount=-1
+kerning first=86 second=258 amount=-1
+kerning first=86 second=260 amount=-1
+kerning first=374 second=195 amount=-2
+kerning first=374 second=194 amount=-2
+kerning first=374 second=193 amount=-2
+kerning first=374 second=192 amount=-2
+kerning first=374 second=65 amount=-2
+kerning first=374 second=352 amount=-1
+kerning first=374 second=350 amount=-1
+kerning first=374 second=348 amount=-1
+kerning first=86 second=308 amount=-1
+kerning first=374 second=346 amount=-1
+kerning first=374 second=83 amount=-1
+kerning first=374 second=338 amount=-1
+kerning first=374 second=336 amount=-1
+kerning first=374 second=334 amount=-1
+kerning first=374 second=332 amount=-1
+kerning first=374 second=290 amount=-1
+kerning first=374 second=288 amount=-1
+kerning first=87 second=198 amount=-1
+kerning first=88 second=67 amount=-1
+kerning first=88 second=71 amount=-1
+kerning first=88 second=79 amount=-1
+kerning first=88 second=81 amount=-1
+kerning first=88 second=199 amount=-1
+kerning first=88 second=210 amount=-1
+kerning first=88 second=211 amount=-1
+kerning first=88 second=212 amount=-1
+kerning first=88 second=213 amount=-1
+kerning first=88 second=214 amount=-1
+kerning first=88 second=216 amount=-1
+kerning first=88 second=262 amount=-1
+kerning first=88 second=264 amount=-1
+kerning first=88 second=266 amount=-1
+kerning first=88 second=268 amount=-1
+kerning first=88 second=284 amount=-1
+kerning first=88 second=286 amount=-1
+kerning first=88 second=288 amount=-1
+kerning first=88 second=290 amount=-1
+kerning first=88 second=332 amount=-1
+kerning first=88 second=334 amount=-1
+kerning first=88 second=336 amount=-1
+kerning first=88 second=338 amount=-1
+kerning first=89 second=198 amount=-2
+kerning first=374 second=286 amount=-1
+kerning first=192 second=86 amount=-1
+kerning first=193 second=86 amount=-1
+kerning first=194 second=86 amount=-1
+kerning first=195 second=86 amount=-1
+kerning first=196 second=86 amount=-1
+kerning first=197 second=86 amount=-1
+kerning first=374 second=284 amount=-1
+kerning first=208 second=88 amount=-1
+kerning first=374 second=216 amount=-1
+kerning first=374 second=214 amount=-1
+kerning first=210 second=88 amount=-1
+kerning first=374 second=213 amount=-1
+kerning first=374 second=212 amount=-1
+kerning first=211 second=88 amount=-1
+kerning first=374 second=211 amount=-1
+kerning first=374 second=210 amount=-1
+kerning first=212 second=88 amount=-1
+kerning first=374 second=81 amount=-1
+kerning first=374 second=79 amount=-1
+kerning first=213 second=88 amount=-1
+kerning first=374 second=71 amount=-1
+kerning first=374 second=268 amount=-1
+kerning first=214 second=88 amount=-1
+kerning first=374 second=266 amount=-1
+kerning first=374 second=264 amount=-1
+kerning first=216 second=88 amount=-1
+kerning first=374 second=262 amount=-1
+kerning first=374 second=199 amount=-1
+kerning first=374 second=67 amount=-1
+kerning first=372 second=260 amount=-1
+kerning first=372 second=258 amount=-1
+kerning first=221 second=198 amount=-2
+kerning first=372 second=256 amount=-1
+kerning first=372 second=197 amount=-1
+kerning first=372 second=196 amount=-1
+kerning first=222 second=84 amount=-1
+kerning first=372 second=195 amount=-1
+kerning first=372 second=194 amount=-1
+kerning first=222 second=88 amount=-1
+kerning first=222 second=89 amount=-1
+kerning first=372 second=193 amount=-1
+kerning first=372 second=192 amount=-1
+kerning first=372 second=65 amount=-1
+kerning first=358 second=260 amount=-2
+kerning first=358 second=258 amount=-2
+kerning first=358 second=256 amount=-2
+kerning first=358 second=197 amount=-2
+kerning first=222 second=198 amount=-1
+kerning first=222 second=221 amount=-1
+kerning first=358 second=196 amount=-2
+kerning first=358 second=195 amount=-2
+kerning first=358 second=194 amount=-2
+kerning first=358 second=193 amount=-2
+kerning first=222 second=356 amount=-1
+kerning first=222 second=358 amount=-1
+kerning first=358 second=192 amount=-2
+kerning first=222 second=374 amount=-1
+kerning first=222 second=376 amount=-1
+kerning first=358 second=65 amount=-2
+kerning first=356 second=260 amount=-2
+kerning first=356 second=258 amount=-2
+kerning first=356 second=256 amount=-2
+kerning first=223 second=84 amount=-1
+kerning first=223 second=86 amount=-1
+kerning first=356 second=197 amount=-2
+kerning first=223 second=89 amount=-1
+kerning first=223 second=221 amount=-1
+kerning first=356 second=196 amount=-2
+kerning first=223 second=356 amount=-1
+kerning first=223 second=358 amount=-1
+kerning first=356 second=195 amount=-2
+kerning first=223 second=374 amount=-1
+kerning first=223 second=376 amount=-1
+kerning first=256 second=86 amount=-1
+kerning first=258 second=86 amount=-1
+kerning first=260 second=86 amount=-1
+kerning first=356 second=194 amount=-2
+kerning first=270 second=88 amount=-1
+kerning first=356 second=193 amount=-2
+kerning first=356 second=192 amount=-2
+kerning first=272 second=88 amount=-1
+kerning first=356 second=65 amount=-2
+kerning first=344 second=376 amount=-1
+kerning first=344 second=374 amount=-1
+kerning first=344 second=221 amount=-1
+kerning first=344 second=89 amount=-1
+kerning first=313 second=86 amount=-2
+kerning first=315 second=86 amount=-2
+kerning first=317 second=84 amount=-1
+kerning first=317 second=86 amount=-1
+kerning first=317 second=87 amount=-1
+kerning first=317 second=89 amount=-1
+kerning first=317 second=221 amount=-1
+kerning first=317 second=356 amount=-1
+kerning first=317 second=358 amount=-1
+kerning first=317 second=372 amount=-1
+kerning first=317 second=374 amount=-1
+kerning first=317 second=376 amount=-1
+kerning first=321 second=86 amount=-2
+kerning first=342 second=376 amount=-1
+kerning first=332 second=88 amount=-1
+kerning first=342 second=374 amount=-1
+kerning first=342 second=221 amount=-1
+kerning first=334 second=88 amount=-1
+kerning first=342 second=89 amount=-1
+kerning first=340 second=376 amount=-1
+kerning first=336 second=88 amount=-1
+kerning first=340 second=374 amount=-1
+kerning first=340 second=221 amount=-1
+kerning first=340 second=89 amount=-1
+kerning first=336 second=376 amount=-1
+kerning first=336 second=374 amount=-1
+kerning first=336 second=221 amount=-1
+kerning first=336 second=89 amount=-1
+kerning first=334 second=376 amount=-1
+kerning first=334 second=374 amount=-1
+kerning first=334 second=221 amount=-1
+kerning first=334 second=89 amount=-1
+kerning first=332 second=376 amount=-1
+kerning first=332 second=374 amount=-1
+kerning first=332 second=221 amount=-1
+kerning first=332 second=89 amount=-1
+kerning first=356 second=198 amount=-2
+kerning first=358 second=198 amount=-2
+kerning first=321 second=376 amount=-4
+kerning first=321 second=374 amount=-4
+kerning first=321 second=221 amount=-4
+kerning first=321 second=89 amount=-4
+kerning first=321 second=372 amount=-2
+kerning first=321 second=87 amount=-2
+kerning first=372 second=198 amount=-1
+kerning first=374 second=198 amount=-2
+kerning first=321 second=358 amount=-4
+kerning first=376 second=198 amount=-2
+kerning first=321 second=356 amount=-4
+kerning first=321 second=84 amount=-4
+kerning first=317 second=376 amount=-4
+kerning first=317 second=374 amount=-4
+kerning first=317 second=221 amount=-4
+kerning first=317 second=89 amount=-4
+kerning first=317 second=372 amount=-2
+kerning first=317 second=87 amount=-2
+kerning first=317 second=358 amount=-4
+kerning first=317 second=356 amount=-4
+kerning first=317 second=84 amount=-4
+kerning first=315 second=376 amount=-4
+kerning first=315 second=374 amount=-4
+kerning first=315 second=221 amount=-4
+kerning first=315 second=89 amount=-4
+kerning first=315 second=372 amount=-2
+kerning first=315 second=87 amount=-2
+kerning first=315 second=358 amount=-4
+kerning first=315 second=356 amount=-4
+kerning first=315 second=84 amount=-4
+kerning first=313 second=376 amount=-4
+kerning first=313 second=374 amount=-4
+kerning first=313 second=221 amount=-4
+kerning first=313 second=89 amount=-4
+kerning first=313 second=372 amount=-2
+kerning first=313 second=87 amount=-2
+kerning first=313 second=358 amount=-4
+kerning first=313 second=356 amount=-4
+kerning first=313 second=84 amount=-4
+kerning first=65 second=84 amount=-2
+kerning first=65 second=356 amount=-2
+kerning first=65 second=358 amount=-2
+kerning first=272 second=376 amount=-1
+kerning first=272 second=374 amount=-1
+kerning first=272 second=221 amount=-1
+kerning first=272 second=89 amount=-1
+kerning first=270 second=376 amount=-1
+kerning first=270 second=374 amount=-1
+kerning first=270 second=221 amount=-1
+kerning first=270 second=89 amount=-1
+kerning first=260 second=376 amount=-2
+kerning first=260 second=374 amount=-2
+kerning first=260 second=221 amount=-2
+kerning first=65 second=87 amount=-1
+kerning first=65 second=372 amount=-1
+kerning first=65 second=89 amount=-2
+kerning first=65 second=221 amount=-2
+kerning first=65 second=374 amount=-2
+kerning first=65 second=376 amount=-2
+kerning first=260 second=89 amount=-2
+kerning first=260 second=372 amount=-1
+kerning first=260 second=87 amount=-1
+kerning first=260 second=358 amount=-2
+kerning first=260 second=356 amount=-2
+kerning first=260 second=84 amount=-2
+kerning first=258 second=376 amount=-2
+kerning first=258 second=374 amount=-2
+kerning first=258 second=221 amount=-2
+kerning first=258 second=89 amount=-2
+kerning first=258 second=372 amount=-1
+kerning first=258 second=87 amount=-1
+kerning first=258 second=358 amount=-2
+kerning first=258 second=356 amount=-2
+kerning first=258 second=84 amount=-2
+kerning first=256 second=376 amount=-2
+kerning first=256 second=374 amount=-2
+kerning first=256 second=221 amount=-2
+kerning first=256 second=89 amount=-2
+kerning first=256 second=372 amount=-1
+kerning first=68 second=89 amount=-1
+kerning first=68 second=221 amount=-1
+kerning first=68 second=374 amount=-1
+kerning first=68 second=376 amount=-1
+kerning first=256 second=87 amount=-1
+kerning first=256 second=358 amount=-2
+kerning first=256 second=356 amount=-2
+kerning first=256 second=84 amount=-2
+kerning first=221 second=308 amount=-1
+kerning first=221 second=74 amount=-1
+kerning first=221 second=260 amount=-2
+kerning first=221 second=258 amount=-2
+kerning first=221 second=256 amount=-2
+kerning first=221 second=197 amount=-2
+kerning first=221 second=196 amount=-2
+kerning first=221 second=195 amount=-2
+kerning first=221 second=194 amount=-2
+kerning first=221 second=193 amount=-2
+kerning first=221 second=192 amount=-2
+kerning first=221 second=65 amount=-2
+kerning first=221 second=352 amount=-1
+kerning first=221 second=350 amount=-1
+kerning first=221 second=348 amount=-1
+kerning first=221 second=346 amount=-1
+kerning first=221 second=83 amount=-1
+kerning first=221 second=338 amount=-1
+kerning first=221 second=336 amount=-1
+kerning first=221 second=334 amount=-1
+kerning first=221 second=332 amount=-1
+kerning first=221 second=290 amount=-1
+kerning first=221 second=288 amount=-1
+kerning first=221 second=286 amount=-1
+kerning first=221 second=284 amount=-1
+kerning first=221 second=216 amount=-1
+kerning first=221 second=214 amount=-1
+kerning first=221 second=213 amount=-1
+kerning first=221 second=212 amount=-1
+kerning first=221 second=211 amount=-1
+kerning first=221 second=210 amount=-1
+kerning first=221 second=81 amount=-1
+kerning first=221 second=79 amount=-1
+kerning first=221 second=71 amount=-1
+kerning first=221 second=268 amount=-1
+kerning first=221 second=266 amount=-1
+kerning first=221 second=264 amount=-1
+kerning first=221 second=262 amount=-1
+kerning first=221 second=199 amount=-1
+kerning first=221 second=67 amount=-1
+kerning first=216 second=376 amount=-1
+kerning first=216 second=374 amount=-1
+kerning first=216 second=221 amount=-1
+kerning first=216 second=89 amount=-1
+kerning first=214 second=376 amount=-1
+kerning first=214 second=374 amount=-1
+kerning first=214 second=221 amount=-1
+kerning first=214 second=89 amount=-1
+kerning first=213 second=376 amount=-1
+kerning first=213 second=374 amount=-1
+kerning first=213 second=221 amount=-1
+kerning first=213 second=89 amount=-1
+kerning first=212 second=376 amount=-1
+kerning first=212 second=374 amount=-1
+kerning first=212 second=221 amount=-1
+kerning first=212 second=89 amount=-1
+kerning first=211 second=376 amount=-1
+kerning first=211 second=374 amount=-1
+kerning first=211 second=221 amount=-1
+kerning first=211 second=89 amount=-1
+kerning first=210 second=376 amount=-1
+kerning first=210 second=374 amount=-1
+kerning first=210 second=221 amount=-1
+kerning first=210 second=89 amount=-1
+kerning first=208 second=376 amount=-1
+kerning first=208 second=374 amount=-1
+kerning first=208 second=221 amount=-1
+kerning first=208 second=89 amount=-1
+kerning first=197 second=376 amount=-2
+kerning first=197 second=374 amount=-2
+kerning first=197 second=221 amount=-2
+kerning first=197 second=89 amount=-2
+kerning first=197 second=372 amount=-1
+kerning first=197 second=87 amount=-1
+kerning first=197 second=358 amount=-2
+kerning first=197 second=356 amount=-2
+kerning first=197 second=84 amount=-2
+kerning first=196 second=376 amount=-2
+kerning first=196 second=374 amount=-2
+kerning first=196 second=221 amount=-2
+kerning first=196 second=89 amount=-2
+kerning first=76 second=84 amount=-4
+kerning first=76 second=356 amount=-4
+kerning first=76 second=358 amount=-4
+kerning first=196 second=372 amount=-1
+kerning first=196 second=87 amount=-1
+kerning first=196 second=358 amount=-2
+kerning first=196 second=356 amount=-2
+kerning first=196 second=84 amount=-2
+kerning first=195 second=376 amount=-2
+kerning first=195 second=374 amount=-2
+kerning first=195 second=221 amount=-2
+kerning first=195 second=89 amount=-2
+kerning first=195 second=372 amount=-1
+kerning first=195 second=87 amount=-1
+kerning first=76 second=87 amount=-2
+kerning first=76 second=372 amount=-2
+kerning first=76 second=89 amount=-4
+kerning first=76 second=221 amount=-4
+kerning first=76 second=374 amount=-4
+kerning first=76 second=376 amount=-4
+kerning first=195 second=358 amount=-2
+kerning first=195 second=356 amount=-2
+kerning first=195 second=84 amount=-2
+kerning first=79 second=89 amount=-1
+kerning first=79 second=221 amount=-1
+kerning first=79 second=374 amount=-1
+kerning first=79 second=376 amount=-1
+kerning first=194 second=376 amount=-2
+kerning first=194 second=374 amount=-2
+kerning first=194 second=221 amount=-2
+kerning first=194 second=89 amount=-2
+kerning first=194 second=372 amount=-1
+kerning first=194 second=87 amount=-1
+kerning first=194 second=358 amount=-2
+kerning first=194 second=356 amount=-2
+kerning first=194 second=84 amount=-2
+kerning first=193 second=376 amount=-2
+kerning first=193 second=374 amount=-2
+kerning first=193 second=221 amount=-2
+kerning first=193 second=89 amount=-2
+kerning first=193 second=372 amount=-1
+kerning first=193 second=87 amount=-1
+kerning first=81 second=89 amount=-1
+kerning first=81 second=221 amount=-1
+kerning first=81 second=374 amount=-1
+kerning first=81 second=376 amount=-1
+kerning first=193 second=358 amount=-2
+kerning first=193 second=356 amount=-2
+kerning first=193 second=84 amount=-2
+kerning first=192 second=376 amount=-2
+kerning first=192 second=374 amount=-2
+kerning first=192 second=221 amount=-2
+kerning first=192 second=89 amount=-2
+kerning first=192 second=372 amount=-1
+kerning first=192 second=87 amount=-1
+kerning first=192 second=358 amount=-2
+kerning first=192 second=356 amount=-2
+kerning first=192 second=84 amount=-2
+kerning first=82 second=89 amount=-1
+kerning first=82 second=221 amount=-1
+kerning first=82 second=374 amount=-1
+kerning first=82 second=376 amount=-1
+kerning first=89 second=308 amount=-1
+kerning first=89 second=74 amount=-1
+kerning first=89 second=260 amount=-2
+kerning first=89 second=258 amount=-2
+kerning first=89 second=256 amount=-2
+kerning first=89 second=197 amount=-2
+kerning first=89 second=196 amount=-2
+kerning first=89 second=195 amount=-2
+kerning first=89 second=194 amount=-2
+kerning first=89 second=193 amount=-2
+kerning first=89 second=192 amount=-2
+kerning first=89 second=65 amount=-2
+kerning first=89 second=352 amount=-1
+kerning first=89 second=350 amount=-1
+kerning first=89 second=348 amount=-1
+kerning first=89 second=346 amount=-1
+kerning first=89 second=83 amount=-1
+kerning first=89 second=338 amount=-1
+kerning first=89 second=336 amount=-1
+kerning first=89 second=334 amount=-1
+kerning first=89 second=332 amount=-1
+kerning first=89 second=290 amount=-1
+kerning first=89 second=288 amount=-1
+kerning first=89 second=286 amount=-1
+kerning first=89 second=284 amount=-1
+kerning first=89 second=216 amount=-1
+kerning first=89 second=214 amount=-1
+kerning first=89 second=213 amount=-1
+kerning first=89 second=212 amount=-1
+kerning first=89 second=211 amount=-1
+kerning first=89 second=210 amount=-1
+kerning first=89 second=81 amount=-1
+kerning first=89 second=79 amount=-1
+kerning first=89 second=71 amount=-1
+kerning first=89 second=268 amount=-1
+kerning first=89 second=266 amount=-1
+kerning first=89 second=264 amount=-1
+kerning first=89 second=262 amount=-1
+kerning first=89 second=199 amount=-1
+kerning first=89 second=67 amount=-1
+kerning first=87 second=260 amount=-1
+kerning first=87 second=258 amount=-1
+kerning first=87 second=256 amount=-1
+kerning first=87 second=197 amount=-1
+kerning first=87 second=196 amount=-1
+kerning first=87 second=195 amount=-1
+kerning first=87 second=194 amount=-1
+kerning first=87 second=193 amount=-1
+kerning first=87 second=192 amount=-1
+kerning first=84 second=65 amount=-2
+kerning first=84 second=192 amount=-2
+kerning first=84 second=193 amount=-2
+kerning first=84 second=194 amount=-2
+kerning first=84 second=195 amount=-2
+kerning first=84 second=196 amount=-2
+kerning first=84 second=197 amount=-2
+kerning first=84 second=256 amount=-2
+kerning first=84 second=258 amount=-2
+kerning first=84 second=260 amount=-2
+kerning first=87 second=65 amount=-1
diff --git a/resources-rectangle-448x486/fonts/titillium-web-semibold-45_0.png b/resources-rectangle-448x486/fonts/titillium-web-semibold-45_0.png
new file mode 100644
index 00000000..5417286f
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-semibold-45_0.png differ
diff --git a/resources-rectangle-448x486/fonts/titillium-web-semibold-45_1.png b/resources-rectangle-448x486/fonts/titillium-web-semibold-45_1.png
new file mode 100644
index 00000000..96a819a1
Binary files /dev/null and b/resources-rectangle-448x486/fonts/titillium-web-semibold-45_1.png differ
diff --git a/resources-rectangle-448x486/layouts/layout.xml b/resources-rectangle-448x486/layouts/layout.xml
new file mode 100644
index 00000000..744ee6a7
--- /dev/null
+++ b/resources-rectangle-448x486/layouts/layout.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+ :left
+ 12
+ 486
+ 3
+
+
+
+ :right
+ 12
+ 486
+ 3
+
+
+
+ 91
+ 265
+ 352
+ 385
+ 417
+ 450
+ 409
+ 41
+ 407
+
+
+
+ 122
+ 328
+ 41
+ 72
+ 52
+
+
+
+ 140
+
+
+
+ 45
+ 255
+ 65
+ 38
+
+
+
+ 3
+ 345
+ 276
+ 11
+
+
+
+ 74
+ 356
+ 290
+ 23
+ 6
+
+
+
+
+
+
+ [-77, -39, 39, 77]
+ -3
+ 207
+ 270
+
+ 302
+
+ 304
+ 91
+
+
+
diff --git a/resources-round-208x208/fonts/fonts.xml b/resources-round-208x208/fonts/fonts.xml
index 5583da69..7fc6ca69 100644
--- a/resources-round-208x208/fonts/fonts.xml
+++ b/resources-round-208x208/fonts/fonts.xml
@@ -2,9 +2,9 @@
-
+
-
+
diff --git a/resources-round-208x208/layouts/layout.xml b/resources-round-208x208/layouts/layout.xml
index 2f91f9d9..49c4a2d4 100644
--- a/resources-round-208x208/layouts/layout.xml
+++ b/resources-round-208x208/layouts/layout.xml
@@ -23,6 +23,8 @@
63
81
+ 139
+ 152
165
181
163
diff --git a/resources-round-208x208/settings/settings.xml b/resources-round-208x208/settings/settings.xml
index 4ea9fbcc..260d467c 100644
--- a/resources-round-208x208/settings/settings.xml
+++ b/resources-round-208x208/settings/settings.xml
@@ -30,7 +30,7 @@
@Strings.Battery
@Strings.CaloriesManualGoal
- @Strings.Off
+ @Strings.Off
@@ -42,7 +42,7 @@
@Strings.Battery
@Strings.CaloriesManualGoal
- @Strings.Off
+ @Strings.Off
diff --git a/resources-round-218x218-ciq_1.x/layouts/layout.xml b/resources-round-218x218-ciq_1.x/layouts/layout.xml
deleted file mode 100644
index 84ee8b09..00000000
--- a/resources-round-218x218-ciq_1.x/layouts/layout.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
- :left
- 8
- 138
- 2
-
-
-
- :right
- 8
- 138
- 2
-
-
-
-
- 8
-
-
-
- 67
- 84
- 170
- 186
- 166
- 40
- 178
-
-
-
- 69
- 149
- 24
- 45
- 28
-
-
-
- 69
-
-
-
- 30
- 109
- 30
- 22
-
-
-
- 149
- 129
-
-
-
-
-
-
-
-
- 49
- 146
- 94
- 9
- 3
-
-
-
\ No newline at end of file
diff --git a/resources-round-218x218/layouts/layout.xml b/resources-round-218x218/layouts/layout.xml
index 5e8978c5..b2c18944 100644
--- a/resources-round-218x218/layouts/layout.xml
+++ b/resources-round-218x218/layouts/layout.xml
@@ -18,6 +18,8 @@
67
84
+ 144
+ 157
170
186
166
diff --git a/resources-round-260x260/fonts/fonts.xml b/resources-round-260x260/fonts/fonts.xml
index 42f35466..1e25cc54 100644
--- a/resources-round-260x260/fonts/fonts.xml
+++ b/resources-round-260x260/fonts/fonts.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/resources-round-260x260/fonts/titillium-web-bold-74-tall.bmfc b/resources-round-260x260/fonts/titillium-web-bold-74-tall.bmfc
index af96e3a9..64b5ad9d 100644
--- a/resources-round-260x260/fonts/titillium-web-bold-74-tall.bmfc
+++ b/resources-round-260x260/fonts/titillium-web-bold-74-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
diff --git a/resources-round-260x260/fonts/titillium-web-light-74-tall.bmfc b/resources-round-260x260/fonts/titillium-web-light-74-tall.bmfc
index 39ec74f8..638412d9 100644
--- a/resources-round-260x260/fonts/titillium-web-light-74-tall.bmfc
+++ b/resources-round-260x260/fonts/titillium-web-light-74-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,6 +54,6 @@ invB=0
outlineThickness=0
# selected chars
-chars=48-57
+chars=48-58
# imported icon images
diff --git a/resources-round-260x260/fonts/titillium-web-light-74-tall.fnt b/resources-round-260x260/fonts/titillium-web-light-74-tall.fnt
index 6d98c518..1e9b0b08 100644
--- a/resources-round-260x260/fonts/titillium-web-light-74-tall.fnt
+++ b/resources-round-260x260/fonts/titillium-web-light-74-tall.fnt
@@ -1,7 +1,7 @@
info face="Titillium Web Light" size=-74 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=119 base=89 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-light-74-tall_0.png"
-chars count=10
+chars count=11
char id=48 x=38 y=0 width=36 height=54 xoffset=3 yoffset=35 xadvance=41 page=0 chnl=15
char id=49 x=69 y=55 width=21 height=52 xoffset=8 yoffset=36 xadvance=41 page=0 chnl=15
char id=50 x=214 y=0 width=32 height=53 xoffset=5 yoffset=35 xadvance=41 page=0 chnl=15
@@ -12,3 +12,4 @@ char id=54 x=111 y=0 width=34 height=54 xoffset=4 yoffset=35
char id=55 x=0 y=55 width=31 height=53 xoffset=5 yoffset=36 xadvance=41 page=0 chnl=15
char id=56 x=0 y=0 width=37 height=54 xoffset=2 yoffset=35 xadvance=41 page=0 chnl=15
char id=57 x=75 y=0 width=35 height=54 xoffset=3 yoffset=35 xadvance=41 page=0 chnl=15
+char id=58 x=247 y=0 width=5 height=34 xoffset=5 yoffset=54 xadvance=15 page=0 chnl=15
diff --git a/resources-round-260x260/fonts/titillium-web-light-74-tall_0.png b/resources-round-260x260/fonts/titillium-web-light-74-tall_0.png
index ad55f660..c1a84b27 100644
Binary files a/resources-round-260x260/fonts/titillium-web-light-74-tall_0.png and b/resources-round-260x260/fonts/titillium-web-light-74-tall_0.png differ
diff --git a/resources-round-260x260/layouts/layout.xml b/resources-round-260x260/layouts/layout.xml
index 53bb4eda..faa22cc6 100644
--- a/resources-round-260x260/layouts/layout.xml
+++ b/resources-round-260x260/layouts/layout.xml
@@ -18,6 +18,8 @@
85
90
+ 180
+ 196
212
228
208
diff --git a/resources-round-280x280/fonts/crystal-icons-large.fnt b/resources-round-280x280/fonts/crystal-icons-large.fnt
index 3fc6ac62..57e72afe 100644
--- a/resources-round-280x280/fonts/crystal-icons-large.fnt
+++ b/resources-round-280x280/fonts/crystal-icons-large.fnt
@@ -1,7 +1,7 @@
info face="Crystal Icons" size=-28 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=28 base=28 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="crystal-icons-large.png"
-chars count=17
+chars count=24
char id=48 x=0 y=0 width=25 height=28 xoffset=0 yoffset=0 xadvance=25 page=0 chnl=15
char id=49 x=25 y=0 width=28 height=28 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=15
char id=50 x=53 y=0 width=28 height=28 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=15
@@ -18,4 +18,11 @@ char id=61 x=42 y=28 width=7 height=7 xoffset=0 yoffset=10
char id=62 x=49 y=28 width=32 height=28 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15
char id=63 x=81 y=28 width=32 height=28 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15
char id=64 x=113 y=28 width=24 height=28 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
-char id=65 x=137 y=28 width=19 height=28 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15
\ No newline at end of file
+char id=65 x=137 y=28 width=19 height=28 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15
+char id=66 x=158 y=28 width=28 height=25 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=15
+char id=67 x=186 y=28 width=26 height=25 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15
+char id=68 x=213 y=28 width=28 height=28 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15
+char id=69 x=0 y=56 width=24 height=28 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
+char id=70 x=25 y=56 width=20 height=28 xoffset=0 yoffset=0 xadvance=20 page=0 chnl=15
+char id=71 x=45 y=56 width=25 height=28 xoffset=0 yoffset=0 xadvance=25 page=0 chnl=15
+char id=72 x=70 y=56 width=17 height=28 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15
\ No newline at end of file
diff --git a/resources-round-280x280/fonts/crystal-icons-large.png b/resources-round-280x280/fonts/crystal-icons-large.png
index c8626ea6..890a15c2 100644
Binary files a/resources-round-280x280/fonts/crystal-icons-large.png and b/resources-round-280x280/fonts/crystal-icons-large.png differ
diff --git a/resources-round-280x280/fonts/fonts.xml b/resources-round-280x280/fonts/fonts.xml
index 497b4c78..23121099 100644
--- a/resources-round-280x280/fonts/fonts.xml
+++ b/resources-round-280x280/fonts/fonts.xml
@@ -2,9 +2,9 @@
-
-
-
+
+
+
diff --git a/resources-round-280x280/fonts/titillium-web-bold-80-tall.bmfc b/resources-round-280x280/fonts/titillium-web-bold-80-tall.bmfc
index f7ea5091..a9cff5ae 100644
--- a/resources-round-280x280/fonts/titillium-web-bold-80-tall.bmfc
+++ b/resources-round-280x280/fonts/titillium-web-bold-80-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
diff --git a/resources-round-280x280/fonts/titillium-web-light-80-tall.bmfc b/resources-round-280x280/fonts/titillium-web-light-80-tall.bmfc
index 07c3eb7a..68d1a1af 100644
--- a/resources-round-280x280/fonts/titillium-web-light-80-tall.bmfc
+++ b/resources-round-280x280/fonts/titillium-web-light-80-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,6 +54,6 @@ invB=0
outlineThickness=0
# selected chars
-chars=48-57
+chars=48-58
# imported icon images
diff --git a/resources-round-280x280/fonts/titillium-web-light-80-tall.fnt b/resources-round-280x280/fonts/titillium-web-light-80-tall.fnt
index 049b1dfe..b5f9858e 100644
--- a/resources-round-280x280/fonts/titillium-web-light-80-tall.fnt
+++ b/resources-round-280x280/fonts/titillium-web-light-80-tall.fnt
@@ -1,7 +1,7 @@
info face="Titillium Web Light" size=-80 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=129 base=96 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-light-80-tall_0.png"
-chars count=10
+chars count=11
char id=48 x=41 y=0 width=39 height=58 xoffset=3 yoffset=38 xadvance=45 page=0 chnl=15
char id=49 x=231 y=0 width=22 height=56 xoffset=9 yoffset=39 xadvance=45 page=0 chnl=15
char id=50 x=0 y=59 width=35 height=57 xoffset=5 yoffset=38 xadvance=45 page=0 chnl=15
@@ -12,3 +12,4 @@ char id=54 x=120 y=0 width=37 height=58 xoffset=4 yoffset=38
char id=55 x=36 y=59 width=33 height=57 xoffset=6 yoffset=39 xadvance=45 page=0 chnl=15
char id=56 x=0 y=0 width=40 height=58 xoffset=2 yoffset=38 xadvance=45 page=0 chnl=15
char id=57 x=81 y=0 width=38 height=58 xoffset=3 yoffset=38 xadvance=45 page=0 chnl=15
+char id=58 x=110 y=59 width=6 height=37 xoffset=5 yoffset=58 xadvance=17 page=0 chnl=15
diff --git a/resources-round-280x280/fonts/titillium-web-light-80-tall_0.png b/resources-round-280x280/fonts/titillium-web-light-80-tall_0.png
index c35991de..189eede8 100644
Binary files a/resources-round-280x280/fonts/titillium-web-light-80-tall_0.png and b/resources-round-280x280/fonts/titillium-web-light-80-tall_0.png differ
diff --git a/resources-round-280x280/fonts/titillium-web-semibold-28-chars.txt b/resources-round-280x280/fonts/titillium-web-semibold-28-chars.txt
index 7aff41ce..fbae0607 100644
--- a/resources-round-280x280/fonts/titillium-web-semibold-28-chars.txt
+++ b/resources-round-280x280/fonts/titillium-web-semibold-28-chars.txt
@@ -1,5 +1,5 @@
0123456789AP
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÁÄÅÉÍÖØÚČĚŘŚŠŹŽ
AP
-%-.0123456789!:?CFabefgikmpsty°
- %',-.0123456789!:?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz°ÅÍÎÖáãäåæèéíðñóôöøûüž
\ No newline at end of file
+%/-.0123456789!:?CFabefgikmpsty°
+ %/',-.0123456789!:?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz°ÅÍÎÖáãäåæèéíðñóôöøûüž
\ No newline at end of file
diff --git a/resources-round-280x280/fonts/titillium-web-semibold-28.bmfc b/resources-round-280x280/fonts/titillium-web-semibold-28.bmfc
index 833b2af2..c84d33ab 100644
--- a/resources-round-280x280/fonts/titillium-web-semibold-28.bmfc
+++ b/resources-round-280x280/fonts/titillium-web-semibold-28.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=1
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,8 +54,7 @@ invB=0
outlineThickness=0
# selected chars
-chars=32-33,37,39,44-46,48-58,63,65-90,97-122,176,193,196-197,201,205-206,214,216,218,225,227-230,232
-chars=233,237,240-241,243-244,246,248,251-252,268,282,344,346,352,377,381-382,8304,8308-8309,8311-8313
-
+chars=32-33,37,39,43-58,63,65-90,97-122,176,193,196-197,201,205-206,214,216,218-219,225,227-230,232-233
+chars=237,240-241,243-244,246,248,251-252,268,282,344,346,352,377,381-382,8304,8308-8309,8311-8313
# imported icon images
diff --git a/resources-round-280x280/fonts/titillium-web-semibold-28.fnt b/resources-round-280x280/fonts/titillium-web-semibold-28.fnt
index 4fd405ea..56d3046c 100644
--- a/resources-round-280x280/fonts/titillium-web-semibold-28.fnt
+++ b/resources-round-280x280/fonts/titillium-web-semibold-28.fnt
@@ -1,119 +1,360 @@
info face="Titillium Web SemiBold" size=-28 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=43 base=32 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-semibold-28_0.png"
-chars count=111
+chars count=114
char id=32 x=252 y=0 width=3 height=1 xoffset=-1 yoffset=42 xadvance=6 page=0 chnl=15
-char id=33 x=175 y=93 width=5 height=20 xoffset=1 yoffset=12 xadvance=7 page=0 chnl=15
-char id=37 x=0 y=53 width=16 height=21 xoffset=0 yoffset=12 xadvance=16 page=0 chnl=15
-char id=39 x=251 y=107 width=4 height=8 xoffset=1 yoffset=12 xadvance=6 page=0 chnl=15
-char id=44 x=29 y=134 width=6 height=8 xoffset=0 yoffset=28 xadvance=7 page=0 chnl=15
-char id=45 x=36 y=134 width=10 height=3 xoffset=1 yoffset=23 xadvance=12 page=0 chnl=15
-char id=46 x=249 y=44 width=5 height=4 xoffset=1 yoffset=28 xadvance=7 page=0 chnl=15
-char id=48 x=173 y=72 width=16 height=20 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
-char id=49 x=224 y=92 width=10 height=19 xoffset=2 yoffset=13 xadvance=16 page=0 chnl=15
-char id=50 x=209 y=92 width=14 height=19 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
-char id=51 x=91 y=94 width=14 height=20 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
-char id=52 x=193 y=92 width=15 height=19 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
-char id=53 x=76 y=94 width=14 height=20 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
-char id=54 x=190 y=71 width=15 height=20 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
-char id=55 x=134 y=94 width=13 height=20 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
-char id=56 x=156 y=72 width=16 height=20 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
-char id=57 x=206 y=71 width=15 height=20 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
-char id=58 x=209 y=112 width=5 height=13 xoffset=1 yoffset=19 xadvance=7 page=0 chnl=15
-char id=63 x=162 y=93 width=12 height=20 xoffset=0 yoffset=12 xadvance=12 page=0 chnl=15
-char id=65 x=36 y=75 width=17 height=20 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15
-char id=66 x=139 y=72 width=16 height=20 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15
-char id=67 x=126 y=50 width=14 height=21 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
-char id=68 x=122 y=73 width=16 height=20 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
-char id=69 x=61 y=94 width=14 height=20 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
-char id=70 x=46 y=96 width=14 height=20 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
-char id=71 x=50 y=51 width=15 height=21 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15
-char id=72 x=18 y=75 width=17 height=20 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15
-char id=73 x=187 y=93 width=5 height=20 xoffset=1 yoffset=12 xadvance=8 page=0 chnl=15
-char id=74 x=244 y=0 width=7 height=22 xoffset=0 yoffset=12 xadvance=8 page=0 chnl=15
-char id=75 x=222 y=71 width=15 height=20 xoffset=1 yoffset=12 xadvance=16 page=0 chnl=15
-char id=76 x=106 y=94 width=13 height=20 xoffset=1 yoffset=12 xadvance=13 page=0 chnl=15
-char id=77 x=215 y=50 width=21 height=20 xoffset=1 yoffset=12 xadvance=24 page=0 chnl=15
-char id=78 x=237 y=49 width=17 height=20 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15
-char id=79 x=231 y=27 width=17 height=21 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
-char id=80 x=54 y=73 width=16 height=20 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15
-char id=81 x=0 y=28 width=17 height=24 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
-char id=82 x=71 y=73 width=16 height=20 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15
-char id=83 x=34 y=53 width=15 height=21 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
-char id=84 x=238 y=70 width=15 height=20 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
-char id=85 x=17 y=53 width=16 height=21 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
-char id=86 x=0 y=75 width=17 height=20 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15
-char id=87 x=189 y=50 width=25 height=20 xoffset=0 yoffset=12 xadvance=26 page=0 chnl=15
-char id=88 x=88 y=73 width=16 height=20 xoffset=0 yoffset=12 xadvance=16 page=0 chnl=15
-char id=89 x=105 y=73 width=16 height=20 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
-char id=90 x=0 y=96 width=15 height=20 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
-char id=97 x=53 y=117 width=14 height=16 xoffset=0 yoffset=17 xadvance=14 page=0 chnl=15
-char id=98 x=96 y=51 width=14 height=21 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
-char id=99 x=82 y=115 width=12 height=16 xoffset=0 yoffset=17 xadvance=12 page=0 chnl=15
-char id=100 x=111 y=51 width=14 height=21 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
-char id=101 x=38 y=117 width=14 height=16 xoffset=0 yoffset=17 xadvance=14 page=0 chnl=15
-char id=102 x=168 y=50 width=10 height=21 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=15
-char id=103 x=52 y=28 width=15 height=22 xoffset=0 yoffset=17 xadvance=15 page=0 chnl=15
-char id=104 x=148 y=93 width=13 height=20 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
-char id=105 x=249 y=23 width=5 height=20 xoffset=1 yoffset=12 xadvance=7 page=0 chnl=15
-char id=106 x=100 y=0 width=8 height=27 xoffset=-2 yoffset=12 xadvance=7 page=0 chnl=15
-char id=107 x=120 y=94 width=13 height=20 xoffset=1 yoffset=12 xadvance=14 page=0 chnl=15
-char id=108 x=181 y=93 width=5 height=20 xoffset=1 yoffset=12 xadvance=7 page=0 chnl=15
-char id=109 x=95 y=115 width=21 height=15 xoffset=1 yoffset=17 xadvance=23 page=0 chnl=15
-char id=110 x=117 y=115 width=13 height=15 xoffset=1 yoffset=17 xadvance=15 page=0 chnl=15
-char id=111 x=23 y=117 width=14 height=16 xoffset=0 yoffset=17 xadvance=15 page=0 chnl=15
-char id=112 x=81 y=51 width=14 height=21 xoffset=1 yoffset=17 xadvance=15 page=0 chnl=15
-char id=113 x=66 y=51 width=14 height=21 xoffset=0 yoffset=17 xadvance=15 page=0 chnl=15
-char id=114 x=246 y=91 width=9 height=15 xoffset=1 yoffset=17 xadvance=10 page=0 chnl=15
-char id=115 x=68 y=115 width=13 height=16 xoffset=0 yoffset=17 xadvance=13 page=0 chnl=15
-char id=116 x=235 y=92 width=10 height=19 xoffset=0 yoffset=14 xadvance=10 page=0 chnl=15
-char id=117 x=131 y=115 width=13 height=15 xoffset=1 yoffset=18 xadvance=15 page=0 chnl=15
-char id=118 x=167 y=114 width=14 height=14 xoffset=0 yoffset=18 xadvance=14 page=0 chnl=15
-char id=119 x=145 y=115 width=21 height=14 xoffset=0 yoffset=18 xadvance=22 page=0 chnl=15
-char id=120 x=182 y=114 width=13 height=14 xoffset=0 yoffset=18 xadvance=13 page=0 chnl=15
-char id=121 x=16 y=96 width=14 height=20 xoffset=0 yoffset=18 xadvance=14 page=0 chnl=15
-char id=122 x=196 y=112 width=12 height=14 xoffset=0 yoffset=18 xadvance=13 page=0 chnl=15
-char id=176 x=18 y=134 width=10 height=9 xoffset=3 yoffset=12 xadvance=16 page=0 chnl=15
-char id=193 x=109 y=0 width=17 height=26 xoffset=0 yoffset=6 xadvance=17 page=0 chnl=15
-char id=196 x=127 y=0 width=17 height=26 xoffset=0 yoffset=6 xadvance=17 page=0 chnl=15
-char id=197 x=18 y=28 width=17 height=24 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=15
-char id=201 x=194 y=0 width=14 height=26 xoffset=1 yoffset=6 xadvance=15 page=0 chnl=15
-char id=205 x=235 y=0 width=8 height=26 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15
-char id=206 x=224 y=0 width=10 height=26 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=33 x=223 y=93 width=5 height=20 xoffset=1 yoffset=12 xadvance=7 page=0 chnl=15
+char id=37 x=18 y=53 width=16 height=21 xoffset=0 yoffset=12 xadvance=16 page=0 chnl=15
+char id=39 x=85 y=132 width=4 height=8 xoffset=1 yoffset=12 xadvance=6 page=0 chnl=15
+char id=43 x=203 y=114 width=14 height=14 xoffset=1 yoffset=18 xadvance=16 page=0 chnl=15
+char id=44 x=78 y=132 width=6 height=8 xoffset=0 yoffset=28 xadvance=7 page=0 chnl=15
+char id=45 x=96 y=132 width=10 height=3 xoffset=1 yoffset=23 xadvance=12 page=0 chnl=15
+char id=46 x=90 y=132 width=5 height=4 xoffset=1 yoffset=28 xadvance=7 page=0 chnl=15
+char id=47 x=173 y=50 width=12 height=21 xoffset=0 yoffset=12 xadvance=12 page=0 chnl=15
+char id=48 x=145 y=72 width=16 height=20 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=49 x=245 y=92 width=10 height=19 xoffset=2 yoffset=13 xadvance=16 page=0 chnl=15
+char id=50 x=0 y=119 width=14 height=19 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=51 x=94 y=94 width=14 height=20 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=52 x=229 y=93 width=15 height=19 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=53 x=64 y=94 width=14 height=20 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=54 x=16 y=98 width=15 height=20 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=55 x=182 y=93 width=13 height=20 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=56 x=128 y=73 width=16 height=20 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=57 x=0 y=98 width=15 height=20 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=58 x=247 y=112 width=5 height=13 xoffset=1 yoffset=19 xadvance=7 page=0 chnl=15
+char id=63 x=210 y=93 width=12 height=20 xoffset=0 yoffset=12 xadvance=12 page=0 chnl=15
+char id=65 x=22 y=75 width=17 height=20 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15
+char id=66 x=213 y=72 width=16 height=20 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15
+char id=67 x=144 y=50 width=14 height=21 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
+char id=68 x=179 y=72 width=16 height=20 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
+char id=69 x=124 y=94 width=14 height=20 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
+char id=70 x=139 y=94 width=14 height=20 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
+char id=71 x=68 y=51 width=15 height=21 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15
+char id=72 x=58 y=73 width=17 height=20 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15
+char id=73 x=246 y=50 width=5 height=20 xoffset=1 yoffset=12 xadvance=8 page=0 chnl=15
+char id=74 x=240 y=27 width=7 height=22 xoffset=0 yoffset=12 xadvance=8 page=0 chnl=15
+char id=75 x=32 y=96 width=15 height=20 xoffset=1 yoffset=12 xadvance=16 page=0 chnl=15
+char id=76 x=154 y=93 width=13 height=20 xoffset=1 yoffset=12 xadvance=13 page=0 chnl=15
+char id=77 x=0 y=77 width=21 height=20 xoffset=1 yoffset=12 xadvance=24 page=0 chnl=15
+char id=78 x=40 y=75 width=17 height=20 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15
+char id=79 x=0 y=55 width=17 height=21 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
+char id=80 x=162 y=72 width=16 height=20 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15
+char id=81 x=27 y=28 width=17 height=24 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
+char id=82 x=196 y=72 width=16 height=20 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15
+char id=83 x=52 y=51 width=15 height=21 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
+char id=84 x=48 y=96 width=15 height=20 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
+char id=85 x=35 y=53 width=16 height=21 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
+char id=86 x=76 y=73 width=17 height=20 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15
+char id=87 x=220 y=50 width=25 height=20 xoffset=0 yoffset=12 xadvance=26 page=0 chnl=15
+char id=88 x=94 y=73 width=16 height=20 xoffset=0 yoffset=12 xadvance=16 page=0 chnl=15
+char id=89 x=111 y=73 width=16 height=20 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
+char id=90 x=230 y=71 width=15 height=20 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
+char id=97 x=64 y=115 width=14 height=16 xoffset=0 yoffset=17 xadvance=14 page=0 chnl=15
+char id=98 x=99 y=51 width=14 height=21 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
+char id=99 x=108 y=115 width=12 height=16 xoffset=0 yoffset=17 xadvance=12 page=0 chnl=15
+char id=100 x=84 y=51 width=14 height=21 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
+char id=101 x=49 y=117 width=14 height=16 xoffset=0 yoffset=17 xadvance=14 page=0 chnl=15
+char id=102 x=199 y=50 width=10 height=21 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=15
+char id=103 x=45 y=28 width=15 height=22 xoffset=0 yoffset=17 xadvance=15 page=0 chnl=15
+char id=104 x=168 y=93 width=13 height=20 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
+char id=105 x=246 y=71 width=5 height=20 xoffset=1 yoffset=12 xadvance=7 page=0 chnl=15
+char id=106 x=117 y=0 width=8 height=27 xoffset=-2 yoffset=12 xadvance=7 page=0 chnl=15
+char id=107 x=196 y=93 width=13 height=20 xoffset=1 yoffset=12 xadvance=14 page=0 chnl=15
+char id=108 x=248 y=27 width=5 height=20 xoffset=1 yoffset=12 xadvance=7 page=0 chnl=15
+char id=109 x=121 y=115 width=21 height=15 xoffset=1 yoffset=17 xadvance=23 page=0 chnl=15
+char id=110 x=143 y=115 width=13 height=15 xoffset=1 yoffset=17 xadvance=15 page=0 chnl=15
+char id=111 x=79 y=115 width=14 height=16 xoffset=0 yoffset=17 xadvance=15 page=0 chnl=15
+char id=112 x=114 y=51 width=14 height=21 xoffset=1 yoffset=17 xadvance=15 page=0 chnl=15
+char id=113 x=129 y=51 width=14 height=21 xoffset=0 yoffset=17 xadvance=15 page=0 chnl=15
+char id=114 x=171 y=114 width=9 height=15 xoffset=1 yoffset=17 xadvance=10 page=0 chnl=15
+char id=115 x=94 y=115 width=13 height=16 xoffset=0 yoffset=17 xadvance=13 page=0 chnl=15
+char id=116 x=15 y=119 width=10 height=19 xoffset=0 yoffset=14 xadvance=10 page=0 chnl=15
+char id=117 x=157 y=114 width=13 height=15 xoffset=1 yoffset=18 xadvance=15 page=0 chnl=15
+char id=118 x=218 y=114 width=14 height=14 xoffset=0 yoffset=18 xadvance=14 page=0 chnl=15
+char id=119 x=181 y=114 width=21 height=14 xoffset=0 yoffset=18 xadvance=22 page=0 chnl=15
+char id=120 x=233 y=113 width=13 height=14 xoffset=0 yoffset=18 xadvance=13 page=0 chnl=15
+char id=121 x=109 y=94 width=14 height=20 xoffset=0 yoffset=18 xadvance=14 page=0 chnl=15
+char id=122 x=0 y=139 width=12 height=14 xoffset=0 yoffset=18 xadvance=13 page=0 chnl=15
+char id=176 x=67 y=132 width=10 height=9 xoffset=3 yoffset=12 xadvance=16 page=0 chnl=15
+char id=193 x=126 y=0 width=17 height=26 xoffset=0 yoffset=6 xadvance=17 page=0 chnl=15
+char id=196 x=144 y=0 width=17 height=26 xoffset=0 yoffset=6 xadvance=17 page=0 chnl=15
+char id=197 x=9 y=28 width=17 height=24 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=15
+char id=201 x=211 y=0 width=14 height=26 xoffset=1 yoffset=6 xadvance=15 page=0 chnl=15
+char id=205 x=0 y=28 width=8 height=26 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15
+char id=206 x=241 y=0 width=10 height=26 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15
char id=214 x=18 y=0 width=17 height=27 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=15
char id=216 x=0 y=0 width=17 height=27 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15
-char id=218 x=36 y=0 width=16 height=27 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=15
-char id=225 x=188 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
-char id=227 x=68 y=28 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
-char id=228 x=158 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
-char id=229 x=173 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
-char id=230 x=0 y=117 width=22 height=16 xoffset=0 yoffset=17 xadvance=22 page=0 chnl=15
-char id=232 x=143 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
-char id=233 x=128 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
-char id=237 x=179 y=50 width=9 height=21 xoffset=0 yoffset=11 xadvance=7 page=0 chnl=15
-char id=240 x=36 y=28 width=15 height=22 xoffset=0 yoffset=11 xadvance=16 page=0 chnl=15
-char id=241 x=141 y=50 width=13 height=21 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=15
-char id=243 x=113 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
-char id=244 x=98 y=28 width=14 height=22 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
-char id=246 x=83 y=28 width=14 height=22 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
-char id=248 x=31 y=96 width=14 height=20 xoffset=0 yoffset=15 xadvance=15 page=0 chnl=15
-char id=251 x=203 y=27 width=13 height=22 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=15
-char id=252 x=217 y=27 width=13 height=22 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=15
-char id=268 x=85 y=0 width=14 height=27 xoffset=1 yoffset=6 xadvance=15 page=0 chnl=15
-char id=282 x=209 y=0 width=14 height=26 xoffset=1 yoffset=6 xadvance=15 page=0 chnl=15
-char id=344 x=145 y=0 width=16 height=26 xoffset=1 yoffset=6 xadvance=17 page=0 chnl=15
-char id=346 x=69 y=0 width=15 height=27 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15
-char id=352 x=53 y=0 width=15 height=27 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15
-char id=377 x=178 y=0 width=15 height=26 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15
-char id=381 x=162 y=0 width=15 height=26 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15
-char id=382 x=155 y=50 width=12 height=21 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15
-char id=8304 x=215 y=112 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
-char id=8308 x=224 y=112 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
-char id=8309 x=233 y=112 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
-char id=8311 x=242 y=112 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
-char id=8312 x=0 y=134 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
-char id=8313 x=9 y=134 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
-kernings count=280
+char id=218 x=53 y=0 width=16 height=27 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=15
+char id=219 x=36 y=0 width=16 height=27 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=15
+char id=225 x=137 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
+char id=227 x=152 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
+char id=228 x=182 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
+char id=229 x=197 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
+char id=230 x=26 y=119 width=22 height=16 xoffset=0 yoffset=17 xadvance=22 page=0 chnl=15
+char id=232 x=107 y=28 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
+char id=233 x=92 y=28 width=14 height=22 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
+char id=237 x=210 y=50 width=9 height=21 xoffset=0 yoffset=11 xadvance=7 page=0 chnl=15
+char id=240 x=61 y=28 width=15 height=22 xoffset=0 yoffset=11 xadvance=16 page=0 chnl=15
+char id=241 x=159 y=50 width=13 height=21 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=15
+char id=243 x=167 y=27 width=14 height=22 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
+char id=244 x=77 y=28 width=14 height=22 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
+char id=246 x=122 y=28 width=14 height=22 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
+char id=248 x=79 y=94 width=14 height=20 xoffset=0 yoffset=15 xadvance=15 page=0 chnl=15
+char id=251 x=212 y=27 width=13 height=22 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=15
+char id=252 x=226 y=27 width=13 height=22 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=15
+char id=268 x=102 y=0 width=14 height=27 xoffset=1 yoffset=6 xadvance=15 page=0 chnl=15
+char id=282 x=226 y=0 width=14 height=26 xoffset=1 yoffset=6 xadvance=15 page=0 chnl=15
+char id=344 x=162 y=0 width=16 height=26 xoffset=1 yoffset=6 xadvance=17 page=0 chnl=15
+char id=346 x=86 y=0 width=15 height=27 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15
+char id=352 x=70 y=0 width=15 height=27 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15
+char id=377 x=195 y=0 width=15 height=26 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15
+char id=381 x=179 y=0 width=15 height=26 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15
+char id=382 x=186 y=50 width=12 height=21 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15
+char id=8304 x=22 y=139 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
+char id=8308 x=31 y=136 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
+char id=8309 x=40 y=136 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
+char id=8311 x=49 y=134 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
+char id=8312 x=58 y=134 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
+char id=8313 x=13 y=139 width=8 height=10 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
+kernings count=518
+kerning first=39 second=47 amount=-2
+kerning first=44 second=86 amount=-1
+kerning first=44 second=118 amount=-1
+kerning first=45 second=86 amount=-1
+kerning first=45 second=88 amount=-1
+kerning first=45 second=120 amount=-1
+kerning first=46 second=86 amount=-1
+kerning first=46 second=118 amount=-1
+kerning first=47 second=47 amount=-8
+kerning first=47 second=65 amount=-1
+kerning first=47 second=97 amount=-1
+kerning first=47 second=99 amount=-1
+kerning first=47 second=100 amount=-1
+kerning first=47 second=101 amount=-1
+kerning first=47 second=103 amount=-1
+kerning first=47 second=109 amount=-1
+kerning first=47 second=110 amount=-1
+kerning first=47 second=111 amount=-1
+kerning first=47 second=112 amount=-1
+kerning first=47 second=113 amount=-1
+kerning first=47 second=114 amount=-1
+kerning first=47 second=115 amount=-1
+kerning first=47 second=117 amount=-1
+kerning first=47 second=193 amount=-1
+kerning first=47 second=196 amount=-1
+kerning first=47 second=197 amount=-1
+kerning first=47 second=225 amount=-1
+kerning first=47 second=227 amount=-1
+kerning first=47 second=228 amount=-1
+kerning first=47 second=229 amount=-1
+kerning first=47 second=230 amount=-1
+kerning first=47 second=232 amount=-1
+kerning first=47 second=233 amount=-1
+kerning first=47 second=241 amount=-1
+kerning first=47 second=243 amount=-1
+kerning first=47 second=244 amount=-1
+kerning first=47 second=246 amount=-1
+kerning first=47 second=248 amount=-1
+kerning first=47 second=251 amount=-1
+kerning first=47 second=252 amount=-1
+kerning first=65 second=63 amount=-1
+kerning first=65 second=86 amount=-1
+kerning first=66 second=89 amount=-1
+kerning first=68 second=88 amount=-1
+kerning first=70 second=44 amount=-2
+kerning first=70 second=46 amount=-2
+kerning first=70 second=47 amount=-1
+kerning first=70 second=65 amount=-1
+kerning first=70 second=97 amount=-1
+kerning first=70 second=100 amount=-1
+kerning first=70 second=103 amount=-1
+kerning first=70 second=109 amount=-1
+kerning first=70 second=110 amount=-1
+kerning first=70 second=112 amount=-1
+kerning first=70 second=113 amount=-1
+kerning first=70 second=114 amount=-1
+kerning first=70 second=193 amount=-1
+kerning first=70 second=196 amount=-1
+kerning first=70 second=197 amount=-1
+kerning first=70 second=225 amount=-1
+kerning first=70 second=227 amount=-1
+kerning first=70 second=228 amount=-1
+kerning first=70 second=229 amount=-1
+kerning first=70 second=230 amount=-1
+kerning first=70 second=241 amount=-1
+kerning first=75 second=118 amount=-1
+kerning first=76 second=86 amount=-2
+kerning first=76 second=118 amount=-1
+kerning first=79 second=88 amount=-1
+kerning first=80 second=44 amount=-2
+kerning first=80 second=46 amount=-2
+kerning first=80 second=47 amount=-1
+kerning first=80 second=65 amount=-1
+kerning first=80 second=89 amount=-1
+kerning first=80 second=193 amount=-1
+kerning first=80 second=196 amount=-1
+kerning first=80 second=197 amount=-1
+kerning first=81 second=88 amount=-1
+kerning first=84 second=47 amount=-1
+kerning first=84 second=118 amount=-2
+kerning first=84 second=120 amount=-2
+kerning first=84 second=227 amount=-2
+kerning first=84 second=228 amount=-2
+kerning first=84 second=240 amount=-1
+kerning first=86 second=44 amount=-1
+kerning first=86 second=45 amount=-1
+kerning first=86 second=46 amount=-1
+kerning first=86 second=47 amount=-1
+kerning first=86 second=65 amount=-1
+kerning first=86 second=74 amount=-1
+kerning first=86 second=97 amount=-1
+kerning first=86 second=99 amount=-1
+kerning first=86 second=100 amount=-1
+kerning first=86 second=101 amount=-1
+kerning first=86 second=103 amount=-1
+kerning first=86 second=109 amount=-1
+kerning first=86 second=110 amount=-1
+kerning first=86 second=111 amount=-1
+kerning first=86 second=112 amount=-1
+kerning first=86 second=113 amount=-1
+kerning first=86 second=114 amount=-1
+kerning first=86 second=115 amount=-1
+kerning first=86 second=117 amount=-1
+kerning first=86 second=193 amount=-1
+kerning first=86 second=196 amount=-1
+kerning first=86 second=197 amount=-1
+kerning first=86 second=225 amount=-1
+kerning first=86 second=227 amount=-1
+kerning first=86 second=228 amount=-1
+kerning first=86 second=229 amount=-1
+kerning first=86 second=230 amount=-1
+kerning first=86 second=232 amount=-1
+kerning first=86 second=233 amount=-1
+kerning first=86 second=240 amount=-1
+kerning first=86 second=241 amount=-1
+kerning first=86 second=243 amount=-1
+kerning first=86 second=244 amount=-1
+kerning first=86 second=246 amount=-1
+kerning first=86 second=248 amount=-1
+kerning first=86 second=251 amount=-1
+kerning first=86 second=252 amount=-1
+kerning first=87 second=47 amount=-1
+kerning first=88 second=45 amount=-1
+kerning first=88 second=71 amount=-1
+kerning first=88 second=79 amount=-1
+kerning first=88 second=81 amount=-1
+kerning first=88 second=99 amount=-1
+kerning first=88 second=100 amount=-1
+kerning first=88 second=101 amount=-1
+kerning first=88 second=103 amount=-1
+kerning first=88 second=111 amount=-1
+kerning first=88 second=113 amount=-1
+kerning first=88 second=117 amount=-1
+kerning first=88 second=118 amount=-1
+kerning first=88 second=119 amount=-1
+kerning first=88 second=121 amount=-1
+kerning first=88 second=214 amount=-1
+kerning first=88 second=216 amount=-1
+kerning first=88 second=232 amount=-1
+kerning first=88 second=233 amount=-1
+kerning first=88 second=243 amount=-1
+kerning first=88 second=244 amount=-1
+kerning first=88 second=246 amount=-1
+kerning first=88 second=248 amount=-1
+kerning first=88 second=251 amount=-1
+kerning first=88 second=252 amount=-1
+kerning first=89 second=47 amount=-2
+kerning first=89 second=102 amount=-1
+kerning first=89 second=118 amount=-1
+kerning first=89 second=120 amount=-1
+kerning first=89 second=227 amount=-1
+kerning first=89 second=228 amount=-1
+kerning first=89 second=240 amount=-1
+kerning first=97 second=86 amount=-1
+kerning first=98 second=63 amount=-1
+kerning first=98 second=86 amount=-1
+kerning first=98 second=88 amount=-1
+kerning first=101 second=86 amount=-1
+kerning first=102 second=44 amount=-1
+kerning first=102 second=45 amount=-1
+kerning first=102 second=46 amount=-1
+kerning first=102 second=47 amount=-1
+kerning first=102 second=65 amount=-1
+kerning first=102 second=193 amount=-1
+kerning first=102 second=196 amount=-1
+kerning first=102 second=197 amount=-1
+kerning first=102 second=240 amount=-1
+kerning first=103 second=106 amount=1
+kerning first=104 second=86 amount=-1
+kerning first=109 second=86 amount=-1
+kerning first=110 second=86 amount=-1
+kerning first=111 second=63 amount=-1
+kerning first=111 second=86 amount=-1
+kerning first=111 second=88 amount=-1
+kerning first=112 second=63 amount=-1
+kerning first=112 second=86 amount=-1
+kerning first=112 second=88 amount=-1
+kerning first=113 second=86 amount=-1
+kerning first=114 second=47 amount=-1
+kerning first=114 second=88 amount=-1
+kerning first=114 second=240 amount=-1
+kerning first=115 second=86 amount=-1
+kerning first=117 second=86 amount=-1
+kerning first=118 second=44 amount=-1
+kerning first=118 second=46 amount=-1
+kerning first=118 second=47 amount=-1
+kerning first=118 second=74 amount=-1
+kerning first=118 second=84 amount=-2
+kerning first=118 second=88 amount=-1
+kerning first=118 second=89 amount=-1
+kerning first=119 second=88 amount=-1
+kerning first=120 second=45 amount=-1
+kerning first=120 second=84 amount=-2
+kerning first=120 second=89 amount=-1
+kerning first=121 second=47 amount=-1
+kerning first=121 second=88 amount=-1
+kerning first=193 second=63 amount=-1
+kerning first=193 second=86 amount=-1
+kerning first=196 second=63 amount=-1
+kerning first=196 second=86 amount=-1
+kerning first=197 second=63 amount=-1
+kerning first=197 second=86 amount=-1
+kerning first=214 second=88 amount=-1
+kerning first=216 second=88 amount=-1
+kerning first=225 second=86 amount=-1
+kerning first=227 second=86 amount=-1
+kerning first=228 second=86 amount=-1
+kerning first=229 second=86 amount=-1
+kerning first=230 second=86 amount=-1
+kerning first=232 second=86 amount=-1
+kerning first=233 second=86 amount=-1
+kerning first=237 second=39 amount=1
+kerning first=237 second=63 amount=1
+kerning first=237 second=98 amount=1
+kerning first=237 second=104 amount=1
+kerning first=237 second=105 amount=1
+kerning first=237 second=106 amount=1
+kerning first=237 second=107 amount=1
+kerning first=237 second=237 amount=1
+kerning first=240 second=74 amount=-1
+kerning first=240 second=84 amount=-1
+kerning first=240 second=88 amount=-1
+kerning first=240 second=89 amount=-1
+kerning first=241 second=86 amount=-1
+kerning first=243 second=63 amount=-1
+kerning first=243 second=86 amount=-1
+kerning first=243 second=88 amount=-1
+kerning first=244 second=63 amount=-1
+kerning first=244 second=86 amount=-1
+kerning first=244 second=88 amount=-1
+kerning first=246 second=63 amount=-1
+kerning first=246 second=86 amount=-1
+kerning first=246 second=88 amount=-1
+kerning first=248 second=63 amount=-1
+kerning first=248 second=86 amount=-1
+kerning first=248 second=88 amount=-1
+kerning first=251 second=86 amount=-1
+kerning first=252 second=86 amount=-1
kerning first=39 second=45 amount=-2
kerning first=39 second=65 amount=-1
kerning first=39 second=193 amount=-1
diff --git a/resources-round-280x280/fonts/titillium-web-semibold-28_0.png b/resources-round-280x280/fonts/titillium-web-semibold-28_0.png
index 329cbef4..2d920a4e 100644
Binary files a/resources-round-280x280/fonts/titillium-web-semibold-28_0.png and b/resources-round-280x280/fonts/titillium-web-semibold-28_0.png differ
diff --git a/resources-round-280x280/layouts/layout.xml b/resources-round-280x280/layouts/layout.xml
index a73c487d..ce9d7d2b 100644
--- a/resources-round-280x280/layouts/layout.xml
+++ b/resources-round-280x280/layouts/layout.xml
@@ -18,6 +18,8 @@
94
92
+ 192
+ 210
228
246
223
diff --git a/resources-round-360x360/fonts/fonts.xml b/resources-round-360x360/fonts/fonts.xml
index 9fba4349..c8943de4 100644
--- a/resources-round-360x360/fonts/fonts.xml
+++ b/resources-round-360x360/fonts/fonts.xml
@@ -2,11 +2,11 @@
-
+
-
-
+
+
@@ -24,13 +24,13 @@
-
+
-
+
-
+
diff --git a/resources-round-360x360/fonts/titillium-web-bold-102-tall.bmfc b/resources-round-360x360/fonts/titillium-web-bold-102-tall.bmfc
index 15f00110..9ead2a77 100644
--- a/resources-round-360x360/fonts/titillium-web-bold-102-tall.bmfc
+++ b/resources-round-360x360/fonts/titillium-web-bold-102-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
diff --git a/resources-round-360x360/fonts/titillium-web-light-102-tall.bmfc b/resources-round-360x360/fonts/titillium-web-light-102-tall.bmfc
index 8f963d8b..45619427 100644
--- a/resources-round-360x360/fonts/titillium-web-light-102-tall.bmfc
+++ b/resources-round-360x360/fonts/titillium-web-light-102-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,6 +54,6 @@ invB=0
outlineThickness=0
# selected chars
-chars=48-57
+chars=48-58
# imported icon images
diff --git a/resources-round-360x360/fonts/titillium-web-light-102-tall.fnt b/resources-round-360x360/fonts/titillium-web-light-102-tall.fnt
index 006b028b..556befe2 100644
--- a/resources-round-360x360/fonts/titillium-web-light-102-tall.fnt
+++ b/resources-round-360x360/fonts/titillium-web-light-102-tall.fnt
@@ -1,7 +1,7 @@
info face="Titillium Web Light" size=-102 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=163 base=122 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-light-102-tall_0.png"
-chars count=10
+chars count=11
char id=48 x=52 y=0 width=49 height=74 xoffset=4 yoffset=49 xadvance=57 page=0 chnl=15
char id=49 x=185 y=75 width=28 height=72 xoffset=11 yoffset=50 xadvance=57 page=0 chnl=15
char id=50 x=46 y=75 width=44 height=73 xoffset=7 yoffset=49 xadvance=57 page=0 chnl=15
@@ -12,3 +12,4 @@ char id=54 x=102 y=0 width=47 height=74 xoffset=5 yoffset=49
char id=55 x=91 y=75 width=42 height=73 xoffset=8 yoffset=50 xadvance=57 page=0 chnl=15
char id=56 x=0 y=0 width=51 height=74 xoffset=3 yoffset=49 xadvance=57 page=0 chnl=15
char id=57 x=150 y=0 width=47 height=74 xoffset=4 yoffset=49 xadvance=57 page=0 chnl=15
+char id=58 x=243 y=0 width=7 height=47 xoffset=7 yoffset=75 xadvance=21 page=0 chnl=15
diff --git a/resources-round-360x360/fonts/titillium-web-light-102-tall_0.png b/resources-round-360x360/fonts/titillium-web-light-102-tall_0.png
index 692d7f9e..956a797b 100644
Binary files a/resources-round-360x360/fonts/titillium-web-light-102-tall_0.png and b/resources-round-360x360/fonts/titillium-web-light-102-tall_0.png differ
diff --git a/resources-round-360x360/layouts/layout.xml b/resources-round-360x360/layouts/layout.xml
index 5f3baefc..2faab391 100644
--- a/resources-round-360x360/layouts/layout.xml
+++ b/resources-round-360x360/layouts/layout.xml
@@ -19,6 +19,8 @@
116
128
+ 246
+ 266
286
312
280
diff --git a/resources-round-390x390/fonts/crystal-icons-extra-large.fnt b/resources-round-390x390/fonts/crystal-icons-extra-large.fnt
index 1b0347a8..9fc82936 100644
--- a/resources-round-390x390/fonts/crystal-icons-extra-large.fnt
+++ b/resources-round-390x390/fonts/crystal-icons-extra-large.fnt
@@ -1,7 +1,7 @@
info face="Crystal Icons" size=-39 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=39 base=39 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="crystal-icons-extra-large.png"
-chars count=17
+chars count=25
char id=48 x=0 y=0 width=34 height=39 xoffset=0 yoffset=0 xadvance=34 page=0 chnl=15
char id=49 x=34 y=0 width=39 height=39 xoffset=0 yoffset=0 xadvance=39 page=0 chnl=15
char id=50 x=73 y=0 width=39 height=39 xoffset=0 yoffset=0 xadvance=39 page=0 chnl=15
@@ -18,4 +18,12 @@ char id=61 x=163 y=39 width=9 height=9 xoffset=0 yoffset=13
char id=62 x=0 y=78 width=45 height=39 xoffset=0 yoffset=0 xadvance=45 page=0 chnl=15
char id=63 x=45 y=78 width=45 height=39 xoffset=0 yoffset=0 xadvance=45 page=0 chnl=15
char id=64 x=90 y=78 width=33 height=39 xoffset=0 yoffset=0 xadvance=33 page=0 chnl=15
-char id=65 x=123 y=78 width=27 height=39 xoffset=0 yoffset=0 xadvance=27 page=0 chnl=15
\ No newline at end of file
+char id=65 x=123 y=78 width=27 height=39 xoffset=0 yoffset=0 xadvance=27 page=0 chnl=15
+char id=66 x=153 y=78 width=43 height=39 xoffset=0 yoffset=0 xadvance=43 page=0 chnl=15
+char id=67 x=173 y=39 width=34 height=39 xoffset=0 yoffset=0 xadvance=34 page=0 chnl=15
+char id=68 x=206 y=38 width=40 height=39 xoffset=0 yoffset=0 xadvance=40 page=0 chnl=15
+char id=69 x=195 y=78 width=35 height=40 xoffset=0 yoffset=0 xadvance=35 page=0 chnl=15
+char id=70 x=0 y=114 width=29 height=40 xoffset=0 yoffset=0 xadvance=29 page=0 chnl=15
+char id=71 x=31 y=116 width=36 height=40 xoffset=0 yoffset=0 xadvance=36 page=0 chnl=15
+char id=84 x=67 y=118 width=20 height=30 xoffset=0 yoffset=0 xadvance=20 page=0 chnl=15
+char id=72 x=87 y=118 width=23 height=39 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=15
diff --git a/resources-round-390x390/fonts/crystal-icons-extra-large.png b/resources-round-390x390/fonts/crystal-icons-extra-large.png
index 3a9378f3..f06c5775 100644
Binary files a/resources-round-390x390/fonts/crystal-icons-extra-large.png and b/resources-round-390x390/fonts/crystal-icons-extra-large.png differ
diff --git a/resources-round-390x390/fonts/fonts.xml b/resources-round-390x390/fonts/fonts.xml
index 268d5e92..519ed596 100644
--- a/resources-round-390x390/fonts/fonts.xml
+++ b/resources-round-390x390/fonts/fonts.xml
@@ -2,11 +2,11 @@
-
+
-
-
+
+
@@ -22,13 +22,13 @@
-
+
-
+
-
+
diff --git a/resources-round-390x390/fonts/titillium-web-light-110-tall.bmfc b/resources-round-390x390/fonts/titillium-web-light-110-tall.bmfc
index 6c61a9e5..457a92b1 100644
--- a/resources-round-390x390/fonts/titillium-web-light-110-tall.bmfc
+++ b/resources-round-390x390/fonts/titillium-web-light-110-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,6 +54,6 @@ invB=0
outlineThickness=0
# selected chars
-chars=48-57
+chars=48-58
# imported icon images
diff --git a/resources-round-390x390/fonts/titillium-web-light-110-tall.fnt b/resources-round-390x390/fonts/titillium-web-light-110-tall.fnt
index ae6e9377..80b23d07 100644
--- a/resources-round-390x390/fonts/titillium-web-light-110-tall.fnt
+++ b/resources-round-390x390/fonts/titillium-web-light-110-tall.fnt
@@ -1,7 +1,7 @@
info face="Titillium Web Light" size=-110 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=176 base=132 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-light-110-tall_0.png"
-chars count=10
+chars count=11
char id=48 x=56 y=0 width=53 height=80 xoffset=4 yoffset=53 xadvance=61 page=0 chnl=15
char id=49 x=214 y=0 width=30 height=77 xoffset=12 yoffset=54 xadvance=61 page=0 chnl=15
char id=50 x=145 y=81 width=47 height=78 xoffset=7 yoffset=53 xadvance=61 page=0 chnl=15
@@ -12,3 +12,4 @@ char id=54 x=110 y=0 width=51 height=80 xoffset=6 yoffset=53
char id=55 x=49 y=81 width=45 height=79 xoffset=8 yoffset=54 xadvance=61 page=0 chnl=15
char id=56 x=0 y=0 width=55 height=80 xoffset=3 yoffset=53 xadvance=61 page=0 chnl=15
char id=57 x=162 y=0 width=51 height=80 xoffset=4 yoffset=53 xadvance=61 page=0 chnl=15
+char id=58 x=245 y=0 width=8 height=50 xoffset=7 yoffset=81 xadvance=23 page=0 chnl=15
diff --git a/resources-round-390x390/fonts/titillium-web-light-110-tall_0.png b/resources-round-390x390/fonts/titillium-web-light-110-tall_0.png
index b0296e65..12e80c9c 100644
Binary files a/resources-round-390x390/fonts/titillium-web-light-110-tall_0.png and b/resources-round-390x390/fonts/titillium-web-light-110-tall_0.png differ
diff --git a/resources-round-390x390/layouts/layout.xml b/resources-round-390x390/layouts/layout.xml
index 45aa5d98..8f48ab7f 100644
--- a/resources-round-390x390/layouts/layout.xml
+++ b/resources-round-390x390/layouts/layout.xml
@@ -19,6 +19,8 @@
123
144
+ 260
+ 286
312
338
307
diff --git a/resources-round-416x416/fonts/fonts.xml b/resources-round-416x416/fonts/fonts.xml
index 5541a4f7..d90b563b 100644
--- a/resources-round-416x416/fonts/fonts.xml
+++ b/resources-round-416x416/fonts/fonts.xml
@@ -2,11 +2,11 @@
-
+
-
-
+
+
@@ -23,13 +23,13 @@
-
+
-
+
-
+
diff --git a/resources-round-416x416/fonts/titillium-web-bold-118-tall.bmfc b/resources-round-416x416/fonts/titillium-web-bold-118-tall.bmfc
index 1cc9cf97..13d4a451 100644
--- a/resources-round-416x416/fonts/titillium-web-bold-118-tall.bmfc
+++ b/resources-round-416x416/fonts/titillium-web-bold-118-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
diff --git a/resources-round-416x416/fonts/titillium-web-light-118-tall.bmfc b/resources-round-416x416/fonts/titillium-web-light-118-tall.bmfc
index f1a2adf9..b6d64a82 100644
--- a/resources-round-416x416/fonts/titillium-web-light-118-tall.bmfc
+++ b/resources-round-416x416/fonts/titillium-web-light-118-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,6 +54,6 @@ invB=0
outlineThickness=0
# selected chars
-chars=48-57
+chars=48-58
# imported icon images
diff --git a/resources-round-416x416/fonts/titillium-web-light-118-tall.fnt b/resources-round-416x416/fonts/titillium-web-light-118-tall.fnt
index d06d0e26..5bc0c17f 100644
--- a/resources-round-416x416/fonts/titillium-web-light-118-tall.fnt
+++ b/resources-round-416x416/fonts/titillium-web-light-118-tall.fnt
@@ -1,7 +1,7 @@
info face="Titillium Web Light" size=-118 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=189 base=141 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-light-118-tall_0.png"
-chars count=10
+chars count=11
char id=48 x=60 y=0 width=56 height=85 xoffset=5 yoffset=57 xadvance=66 page=0 chnl=15
char id=49 x=206 y=86 width=32 height=83 xoffset=13 yoffset=58 xadvance=66 page=0 chnl=15
char id=50 x=105 y=86 width=50 height=84 xoffset=8 yoffset=57 xadvance=66 page=0 chnl=15
@@ -12,3 +12,4 @@ char id=54 x=117 y=0 width=55 height=85 xoffset=6 yoffset=57
char id=55 x=156 y=86 width=49 height=84 xoffset=9 yoffset=58 xadvance=66 page=0 chnl=15
char id=56 x=0 y=0 width=59 height=85 xoffset=3 yoffset=57 xadvance=66 page=0 chnl=15
char id=57 x=173 y=0 width=55 height=85 xoffset=5 yoffset=57 xadvance=66 page=0 chnl=15
+char id=58 x=229 y=0 width=8 height=55 xoffset=8 yoffset=86 xadvance=24 page=0 chnl=15
diff --git a/resources-round-416x416/fonts/titillium-web-light-118-tall_0.png b/resources-round-416x416/fonts/titillium-web-light-118-tall_0.png
index a0629272..ab3ddcfa 100644
Binary files a/resources-round-416x416/fonts/titillium-web-light-118-tall_0.png and b/resources-round-416x416/fonts/titillium-web-light-118-tall_0.png differ
diff --git a/resources-round-416x416/fonts/titillium-web-light-85-tall.fnt b/resources-round-416x416/fonts/titillium-web-light-85-tall.fnt
index 89b3b494..f425a1f9 100644
--- a/resources-round-416x416/fonts/titillium-web-light-85-tall.fnt
+++ b/resources-round-416x416/fonts/titillium-web-light-85-tall.fnt
@@ -12,3 +12,4 @@ char id=54 x=86 y=0 width=40 height=61 xoffset=4 yoffset=41
char id=55 x=37 y=62 width=36 height=60 xoffset=6 yoffset=42 xadvance=48 page=0 chnl=15
char id=56 x=0 y=0 width=43 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
char id=57 x=127 y=0 width=40 height=61 xoffset=3 yoffset=41 xadvance=48 page=0 chnl=15
+char id=58 x=145 y=62 width=12 height=61 xoffset=3 yoffset=41 xadvance=12 page=0 chnl=15
diff --git a/resources-round-416x416/fonts/titillium-web-light-85-tall_0.png b/resources-round-416x416/fonts/titillium-web-light-85-tall_0.png
index e28af3b5..14126c87 100644
Binary files a/resources-round-416x416/fonts/titillium-web-light-85-tall_0.png and b/resources-round-416x416/fonts/titillium-web-light-85-tall_0.png differ
diff --git a/resources-round-416x416/layouts/layout.xml b/resources-round-416x416/layouts/layout.xml
index 6c46bb42..c7b67e1a 100644
--- a/resources-round-416x416/layouts/layout.xml
+++ b/resources-round-416x416/layouts/layout.xml
@@ -19,6 +19,8 @@
136
144
+ 284
+ 310
336
362
331
diff --git a/resources-round-454x454/fonts/fonts.xml b/resources-round-454x454/fonts/fonts.xml
new file mode 100644
index 00000000..d651fc57
--- /dev/null
+++ b/resources-round-454x454/fonts/fonts.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources-round-454x454/fonts/namum-gothic-kor-42.bmfc b/resources-round-454x454/fonts/namum-gothic-kor-42.bmfc
new file mode 100644
index 00000000..aca274c2
--- /dev/null
+++ b/resources-round-454x454/fonts/namum-gothic-kor-42.bmfc
@@ -0,0 +1,55 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=NanumGothicExtraBold
+fontFile=
+charSet=0
+fontSize=42
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=32,40-41,48-57,44552,47785,49688,50900,51068,53664,54868
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/namum-gothic-kor-42.fnt b/resources-round-454x454/fonts/namum-gothic-kor-42.fnt
new file mode 100644
index 00000000..97fe239c
--- /dev/null
+++ b/resources-round-454x454/fonts/namum-gothic-kor-42.fnt
@@ -0,0 +1,24 @@
+info face="NanumGothicExtraBold" size=42 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=42 base=34 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="namum-gothic-kor-42_0.png"
+chars count=20
+char id=32 x=191 y=35 width=2 height=1 xoffset=0 yoffset=41 xadvance=10 page=0 chnl=15
+char id=40 x=31 y=0 width=11 height=35 xoffset=2 yoffset=5 xadvance=13 page=0 chnl=15
+char id=41 x=43 y=0 width=11 height=35 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
+char id=48 x=22 y=36 width=19 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=49 x=243 y=0 width=11 height=27 xoffset=3 yoffset=8 xadvance=22 page=0 chnl=15
+char id=50 x=82 y=35 width=18 height=27 xoffset=1 yoffset=8 xadvance=22 page=0 chnl=15
+char id=51 x=101 y=35 width=18 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=52 x=0 y=36 width=21 height=27 xoffset=0 yoffset=8 xadvance=22 page=0 chnl=15
+char id=53 x=139 y=35 width=17 height=27 xoffset=3 yoffset=8 xadvance=22 page=0 chnl=15
+char id=54 x=42 y=36 width=19 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=55 x=120 y=35 width=18 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=56 x=222 y=0 width=20 height=30 xoffset=1 yoffset=7 xadvance=22 page=0 chnl=15
+char id=57 x=62 y=35 width=19 height=27 xoffset=2 yoffset=8 xadvance=22 page=0 chnl=15
+char id=44552 x=90 y=0 width=33 height=34 xoffset=0 yoffset=5 xadvance=34 page=0 chnl=15
+char id=47785 x=124 y=0 width=33 height=34 xoffset=0 yoffset=5 xadvance=34 page=0 chnl=15
+char id=49688 x=158 y=0 width=33 height=34 xoffset=0 yoffset=5 xadvance=34 page=0 chnl=15
+char id=50900 x=0 y=0 width=30 height=35 xoffset=1 yoffset=4 xadvance=34 page=0 chnl=15
+char id=51068 x=192 y=0 width=29 height=34 xoffset=2 yoffset=5 xadvance=34 page=0 chnl=15
+char id=53664 x=157 y=35 width=33 height=26 xoffset=0 yoffset=7 xadvance=34 page=0 chnl=15
+char id=54868 x=55 y=0 width=34 height=34 xoffset=0 yoffset=5 xadvance=34 page=0 chnl=15
diff --git a/resources-round-454x454/fonts/namum-gothic-kor-42_0.png b/resources-round-454x454/fonts/namum-gothic-kor-42_0.png
new file mode 100644
index 00000000..5f09960b
Binary files /dev/null and b/resources-round-454x454/fonts/namum-gothic-kor-42_0.png differ
diff --git a/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42.bmfc b/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42.bmfc
new file mode 100644
index 00000000..9b85ec32
--- /dev/null
+++ b/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42.bmfc
@@ -0,0 +1,56 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Noto Sans CJK SC Medium
+fontFile=
+charSet=0
+fontSize=-42
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=10,32,48-57,19968,19971,19977,20061,20108,20116,20843,20845,21313,22235,26085,26143,26376,26399
+
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42.fnt b/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42.fnt
new file mode 100644
index 00000000..ee5e7127
--- /dev/null
+++ b/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42.fnt
@@ -0,0 +1,30 @@
+info face="Noto Sans CJK SC Medium" size=-42 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=62 base=49 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-cjk-sc-medium-42_0.png"
+chars count=26
+char id=10 x=242 y=33 width=2 height=1 xoffset=0 yoffset=61 xadvance=9 page=0 chnl=15
+char id=32 x=245 y=33 width=2 height=1 xoffset=0 yoffset=61 xadvance=9 page=0 chnl=15
+char id=48 x=66 y=77 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=49 x=236 y=0 width=18 height=32 xoffset=3 yoffset=17 xadvance=24 page=0 chnl=15
+char id=50 x=0 y=78 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=51 x=22 y=78 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=52 x=219 y=38 width=22 height=32 xoffset=0 yoffset=17 xadvance=24 page=0 chnl=15
+char id=53 x=44 y=77 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=54 x=87 y=77 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=55 x=108 y=76 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=56 x=129 y=76 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=57 x=150 y=74 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=19968 x=209 y=71 width=39 height=5 xoffset=2 yoffset=30 xadvance=42 page=0 chnl=15
+char id=19971 x=157 y=0 width=39 height=37 xoffset=1 yoffset=14 xadvance=42 page=0 chnl=15
+char id=19977 x=181 y=38 width=37 height=32 xoffset=3 yoffset=17 xadvance=42 page=0 chnl=15
+char id=20061 x=0 y=0 width=39 height=39 xoffset=1 yoffset=13 xadvance=42 page=0 chnl=15
+char id=20108 x=171 y=74 width=37 height=29 xoffset=2 yoffset=19 xadvance=42 page=0 chnl=15
+char id=20116 x=142 y=40 width=38 height=33 xoffset=2 yoffset=17 xadvance=42 page=0 chnl=15
+char id=20843 x=35 y=40 width=40 height=36 xoffset=1 yoffset=16 xadvance=42 page=0 chnl=15
+char id=20845 x=40 y=0 width=38 height=39 xoffset=2 yoffset=13 xadvance=42 page=0 chnl=15
+char id=21313 x=79 y=0 width=38 height=39 xoffset=2 yoffset=13 xadvance=42 page=0 chnl=15
+char id=22235 x=106 y=40 width=35 height=35 xoffset=3 yoffset=16 xadvance=42 page=0 chnl=15
+char id=26085 x=76 y=40 width=29 height=36 xoffset=7 yoffset=16 xadvance=42 page=0 chnl=15
+char id=26143 x=197 y=0 width=38 height=37 xoffset=2 yoffset=14 xadvance=42 page=0 chnl=15
+char id=26376 x=0 y=40 width=34 height=37 xoffset=1 yoffset=15 xadvance=42 page=0 chnl=15
+char id=26399 x=118 y=0 width=38 height=39 xoffset=1 yoffset=13 xadvance=42 page=0 chnl=15
diff --git a/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42_0.png b/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42_0.png
new file mode 100644
index 00000000..f10704df
Binary files /dev/null and b/resources-round-454x454/fonts/noto-sans-cjk-sc-medium-42_0.png differ
diff --git a/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42.bmfc b/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42.bmfc
new file mode 100644
index 00000000..cfeb4fa6
--- /dev/null
+++ b/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42.bmfc
@@ -0,0 +1,56 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Noto Sans CJK TC Medium
+fontFile=
+charSet=0
+fontSize=-42
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=10,32,48-57,19968,19971,19977,20061,20108,20116,20843,20845,21313,22235,26085,26143,26376,26399
+
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42.fnt b/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42.fnt
new file mode 100644
index 00000000..815d906b
--- /dev/null
+++ b/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42.fnt
@@ -0,0 +1,30 @@
+info face="Noto Sans CJK TC Medium" size=-42 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=62 base=49 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-cjk-tc-medium-42_0.png"
+chars count=26
+char id=10 x=240 y=33 width=2 height=1 xoffset=0 yoffset=61 xadvance=9 page=0 chnl=15
+char id=32 x=243 y=33 width=2 height=1 xoffset=0 yoffset=61 xadvance=9 page=0 chnl=15
+char id=48 x=66 y=77 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=49 x=236 y=0 width=18 height=32 xoffset=3 yoffset=17 xadvance=24 page=0 chnl=15
+char id=50 x=0 y=78 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=51 x=22 y=78 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=52 x=217 y=38 width=22 height=32 xoffset=0 yoffset=17 xadvance=24 page=0 chnl=15
+char id=53 x=44 y=77 width=21 height=32 xoffset=1 yoffset=17 xadvance=24 page=0 chnl=15
+char id=54 x=87 y=77 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=55 x=108 y=76 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=56 x=129 y=76 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=57 x=150 y=74 width=20 height=32 xoffset=2 yoffset=17 xadvance=24 page=0 chnl=15
+char id=19968 x=209 y=72 width=39 height=5 xoffset=2 yoffset=30 xadvance=42 page=0 chnl=15
+char id=19971 x=35 y=40 width=38 height=36 xoffset=2 yoffset=14 xadvance=42 page=0 chnl=15
+char id=19977 x=179 y=39 width=37 height=32 xoffset=3 yoffset=17 xadvance=42 page=0 chnl=15
+char id=20061 x=0 y=0 width=39 height=39 xoffset=1 yoffset=13 xadvance=42 page=0 chnl=15
+char id=20108 x=171 y=74 width=37 height=29 xoffset=2 yoffset=19 xadvance=42 page=0 chnl=15
+char id=20116 x=140 y=40 width=38 height=33 xoffset=2 yoffset=17 xadvance=42 page=0 chnl=15
+char id=20843 x=157 y=0 width=39 height=38 xoffset=1 yoffset=15 xadvance=42 page=0 chnl=15
+char id=20845 x=40 y=0 width=38 height=39 xoffset=2 yoffset=13 xadvance=42 page=0 chnl=15
+char id=21313 x=79 y=0 width=38 height=39 xoffset=2 yoffset=13 xadvance=42 page=0 chnl=15
+char id=22235 x=104 y=40 width=35 height=35 xoffset=3 yoffset=16 xadvance=42 page=0 chnl=15
+char id=26085 x=74 y=40 width=29 height=36 xoffset=7 yoffset=16 xadvance=42 page=0 chnl=15
+char id=26143 x=197 y=0 width=38 height=37 xoffset=2 yoffset=14 xadvance=42 page=0 chnl=15
+char id=26376 x=0 y=40 width=34 height=37 xoffset=1 yoffset=15 xadvance=42 page=0 chnl=15
+char id=26399 x=118 y=0 width=38 height=39 xoffset=1 yoffset=13 xadvance=42 page=0 chnl=15
diff --git a/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42_0.png b/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42_0.png
new file mode 100644
index 00000000..90257042
Binary files /dev/null and b/resources-round-454x454/fonts/noto-sans-cjk-tc-medium-42_0.png differ
diff --git a/resources-round-454x454/fonts/noto-sans-rus-bold-42.bmfc b/resources-round-454x454/fonts/noto-sans-rus-bold-42.bmfc
new file mode 100644
index 00000000..ee3827c9
--- /dev/null
+++ b/resources-round-454x454/fonts/noto-sans-rus-bold-42.bmfc
@@ -0,0 +1,55 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Noto Sans
+fontFile=
+charSet=0
+fontSize=-42
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=1
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=32,48-57,1040-1071
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/noto-sans-rus-bold-42.fnt b/resources-round-454x454/fonts/noto-sans-rus-bold-42.fnt
new file mode 100644
index 00000000..3a4dbd1e
--- /dev/null
+++ b/resources-round-454x454/fonts/noto-sans-rus-bold-42.fnt
@@ -0,0 +1,47 @@
+info face="Noto Sans" size=-42 bold=1 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=58 base=45 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="noto-sans-rus-bold-42_0.png"
+chars count=43
+char id=32 x=241 y=0 width=2 height=1 xoffset=0 yoffset=57 xadvance=11 page=0 chnl=15
+char id=48 x=96 y=40 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=49 x=136 y=135 width=15 height=30 xoffset=2 yoffset=15 xadvance=23 page=0 chnl=15
+char id=50 x=0 y=74 width=21 height=31 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=51 x=118 y=40 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=52 x=0 y=137 width=23 height=30 xoffset=0 yoffset=15 xadvance=23 page=0 chnl=15
+char id=53 x=22 y=74 width=20 height=31 xoffset=1 yoffset=15 xadvance=23 page=0 chnl=15
+char id=54 x=140 y=33 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=55 x=93 y=135 width=21 height=30 xoffset=1 yoffset=15 xadvance=23 page=0 chnl=15
+char id=56 x=162 y=33 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=57 x=74 y=40 width=21 height=32 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15
+char id=1040 x=190 y=65 width=29 height=30 xoffset=0 yoffset=15 xadvance=29 page=0 chnl=15
+char id=1041 x=24 y=137 width=22 height=30 xoffset=3 yoffset=15 xadvance=27 page=0 chnl=15
+char id=1042 x=213 y=96 width=23 height=30 xoffset=3 yoffset=15 xadvance=28 page=0 chnl=15
+char id=1043 x=115 y=135 width=20 height=30 xoffset=3 yoffset=15 xadvance=23 page=0 chnl=15
+char id=1044 x=73 y=0 width=32 height=39 xoffset=0 yoffset=15 xadvance=32 page=0 chnl=15
+char id=1045 x=237 y=96 width=18 height=30 xoffset=3 yoffset=15 xadvance=23 page=0 chnl=15
+char id=1046 x=43 y=74 width=40 height=30 xoffset=0 yoffset=15 xadvance=39 page=0 chnl=15
+char id=1047 x=0 y=41 width=24 height=32 xoffset=2 yoffset=14 xadvance=27 page=0 chnl=15
+char id=1048 x=29 y=106 width=28 height=30 xoffset=3 yoffset=15 xadvance=34 page=0 chnl=15
+char id=1049 x=0 y=0 width=28 height=40 xoffset=3 yoffset=5 xadvance=34 page=0 chnl=15
+char id=1050 x=58 y=105 width=25 height=30 xoffset=3 yoffset=15 xadvance=28 page=0 chnl=15
+char id=1051 x=213 y=33 width=28 height=31 xoffset=0 yoffset=15 xadvance=31 page=0 chnl=15
+char id=1052 x=124 y=73 width=33 height=30 xoffset=3 yoffset=15 xadvance=39 page=0 chnl=15
+char id=1053 x=136 y=104 width=25 height=30 xoffset=3 yoffset=15 xadvance=32 page=0 chnl=15
+char id=1054 x=211 y=0 width=29 height=32 xoffset=2 yoffset=14 xadvance=33 page=0 chnl=15
+char id=1055 x=84 y=104 width=25 height=30 xoffset=3 yoffset=15 xadvance=31 page=0 chnl=15
+char id=1056 x=47 y=137 width=22 height=30 xoffset=3 yoffset=15 xadvance=26 page=0 chnl=15
+char id=1057 x=50 y=40 width=23 height=32 xoffset=2 yoffset=14 xadvance=27 page=0 chnl=15
+char id=1058 x=188 y=97 width=24 height=30 xoffset=0 yoffset=15 xadvance=24 page=0 chnl=15
+char id=1059 x=184 y=33 width=28 height=31 xoffset=0 yoffset=15 xadvance=28 page=0 chnl=15
+char id=1060 x=177 y=0 width=33 height=32 xoffset=1 yoffset=14 xadvance=36 page=0 chnl=15
+char id=1061 x=0 y=106 width=28 height=30 xoffset=0 yoffset=15 xadvance=28 page=0 chnl=15
+char id=1062 x=106 y=0 width=29 height=39 xoffset=3 yoffset=15 xadvance=33 page=0 chnl=15
+char id=1063 x=110 y=104 width=25 height=30 xoffset=2 yoffset=15 xadvance=30 page=0 chnl=15
+char id=1064 x=84 y=73 width=39 height=30 xoffset=3 yoffset=15 xadvance=45 page=0 chnl=15
+char id=1065 x=29 y=0 width=43 height=39 xoffset=3 yoffset=15 xadvance=47 page=0 chnl=15
+char id=1066 x=220 y=65 width=29 height=30 xoffset=0 yoffset=15 xadvance=30 page=0 chnl=15
+char id=1067 x=158 y=66 width=31 height=30 xoffset=3 yoffset=15 xadvance=38 page=0 chnl=15
+char id=1068 x=70 y=136 width=22 height=30 xoffset=3 yoffset=15 xadvance=27 page=0 chnl=15
+char id=1069 x=25 y=41 width=24 height=32 xoffset=1 yoffset=14 xadvance=28 page=0 chnl=15
+char id=1070 x=136 y=0 width=40 height=32 xoffset=3 yoffset=14 xadvance=45 page=0 chnl=15
+char id=1071 x=162 y=97 width=25 height=30 xoffset=0 yoffset=15 xadvance=28 page=0 chnl=15
diff --git a/resources-round-454x454/fonts/noto-sans-rus-bold-42_0.png b/resources-round-454x454/fonts/noto-sans-rus-bold-42_0.png
new file mode 100644
index 00000000..07eaca80
Binary files /dev/null and b/resources-round-454x454/fonts/noto-sans-rus-bold-42_0.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-bold-128-tall.bmfc b/resources-round-454x454/fonts/titillium-web-bold-128-tall.bmfc
new file mode 100644
index 00000000..02e6d3c6
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-bold-128-tall.bmfc
@@ -0,0 +1,59 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web
+fontFile=
+charSet=0
+fontSize=-128
+aa=2
+scaleH=105
+useSmoothing=1
+isBold=1
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+widthPaddingFactor=0.00
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=48-57
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/titillium-web-bold-128-tall.fnt b/resources-round-454x454/fonts/titillium-web-bold-128-tall.fnt
new file mode 100644
index 00000000..f1440e72
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-bold-128-tall.fnt
@@ -0,0 +1,15 @@
+info face="Titillium Web" size=-128 bold=1 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=205 base=153 scaleW=256 scaleH=256 pages=2 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-bold-128-tall_0.png"
+page id=1 file="titillium-web-bold-128-tall_1.png"
+chars count=10
+char id=48 x=0 y=0 width=66 height=93 xoffset=3 yoffset=62 xadvance=71 page=0 chnl=15
+char id=49 x=63 y=0 width=44 height=89 xoffset=10 yoffset=64 xadvance=71 page=1 chnl=15
+char id=50 x=124 y=94 width=55 height=91 xoffset=8 yoffset=62 xadvance=71 page=0 chnl=15
+char id=51 x=197 y=0 width=57 height=93 xoffset=7 yoffset=62 xadvance=71 page=0 chnl=15
+char id=52 x=0 y=0 width=62 height=89 xoffset=5 yoffset=64 xadvance=71 page=1 chnl=15
+char id=53 x=64 y=94 width=59 height=91 xoffset=6 yoffset=64 xadvance=71 page=0 chnl=15
+char id=54 x=67 y=0 width=64 height=93 xoffset=4 yoffset=62 xadvance=71 page=0 chnl=15
+char id=55 x=180 y=94 width=54 height=91 xoffset=9 yoffset=64 xadvance=71 page=0 chnl=15
+char id=56 x=132 y=0 width=64 height=93 xoffset=4 yoffset=62 xadvance=71 page=0 chnl=15
+char id=57 x=0 y=94 width=63 height=93 xoffset=4 yoffset=62 xadvance=71 page=0 chnl=15
diff --git a/resources-round-454x454/fonts/titillium-web-bold-128-tall_0.png b/resources-round-454x454/fonts/titillium-web-bold-128-tall_0.png
new file mode 100644
index 00000000..d578889f
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-bold-128-tall_0.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-bold-128-tall_1.png b/resources-round-454x454/fonts/titillium-web-bold-128-tall_1.png
new file mode 100644
index 00000000..c57427ff
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-bold-128-tall_1.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-bold-85-tall.bmfc b/resources-round-454x454/fonts/titillium-web-bold-85-tall.bmfc
new file mode 100644
index 00000000..9b48b734
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-bold-85-tall.bmfc
@@ -0,0 +1,55 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web
+fontFile=
+charSet=0
+fontSize=-85
+aa=1
+scaleH=105
+useSmoothing=1
+isBold=1
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=48-57
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/titillium-web-bold-85-tall.fnt b/resources-round-454x454/fonts/titillium-web-bold-85-tall.fnt
new file mode 100644
index 00000000..8f6efb2e
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-bold-85-tall.fnt
@@ -0,0 +1,14 @@
+info face="Titillium Web" size=-85 bold=1 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=136 base=101 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-bold-85-tall_0.png"
+chars count=10
+char id=48 x=0 y=0 width=44 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
+char id=49 x=122 y=62 width=30 height=59 xoffset=6 yoffset=42 xadvance=48 page=0 chnl=15
+char id=50 x=217 y=0 width=37 height=60 xoffset=5 yoffset=41 xadvance=48 page=0 chnl=15
+char id=51 x=177 y=0 width=39 height=61 xoffset=4 yoffset=41 xadvance=48 page=0 chnl=15
+char id=52 x=79 y=62 width=42 height=59 xoffset=3 yoffset=42 xadvance=48 page=0 chnl=15
+char id=53 x=0 y=62 width=40 height=60 xoffset=4 yoffset=42 xadvance=48 page=0 chnl=15
+char id=54 x=134 y=0 width=42 height=61 xoffset=3 yoffset=41 xadvance=48 page=0 chnl=15
+char id=55 x=41 y=62 width=37 height=60 xoffset=5 yoffset=42 xadvance=48 page=0 chnl=15
+char id=56 x=45 y=0 width=44 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
+char id=57 x=90 y=0 width=43 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
diff --git a/resources-round-454x454/fonts/titillium-web-bold-85-tall_0.png b/resources-round-454x454/fonts/titillium-web-bold-85-tall_0.png
new file mode 100644
index 00000000..4a14baf8
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-bold-85-tall_0.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-light-128-tall.bmfc b/resources-round-454x454/fonts/titillium-web-light-128-tall.bmfc
new file mode 100644
index 00000000..fbeca927
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-light-128-tall.bmfc
@@ -0,0 +1,59 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web Light
+fontFile=
+charSet=0
+fontSize=-128
+aa=2
+scaleH=105
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+widthPaddingFactor=0.00
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=48-58
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/titillium-web-light-128-tall.fnt b/resources-round-454x454/fonts/titillium-web-light-128-tall.fnt
new file mode 100644
index 00000000..6e215bd0
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-light-128-tall.fnt
@@ -0,0 +1,16 @@
+info face="Titillium Web Light" size=-128 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=205 base=153 scaleW=256 scaleH=256 pages=2 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-light-128-tall_0.png"
+page id=1 file="titillium-web-light-128-tall_1.png"
+chars count=11
+char id=48 x=64 y=0 width=61 height=92 xoffset=6 yoffset=62 xadvance=71 page=0 chnl=15
+char id=49 x=221 y=93 width=34 height=89 xoffset=15 yoffset=64 xadvance=71 page=0 chnl=15
+char id=50 x=56 y=93 width=54 height=91 xoffset=9 yoffset=62 xadvance=71 page=0 chnl=15
+char id=51 x=0 y=93 width=55 height=92 xoffset=8 yoffset=62 xadvance=71 page=0 chnl=15
+char id=52 x=0 y=0 width=62 height=89 xoffset=5 yoffset=64 xadvance=71 page=1 chnl=15
+char id=53 x=111 y=93 width=56 height=90 xoffset=9 yoffset=64 xadvance=71 page=0 chnl=15
+char id=54 x=126 y=0 width=59 height=92 xoffset=7 yoffset=62 xadvance=71 page=0 chnl=15
+char id=55 x=168 y=93 width=52 height=90 xoffset=10 yoffset=64 xadvance=71 page=0 chnl=15
+char id=56 x=0 y=0 width=63 height=92 xoffset=4 yoffset=62 xadvance=71 page=0 chnl=15
+char id=57 x=186 y=0 width=59 height=92 xoffset=6 yoffset=62 xadvance=71 page=0 chnl=15
+char id=58 x=246 y=0 width=9 height=59 xoffset=9 yoffset=94 xadvance=26 page=0 chnl=15
diff --git a/resources-round-454x454/fonts/titillium-web-light-128-tall_0.png b/resources-round-454x454/fonts/titillium-web-light-128-tall_0.png
new file mode 100644
index 00000000..18af9743
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-light-128-tall_0.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-light-128-tall_1.png b/resources-round-454x454/fonts/titillium-web-light-128-tall_1.png
new file mode 100644
index 00000000..e4417050
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-light-128-tall_1.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-light-85-tall.bmfc b/resources-round-454x454/fonts/titillium-web-light-85-tall.bmfc
new file mode 100644
index 00000000..07f5271e
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-light-85-tall.bmfc
@@ -0,0 +1,55 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web Light
+fontFile=
+charSet=0
+fontSize=-85
+aa=1
+scaleH=105
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=48-57
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/titillium-web-light-85-tall.fnt b/resources-round-454x454/fonts/titillium-web-light-85-tall.fnt
new file mode 100644
index 00000000..4a1645c7
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-light-85-tall.fnt
@@ -0,0 +1,15 @@
+info face="Titillium Web Light" size=-85 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=136 base=101 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-light-85-tall_0.png"
+chars count=10
+char id=48 x=44 y=0 width=41 height=61 xoffset=3 yoffset=41 xadvance=48 page=0 chnl=15
+char id=49 x=117 y=62 width=23 height=59 xoffset=10 yoffset=42 xadvance=48 page=0 chnl=15
+char id=50 x=0 y=62 width=36 height=60 xoffset=6 yoffset=41 xadvance=48 page=0 chnl=15
+char id=51 x=168 y=0 width=37 height=61 xoffset=5 yoffset=41 xadvance=48 page=0 chnl=15
+char id=52 x=74 y=62 width=42 height=59 xoffset=3 yoffset=42 xadvance=48 page=0 chnl=15
+char id=53 x=206 y=0 width=38 height=60 xoffset=5 yoffset=42 xadvance=48 page=0 chnl=15
+char id=54 x=86 y=0 width=40 height=61 xoffset=4 yoffset=41 xadvance=48 page=0 chnl=15
+char id=55 x=37 y=62 width=36 height=60 xoffset=6 yoffset=42 xadvance=48 page=0 chnl=15
+char id=56 x=0 y=0 width=43 height=61 xoffset=2 yoffset=41 xadvance=48 page=0 chnl=15
+char id=57 x=127 y=0 width=40 height=61 xoffset=3 yoffset=41 xadvance=48 page=0 chnl=15
+char id=58 x=145 y=62 width=12 height=61 xoffset=3 yoffset=41 xadvance=12 page=0 chnl=15
diff --git a/resources-round-454x454/fonts/titillium-web-light-85-tall_0.png b/resources-round-454x454/fonts/titillium-web-light-85-tall_0.png
new file mode 100644
index 00000000..14126c87
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-light-85-tall_0.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-semibold-30.bmfc b/resources-round-454x454/fonts/titillium-web-semibold-30.bmfc
new file mode 100644
index 00000000..233b5488
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-semibold-30.bmfc
@@ -0,0 +1,57 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web SemiBold
+fontFile=
+charSet=0
+fontSize=-30
+aa=1
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=1
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=32,48-57,65-90,192-223,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292
+chars=294,296,298,300,302,304,308,310,313,315,317,321,323,325,327,330,332,334,336,338,340,342,344,346
+chars=348,350,352,356,358,360,362,364,366,368,370,372,374,376-377,379,381
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/titillium-web-semibold-30.fnt b/resources-round-454x454/fonts/titillium-web-semibold-30.fnt
new file mode 100644
index 00000000..b892fcce
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-semibold-30.fnt
@@ -0,0 +1,555 @@
+info face="Titillium Web SemiBold" size=-30 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=46 base=34 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-semibold-30_0.png"
+chars count=129
+char id=32 x=251 y=145 width=3 height=1 xoffset=-1 yoffset=45 xadvance=7 page=0 chnl=15
+char id=48 x=194 y=146 width=17 height=22 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=49 x=243 y=169 width=11 height=20 xoffset=2 yoffset=14 xadvance=17 page=0 chnl=15
+char id=50 x=224 y=191 width=15 height=21 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15
+char id=51 x=49 y=175 width=15 height=22 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15
+char id=52 x=89 y=219 width=16 height=20 xoffset=0 yoffset=14 xadvance=17 page=0 chnl=15
+char id=53 x=208 y=191 width=15 height=21 xoffset=1 yoffset=14 xadvance=17 page=0 chnl=15
+char id=54 x=229 y=146 width=16 height=22 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=55 x=31 y=222 width=14 height=21 xoffset=1 yoffset=14 xadvance=17 page=0 chnl=15
+char id=56 x=176 y=147 width=17 height=22 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=57 x=212 y=146 width=16 height=22 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=65 x=205 y=169 width=18 height=21 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15
+char id=66 x=140 y=194 width=16 height=21 xoffset=2 yoffset=13 xadvance=18 page=0 chnl=15
+char id=67 x=33 y=177 width=15 height=22 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=68 x=106 y=195 width=16 height=21 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=15
+char id=69 x=16 y=222 width=14 height=21 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=15
+char id=70 x=46 y=222 width=14 height=21 xoffset=2 yoffset=13 xadvance=16 page=0 chnl=15
+char id=71 x=0 y=177 width=16 height=22 xoffset=1 yoffset=13 xadvance=18 page=0 chnl=15
+char id=72 x=0 y=200 width=17 height=21 xoffset=2 yoffset=13 xadvance=20 page=0 chnl=15
+char id=73 x=246 y=145 width=4 height=21 xoffset=2 yoffset=13 xadvance=8 page=0 chnl=15
+char id=74 x=86 y=148 width=7 height=24 xoffset=0 yoffset=13 xadvance=9 page=0 chnl=15
+char id=75 x=240 y=191 width=15 height=21 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=15
+char id=76 x=75 y=219 width=13 height=21 xoffset=2 yoffset=13 xadvance=14 page=0 chnl=15
+char id=77 x=120 y=172 width=22 height=21 xoffset=2 yoffset=13 xadvance=25 page=0 chnl=15
+char id=78 x=54 y=198 width=17 height=21 xoffset=2 yoffset=13 xadvance=21 page=0 chnl=15
+char id=79 x=139 y=148 width=18 height=22 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15
+char id=80 x=89 y=197 width=16 height=21 xoffset=2 yoffset=13 xadvance=18 page=0 chnl=15
+char id=81 x=48 y=148 width=18 height=26 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15
+char id=82 x=191 y=192 width=16 height=21 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=15
+char id=83 x=17 y=177 width=15 height=22 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=84 x=72 y=197 width=16 height=21 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=85 x=158 y=147 width=17 height=22 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15
+char id=86 x=224 y=169 width=18 height=21 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15
+char id=87 x=65 y=175 width=27 height=21 xoffset=0 yoffset=13 xadvance=27 page=0 chnl=15
+char id=88 x=36 y=200 width=17 height=21 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15
+char id=89 x=18 y=200 width=17 height=21 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=90 x=0 y=222 width=15 height=21 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=192 x=153 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=193 x=58 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=194 x=77 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=195 x=96 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=196 x=159 y=119 width=18 height=27 xoffset=0 yoffset=7 xadvance=18 page=0 chnl=15
+char id=197 x=67 y=148 width=18 height=26 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=15
+char id=198 x=93 y=173 width=26 height=21 xoffset=0 yoffset=13 xadvance=26 page=0 chnl=15
+char id=199 x=207 y=89 width=15 height=28 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=200 x=0 y=120 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=201 x=60 y=119 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=202 x=75 y=119 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=203 x=15 y=149 width=14 height=27 xoffset=2 yoffset=7 xadvance=17 page=0 chnl=15
+char id=204 x=245 y=0 width=9 height=28 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=205 x=130 y=119 width=9 height=28 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15
+char id=206 x=104 y=119 width=12 height=28 xoffset=-2 yoffset=6 xadvance=8 page=0 chnl=15
+char id=207 x=245 y=117 width=10 height=27 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=208 x=185 y=170 width=19 height=21 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15
+char id=209 x=0 y=91 width=17 height=28 xoffset=2 yoffset=6 xadvance=21 page=0 chnl=15
+char id=210 x=226 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=211 x=207 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=212 x=188 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=213 x=169 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=214 x=39 y=61 width=18 height=28 xoffset=1 yoffset=7 xadvance=20 page=0 chnl=15
+char id=215 x=106 y=217 width=14 height=13 xoffset=1 yoffset=20 xadvance=17 page=0 chnl=15
+char id=216 x=134 y=61 width=18 height=28 xoffset=1 yoffset=10 xadvance=20 page=0 chnl=15
+char id=217 x=54 y=31 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=218 x=36 y=31 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=219 x=18 y=31 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=220 x=36 y=90 width=17 height=28 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=15
+char id=221 x=18 y=91 width=17 height=28 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=222 x=157 y=193 width=16 height=21 xoffset=2 yoffset=13 xadvance=18 page=0 chnl=15
+char id=223 x=121 y=148 width=17 height=23 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
+char id=256 x=140 y=119 width=18 height=27 xoffset=0 yoffset=7 xadvance=18 page=0 chnl=15
+char id=258 x=115 y=61 width=18 height=28 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15
+char id=260 x=0 y=62 width=19 height=28 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15
+char id=262 x=156 y=30 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=264 x=124 y=31 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=266 x=223 y=89 width=15 height=28 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=268 x=204 y=30 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=270 x=141 y=90 width=16 height=28 xoffset=2 yoffset=6 xadvance=19 page=0 chnl=15
+char id=272 x=165 y=170 width=19 height=21 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15
+char id=274 x=230 y=118 width=14 height=27 xoffset=2 yoffset=7 xadvance=17 page=0 chnl=15
+char id=276 x=15 y=120 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=278 x=0 y=149 width=14 height=27 xoffset=2 yoffset=7 xadvance=17 page=0 chnl=15
+char id=280 x=30 y=120 width=14 height=28 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=15
+char id=282 x=45 y=119 width=14 height=28 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15
+char id=284 x=107 y=31 width=16 height=29 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=15
+char id=286 x=90 y=31 width=16 height=29 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=15
+char id=288 x=158 y=90 width=16 height=28 xoffset=1 yoffset=7 xadvance=18 page=0 chnl=15
+char id=290 x=86 y=0 width=16 height=30 xoffset=1 yoffset=13 xadvance=18 page=0 chnl=15
+char id=292 x=172 y=60 width=17 height=28 xoffset=2 yoffset=6 xadvance=20 page=0 chnl=15
+char id=294 x=143 y=171 width=21 height=21 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15
+char id=296 x=117 y=119 width=12 height=28 xoffset=-2 yoffset=6 xadvance=8 page=0 chnl=15
+char id=298 x=30 y=149 width=12 height=27 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=15
+char id=300 x=244 y=59 width=11 height=28 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=302 x=248 y=29 width=7 height=28 xoffset=0 yoffset=13 xadvance=8 page=0 chnl=15
+char id=304 x=43 y=149 width=4 height=27 xoffset=2 yoffset=7 xadvance=8 page=0 chnl=15
+char id=308 x=0 y=0 width=12 height=31 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=15
+char id=310 x=120 y=0 width=15 height=30 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=15
+char id=313 x=90 y=119 width=13 height=28 xoffset=2 yoffset=6 xadvance=14 page=0 chnl=15
+char id=315 x=136 y=0 width=13 height=30 xoffset=2 yoffset=13 xadvance=14 page=0 chnl=15
+char id=317 x=61 y=220 width=13 height=21 xoffset=2 yoffset=13 xadvance=15 page=0 chnl=15
+char id=321 x=123 y=194 width=16 height=21 xoffset=-1 yoffset=13 xadvance=14 page=0 chnl=15
+char id=323 x=208 y=60 width=17 height=28 xoffset=2 yoffset=6 xadvance=21 page=0 chnl=15
+char id=325 x=68 y=0 width=17 height=30 xoffset=2 yoffset=13 xadvance=21 page=0 chnl=15
+char id=327 x=190 y=60 width=17 height=28 xoffset=2 yoffset=6 xadvance=21 page=0 chnl=15
+char id=330 x=178 y=118 width=17 height=27 xoffset=2 yoffset=13 xadvance=21 page=0 chnl=15
+char id=332 x=20 y=61 width=18 height=28 xoffset=1 yoffset=7 xadvance=20 page=0 chnl=15
+char id=334 x=150 y=0 width=18 height=29 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15
+char id=336 x=13 y=0 width=18 height=30 xoffset=1 yoffset=5 xadvance=20 page=0 chnl=15
+char id=338 x=94 y=148 width=26 height=23 xoffset=1 yoffset=12 xadvance=27 page=0 chnl=15
+char id=340 x=124 y=90 width=16 height=28 xoffset=2 yoffset=6 xadvance=19 page=0 chnl=15
+char id=342 x=103 y=0 width=16 height=30 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=15
+char id=344 x=107 y=90 width=16 height=28 xoffset=2 yoffset=6 xadvance=19 page=0 chnl=15
+char id=346 x=172 y=30 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=348 x=188 y=30 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=350 x=175 y=89 width=15 height=28 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=352 x=140 y=31 width=15 height=29 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=356 x=90 y=90 width=16 height=28 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=358 x=174 y=192 width=16 height=21 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15
+char id=360 x=0 y=32 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=362 x=226 y=59 width=17 height=28 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=15
+char id=364 x=72 y=31 width=17 height=29 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=366 x=50 y=0 width=17 height=30 xoffset=1 yoffset=5 xadvance=19 page=0 chnl=15
+char id=368 x=32 y=0 width=17 height=30 xoffset=1 yoffset=5 xadvance=19 page=0 chnl=15
+char id=370 x=54 y=90 width=17 height=28 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15
+char id=372 x=220 y=30 width=27 height=28 xoffset=0 yoffset=6 xadvance=27 page=0 chnl=15
+char id=374 x=72 y=90 width=17 height=28 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=376 x=196 y=118 width=17 height=27 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15
+char id=377 x=239 y=88 width=15 height=28 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=379 x=214 y=118 width=15 height=27 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=381 x=191 y=89 width=15 height=28 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+kernings count=421
+kerning first=65 second=84 amount=-1
+kerning first=65 second=356 amount=-1
+kerning first=65 second=358 amount=-1
+kerning first=65 second=87 amount=-1
+kerning first=65 second=372 amount=-1
+kerning first=65 second=89 amount=-2
+kerning first=65 second=221 amount=-2
+kerning first=65 second=374 amount=-2
+kerning first=65 second=376 amount=-2
+kerning first=68 second=89 amount=-1
+kerning first=68 second=221 amount=-1
+kerning first=68 second=374 amount=-1
+kerning first=68 second=376 amount=-1
+kerning first=76 second=84 amount=-3
+kerning first=76 second=356 amount=-3
+kerning first=76 second=358 amount=-3
+kerning first=76 second=87 amount=-1
+kerning first=76 second=372 amount=-1
+kerning first=76 second=89 amount=-3
+kerning first=76 second=221 amount=-3
+kerning first=76 second=374 amount=-3
+kerning first=76 second=376 amount=-3
+kerning first=79 second=89 amount=-1
+kerning first=79 second=221 amount=-1
+kerning first=79 second=374 amount=-1
+kerning first=79 second=376 amount=-1
+kerning first=81 second=89 amount=-1
+kerning first=81 second=221 amount=-1
+kerning first=81 second=374 amount=-1
+kerning first=81 second=376 amount=-1
+kerning first=82 second=89 amount=-1
+kerning first=82 second=221 amount=-1
+kerning first=82 second=374 amount=-1
+kerning first=82 second=376 amount=-1
+kerning first=84 second=65 amount=-1
+kerning first=84 second=192 amount=-1
+kerning first=84 second=193 amount=-1
+kerning first=84 second=194 amount=-1
+kerning first=84 second=195 amount=-1
+kerning first=84 second=196 amount=-1
+kerning first=84 second=197 amount=-1
+kerning first=84 second=256 amount=-1
+kerning first=84 second=258 amount=-1
+kerning first=84 second=260 amount=-1
+kerning first=87 second=65 amount=-1
+kerning first=87 second=192 amount=-1
+kerning first=87 second=193 amount=-1
+kerning first=87 second=194 amount=-1
+kerning first=87 second=195 amount=-1
+kerning first=87 second=196 amount=-1
+kerning first=87 second=197 amount=-1
+kerning first=87 second=256 amount=-1
+kerning first=87 second=258 amount=-1
+kerning first=87 second=260 amount=-1
+kerning first=89 second=67 amount=-1
+kerning first=89 second=199 amount=-1
+kerning first=89 second=262 amount=-1
+kerning first=89 second=264 amount=-1
+kerning first=89 second=266 amount=-1
+kerning first=89 second=268 amount=-1
+kerning first=89 second=71 amount=-1
+kerning first=89 second=79 amount=-1
+kerning first=89 second=81 amount=-1
+kerning first=89 second=210 amount=-1
+kerning first=89 second=211 amount=-1
+kerning first=89 second=212 amount=-1
+kerning first=89 second=213 amount=-1
+kerning first=89 second=214 amount=-1
+kerning first=89 second=216 amount=-1
+kerning first=89 second=284 amount=-1
+kerning first=89 second=286 amount=-1
+kerning first=89 second=288 amount=-1
+kerning first=89 second=290 amount=-1
+kerning first=89 second=332 amount=-1
+kerning first=89 second=334 amount=-1
+kerning first=89 second=336 amount=-1
+kerning first=89 second=338 amount=-1
+kerning first=89 second=83 amount=-1
+kerning first=89 second=346 amount=-1
+kerning first=89 second=348 amount=-1
+kerning first=89 second=350 amount=-1
+kerning first=89 second=352 amount=-1
+kerning first=89 second=65 amount=-2
+kerning first=89 second=192 amount=-2
+kerning first=89 second=193 amount=-2
+kerning first=89 second=194 amount=-2
+kerning first=89 second=195 amount=-2
+kerning first=89 second=196 amount=-2
+kerning first=89 second=197 amount=-2
+kerning first=89 second=256 amount=-2
+kerning first=89 second=258 amount=-2
+kerning first=89 second=260 amount=-2
+kerning first=89 second=74 amount=-1
+kerning first=89 second=308 amount=-1
+kerning first=192 second=84 amount=-1
+kerning first=192 second=356 amount=-1
+kerning first=192 second=358 amount=-1
+kerning first=192 second=87 amount=-1
+kerning first=192 second=372 amount=-1
+kerning first=192 second=89 amount=-2
+kerning first=192 second=221 amount=-2
+kerning first=192 second=374 amount=-2
+kerning first=192 second=376 amount=-2
+kerning first=193 second=84 amount=-1
+kerning first=193 second=356 amount=-1
+kerning first=193 second=358 amount=-1
+kerning first=193 second=87 amount=-1
+kerning first=193 second=372 amount=-1
+kerning first=193 second=89 amount=-2
+kerning first=193 second=221 amount=-2
+kerning first=193 second=374 amount=-2
+kerning first=193 second=376 amount=-2
+kerning first=194 second=84 amount=-1
+kerning first=194 second=356 amount=-1
+kerning first=194 second=358 amount=-1
+kerning first=194 second=87 amount=-1
+kerning first=194 second=372 amount=-1
+kerning first=194 second=89 amount=-2
+kerning first=194 second=221 amount=-2
+kerning first=194 second=374 amount=-2
+kerning first=194 second=376 amount=-2
+kerning first=195 second=84 amount=-1
+kerning first=195 second=356 amount=-1
+kerning first=195 second=358 amount=-1
+kerning first=195 second=87 amount=-1
+kerning first=195 second=372 amount=-1
+kerning first=195 second=89 amount=-2
+kerning first=195 second=221 amount=-2
+kerning first=195 second=374 amount=-2
+kerning first=195 second=376 amount=-2
+kerning first=196 second=84 amount=-1
+kerning first=196 second=356 amount=-1
+kerning first=196 second=358 amount=-1
+kerning first=196 second=87 amount=-1
+kerning first=196 second=372 amount=-1
+kerning first=196 second=89 amount=-2
+kerning first=196 second=221 amount=-2
+kerning first=196 second=374 amount=-2
+kerning first=196 second=376 amount=-2
+kerning first=197 second=84 amount=-1
+kerning first=197 second=356 amount=-1
+kerning first=197 second=358 amount=-1
+kerning first=197 second=87 amount=-1
+kerning first=197 second=372 amount=-1
+kerning first=197 second=89 amount=-2
+kerning first=197 second=221 amount=-2
+kerning first=197 second=374 amount=-2
+kerning first=197 second=376 amount=-2
+kerning first=208 second=89 amount=-1
+kerning first=208 second=221 amount=-1
+kerning first=208 second=374 amount=-1
+kerning first=208 second=376 amount=-1
+kerning first=210 second=89 amount=-1
+kerning first=210 second=221 amount=-1
+kerning first=210 second=374 amount=-1
+kerning first=210 second=376 amount=-1
+kerning first=211 second=89 amount=-1
+kerning first=211 second=221 amount=-1
+kerning first=211 second=374 amount=-1
+kerning first=211 second=376 amount=-1
+kerning first=212 second=89 amount=-1
+kerning first=212 second=221 amount=-1
+kerning first=212 second=374 amount=-1
+kerning first=212 second=376 amount=-1
+kerning first=213 second=89 amount=-1
+kerning first=213 second=221 amount=-1
+kerning first=213 second=374 amount=-1
+kerning first=213 second=376 amount=-1
+kerning first=214 second=89 amount=-1
+kerning first=214 second=221 amount=-1
+kerning first=214 second=374 amount=-1
+kerning first=214 second=376 amount=-1
+kerning first=216 second=89 amount=-1
+kerning first=216 second=221 amount=-1
+kerning first=216 second=374 amount=-1
+kerning first=216 second=376 amount=-1
+kerning first=221 second=67 amount=-1
+kerning first=221 second=199 amount=-1
+kerning first=221 second=262 amount=-1
+kerning first=221 second=264 amount=-1
+kerning first=221 second=266 amount=-1
+kerning first=221 second=268 amount=-1
+kerning first=221 second=71 amount=-1
+kerning first=221 second=79 amount=-1
+kerning first=221 second=81 amount=-1
+kerning first=221 second=210 amount=-1
+kerning first=221 second=211 amount=-1
+kerning first=221 second=212 amount=-1
+kerning first=221 second=213 amount=-1
+kerning first=221 second=214 amount=-1
+kerning first=221 second=216 amount=-1
+kerning first=221 second=284 amount=-1
+kerning first=221 second=286 amount=-1
+kerning first=221 second=288 amount=-1
+kerning first=221 second=290 amount=-1
+kerning first=221 second=332 amount=-1
+kerning first=221 second=334 amount=-1
+kerning first=221 second=336 amount=-1
+kerning first=221 second=338 amount=-1
+kerning first=221 second=83 amount=-1
+kerning first=221 second=346 amount=-1
+kerning first=221 second=348 amount=-1
+kerning first=221 second=350 amount=-1
+kerning first=221 second=352 amount=-1
+kerning first=221 second=65 amount=-2
+kerning first=221 second=192 amount=-2
+kerning first=221 second=193 amount=-2
+kerning first=221 second=194 amount=-2
+kerning first=221 second=195 amount=-2
+kerning first=221 second=196 amount=-2
+kerning first=221 second=197 amount=-2
+kerning first=221 second=256 amount=-2
+kerning first=221 second=258 amount=-2
+kerning first=221 second=260 amount=-2
+kerning first=221 second=74 amount=-1
+kerning first=221 second=308 amount=-1
+kerning first=256 second=84 amount=-1
+kerning first=256 second=356 amount=-1
+kerning first=256 second=358 amount=-1
+kerning first=256 second=87 amount=-1
+kerning first=256 second=372 amount=-1
+kerning first=256 second=89 amount=-2
+kerning first=256 second=221 amount=-2
+kerning first=256 second=374 amount=-2
+kerning first=256 second=376 amount=-2
+kerning first=258 second=84 amount=-1
+kerning first=258 second=356 amount=-1
+kerning first=258 second=358 amount=-1
+kerning first=258 second=87 amount=-1
+kerning first=258 second=372 amount=-1
+kerning first=258 second=89 amount=-2
+kerning first=258 second=221 amount=-2
+kerning first=258 second=374 amount=-2
+kerning first=258 second=376 amount=-2
+kerning first=260 second=84 amount=-1
+kerning first=260 second=356 amount=-1
+kerning first=260 second=358 amount=-1
+kerning first=260 second=87 amount=-1
+kerning first=260 second=372 amount=-1
+kerning first=260 second=89 amount=-2
+kerning first=260 second=221 amount=-2
+kerning first=260 second=374 amount=-2
+kerning first=260 second=376 amount=-2
+kerning first=270 second=89 amount=-1
+kerning first=270 second=221 amount=-1
+kerning first=270 second=374 amount=-1
+kerning first=270 second=376 amount=-1
+kerning first=272 second=89 amount=-1
+kerning first=272 second=221 amount=-1
+kerning first=272 second=374 amount=-1
+kerning first=272 second=376 amount=-1
+kerning first=313 second=84 amount=-3
+kerning first=313 second=356 amount=-3
+kerning first=313 second=358 amount=-3
+kerning first=313 second=87 amount=-1
+kerning first=313 second=372 amount=-1
+kerning first=313 second=89 amount=-3
+kerning first=313 second=221 amount=-3
+kerning first=313 second=374 amount=-3
+kerning first=313 second=376 amount=-3
+kerning first=315 second=84 amount=-3
+kerning first=315 second=356 amount=-3
+kerning first=315 second=358 amount=-3
+kerning first=315 second=87 amount=-1
+kerning first=315 second=372 amount=-1
+kerning first=315 second=89 amount=-3
+kerning first=315 second=221 amount=-3
+kerning first=315 second=374 amount=-3
+kerning first=315 second=376 amount=-3
+kerning first=317 second=84 amount=-3
+kerning first=317 second=356 amount=-3
+kerning first=317 second=358 amount=-3
+kerning first=317 second=87 amount=-1
+kerning first=317 second=372 amount=-1
+kerning first=317 second=89 amount=-3
+kerning first=317 second=221 amount=-3
+kerning first=317 second=374 amount=-3
+kerning first=317 second=376 amount=-3
+kerning first=321 second=84 amount=-3
+kerning first=321 second=356 amount=-3
+kerning first=321 second=358 amount=-3
+kerning first=321 second=87 amount=-1
+kerning first=321 second=372 amount=-1
+kerning first=321 second=89 amount=-3
+kerning first=321 second=221 amount=-3
+kerning first=321 second=374 amount=-3
+kerning first=321 second=376 amount=-3
+kerning first=332 second=89 amount=-1
+kerning first=332 second=221 amount=-1
+kerning first=332 second=374 amount=-1
+kerning first=332 second=376 amount=-1
+kerning first=334 second=89 amount=-1
+kerning first=334 second=221 amount=-1
+kerning first=334 second=374 amount=-1
+kerning first=334 second=376 amount=-1
+kerning first=336 second=89 amount=-1
+kerning first=336 second=221 amount=-1
+kerning first=336 second=374 amount=-1
+kerning first=336 second=376 amount=-1
+kerning first=340 second=89 amount=-1
+kerning first=340 second=221 amount=-1
+kerning first=340 second=374 amount=-1
+kerning first=340 second=376 amount=-1
+kerning first=342 second=89 amount=-1
+kerning first=342 second=221 amount=-1
+kerning first=342 second=374 amount=-1
+kerning first=342 second=376 amount=-1
+kerning first=344 second=89 amount=-1
+kerning first=344 second=221 amount=-1
+kerning first=344 second=374 amount=-1
+kerning first=344 second=376 amount=-1
+kerning first=356 second=65 amount=-1
+kerning first=356 second=192 amount=-1
+kerning first=356 second=193 amount=-1
+kerning first=356 second=194 amount=-1
+kerning first=356 second=195 amount=-1
+kerning first=356 second=196 amount=-1
+kerning first=356 second=197 amount=-1
+kerning first=356 second=256 amount=-1
+kerning first=356 second=258 amount=-1
+kerning first=356 second=260 amount=-1
+kerning first=358 second=65 amount=-1
+kerning first=358 second=192 amount=-1
+kerning first=358 second=193 amount=-1
+kerning first=358 second=194 amount=-1
+kerning first=358 second=195 amount=-1
+kerning first=358 second=196 amount=-1
+kerning first=358 second=197 amount=-1
+kerning first=358 second=256 amount=-1
+kerning first=358 second=258 amount=-1
+kerning first=358 second=260 amount=-1
+kerning first=372 second=65 amount=-1
+kerning first=372 second=192 amount=-1
+kerning first=372 second=193 amount=-1
+kerning first=372 second=194 amount=-1
+kerning first=372 second=195 amount=-1
+kerning first=372 second=196 amount=-1
+kerning first=372 second=197 amount=-1
+kerning first=372 second=256 amount=-1
+kerning first=372 second=258 amount=-1
+kerning first=372 second=260 amount=-1
+kerning first=374 second=67 amount=-1
+kerning first=374 second=199 amount=-1
+kerning first=374 second=262 amount=-1
+kerning first=374 second=264 amount=-1
+kerning first=374 second=266 amount=-1
+kerning first=374 second=268 amount=-1
+kerning first=374 second=71 amount=-1
+kerning first=374 second=79 amount=-1
+kerning first=374 second=81 amount=-1
+kerning first=374 second=210 amount=-1
+kerning first=374 second=211 amount=-1
+kerning first=374 second=212 amount=-1
+kerning first=374 second=213 amount=-1
+kerning first=374 second=214 amount=-1
+kerning first=374 second=216 amount=-1
+kerning first=374 second=284 amount=-1
+kerning first=374 second=286 amount=-1
+kerning first=374 second=288 amount=-1
+kerning first=374 second=290 amount=-1
+kerning first=374 second=332 amount=-1
+kerning first=374 second=334 amount=-1
+kerning first=374 second=336 amount=-1
+kerning first=374 second=338 amount=-1
+kerning first=374 second=83 amount=-1
+kerning first=374 second=346 amount=-1
+kerning first=374 second=348 amount=-1
+kerning first=374 second=350 amount=-1
+kerning first=374 second=352 amount=-1
+kerning first=374 second=65 amount=-2
+kerning first=374 second=192 amount=-2
+kerning first=374 second=193 amount=-2
+kerning first=374 second=194 amount=-2
+kerning first=374 second=195 amount=-2
+kerning first=374 second=196 amount=-2
+kerning first=374 second=197 amount=-2
+kerning first=374 second=256 amount=-2
+kerning first=374 second=258 amount=-2
+kerning first=374 second=260 amount=-2
+kerning first=374 second=74 amount=-1
+kerning first=374 second=308 amount=-1
+kerning first=376 second=67 amount=-1
+kerning first=376 second=199 amount=-1
+kerning first=376 second=262 amount=-1
+kerning first=376 second=264 amount=-1
+kerning first=376 second=266 amount=-1
+kerning first=376 second=268 amount=-1
+kerning first=376 second=71 amount=-1
+kerning first=376 second=79 amount=-1
+kerning first=376 second=81 amount=-1
+kerning first=376 second=210 amount=-1
+kerning first=376 second=211 amount=-1
+kerning first=376 second=212 amount=-1
+kerning first=376 second=213 amount=-1
+kerning first=376 second=214 amount=-1
+kerning first=376 second=216 amount=-1
+kerning first=376 second=284 amount=-1
+kerning first=376 second=286 amount=-1
+kerning first=376 second=288 amount=-1
+kerning first=376 second=290 amount=-1
+kerning first=376 second=332 amount=-1
+kerning first=376 second=334 amount=-1
+kerning first=376 second=336 amount=-1
+kerning first=376 second=338 amount=-1
+kerning first=376 second=83 amount=-1
+kerning first=376 second=346 amount=-1
+kerning first=376 second=348 amount=-1
+kerning first=376 second=350 amount=-1
+kerning first=376 second=352 amount=-1
+kerning first=376 second=65 amount=-2
+kerning first=376 second=192 amount=-2
+kerning first=376 second=193 amount=-2
+kerning first=376 second=194 amount=-2
+kerning first=376 second=195 amount=-2
+kerning first=376 second=196 amount=-2
+kerning first=376 second=197 amount=-2
+kerning first=376 second=256 amount=-2
+kerning first=376 second=258 amount=-2
+kerning first=376 second=260 amount=-2
+kerning first=376 second=74 amount=-1
+kerning first=376 second=308 amount=-1
diff --git a/resources-round-454x454/fonts/titillium-web-semibold-30_0.png b/resources-round-454x454/fonts/titillium-web-semibold-30_0.png
new file mode 100644
index 00000000..d6834032
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-semibold-30_0.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-semibold-45.bmfc b/resources-round-454x454/fonts/titillium-web-semibold-45.bmfc
new file mode 100644
index 00000000..4c1ad06e
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-semibold-45.bmfc
@@ -0,0 +1,61 @@
+# AngelCode Bitmap Font Generator configuration file
+fileVersion=1
+
+# font settings
+fontName=Titillium Web SemiBold
+fontFile=
+charSet=0
+fontSize=-45
+aa=2
+scaleH=100
+useSmoothing=1
+isBold=0
+isItalic=0
+useUnicode=1
+disableBoxChars=1
+outputInvalidCharGlyph=0
+dontIncludeKerningPairs=0
+useHinting=1
+renderFromOutline=0
+useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
+
+# character alignment
+paddingDown=0
+paddingUp=0
+paddingRight=0
+paddingLeft=0
+spacingHoriz=1
+spacingVert=1
+useFixedHeight=0
+forceZero=0
+widthPaddingFactor=0.00
+
+# output file
+outWidth=256
+outHeight=256
+outBitDepth=8
+fontDescFormat=0
+fourChnlPacked=0
+textureFormat=png
+textureCompression=0
+alphaChnl=1
+redChnl=0
+greenChnl=0
+blueChnl=0
+invA=0
+invR=0
+invG=0
+invB=0
+
+# outline
+outlineThickness=0
+
+# selected chars
+chars=32,48-57,65-90,192-223,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292
+chars=294,296,298,300,302,304,308,310,313,315,317,321,323,325,327,330,332,334,336,338,340,342,344,346
+chars=348,350,352,356,358,360,362,364,366,368,370,372,374,376-377,379,381
+
+# imported icon images
diff --git a/resources-round-454x454/fonts/titillium-web-semibold-45.fnt b/resources-round-454x454/fonts/titillium-web-semibold-45.fnt
new file mode 100644
index 00000000..033f5edb
--- /dev/null
+++ b/resources-round-454x454/fonts/titillium-web-semibold-45.fnt
@@ -0,0 +1,688 @@
+info face="Titillium Web SemiBold" size=-45 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=69 base=51 scaleW=256 scaleH=256 pages=2 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="titillium-web-semibold-45_0.png"
+page id=1 file="titillium-web-semibold-45_1.png"
+chars count=129
+char id=32 x=251 y=44 width=2 height=1 xoffset=0 yoffset=68 xadvance=10 page=0 chnl=15
+char id=48 x=139 y=85 width=23 height=32 xoffset=1 yoffset=20 xadvance=25 page=1 chnl=15
+char id=49 x=192 y=182 width=15 height=30 xoffset=4 yoffset=21 xadvance=25 page=1 chnl=15
+char id=50 x=88 y=189 width=20 height=31 xoffset=3 yoffset=20 xadvance=25 page=1 chnl=15
+char id=51 x=235 y=85 width=20 height=32 xoffset=2 yoffset=20 xadvance=25 page=1 chnl=15
+char id=52 x=169 y=183 width=22 height=30 xoffset=1 yoffset=21 xadvance=25 page=1 chnl=15
+char id=53 x=23 y=191 width=21 height=31 xoffset=2 yoffset=21 xadvance=25 page=1 chnl=15
+char id=54 x=211 y=85 width=23 height=32 xoffset=1 yoffset=20 xadvance=25 page=1 chnl=15
+char id=55 x=130 y=189 width=19 height=31 xoffset=3 yoffset=21 xadvance=25 page=1 chnl=15
+char id=56 x=187 y=85 width=23 height=32 xoffset=1 yoffset=20 xadvance=25 page=1 chnl=15
+char id=57 x=0 y=126 width=22 height=32 xoffset=1 yoffset=20 xadvance=25 page=1 chnl=15
+char id=65 x=196 y=118 width=25 height=31 xoffset=1 yoffset=20 xadvance=27 page=1 chnl=15
+char id=66 x=219 y=150 width=22 height=31 xoffset=3 yoffset=20 xadvance=27 page=1 chnl=15
+char id=67 x=117 y=85 width=21 height=33 xoffset=2 yoffset=19 xadvance=24 page=1 chnl=15
+char id=68 x=100 y=157 width=23 height=31 xoffset=3 yoffset=20 xadvance=29 page=1 chnl=15
+char id=69 x=67 y=191 width=20 height=31 xoffset=3 yoffset=20 xadvance=25 page=1 chnl=15
+char id=70 x=109 y=189 width=20 height=31 xoffset=3 yoffset=20 xadvance=24 page=1 chnl=15
+char id=71 x=132 y=222 width=23 height=33 xoffset=2 yoffset=19 xadvance=27 page=0 chnl=15
+char id=72 x=26 y=159 width=24 height=31 xoffset=3 yoffset=20 xadvance=30 page=1 chnl=15
+char id=73 x=248 y=131 width=5 height=31 xoffset=3 yoffset=20 xadvance=12 page=0 chnl=15
+char id=74 x=181 y=220 width=10 height=35 xoffset=0 yoffset=20 xadvance=13 page=0 chnl=15
+char id=75 x=196 y=150 width=22 height=31 xoffset=3 yoffset=20 xadvance=26 page=1 chnl=15
+char id=76 x=150 y=183 width=18 height=31 xoffset=3 yoffset=20 xadvance=21 page=1 chnl=15
+char id=77 x=105 y=125 width=32 height=31 xoffset=3 yoffset=20 xadvance=38 page=1 chnl=15
+char id=78 x=51 y=159 width=24 height=31 xoffset=3 yoffset=20 xadvance=31 page=1 chnl=15
+char id=79 x=105 y=222 width=26 height=33 xoffset=2 yoffset=19 xadvance=29 page=0 chnl=15
+char id=80 x=0 y=191 width=22 height=31 xoffset=3 yoffset=20 xadvance=26 page=1 chnl=15
+char id=81 x=64 y=85 width=26 height=39 xoffset=2 yoffset=19 xadvance=29 page=1 chnl=15
+char id=82 x=172 y=150 width=23 height=31 xoffset=3 yoffset=20 xadvance=28 page=1 chnl=15
+char id=83 x=156 y=221 width=22 height=33 xoffset=1 yoffset=19 xadvance=24 page=0 chnl=15
+char id=84 x=124 y=157 width=23 height=31 xoffset=0 yoffset=20 xadvance=23 page=1 chnl=15
+char id=85 x=163 y=85 width=23 height=32 xoffset=3 yoffset=20 xadvance=29 page=1 chnl=15
+char id=86 x=169 y=118 width=26 height=31 xoffset=0 yoffset=20 xadvance=26 page=1 chnl=15
+char id=87 x=65 y=125 width=39 height=31 xoffset=1 yoffset=20 xadvance=41 page=1 chnl=15
+char id=88 x=222 y=118 width=25 height=31 xoffset=0 yoffset=20 xadvance=25 page=1 chnl=15
+char id=89 x=0 y=159 width=25 height=31 xoffset=0 yoffset=20 xadvance=24 page=1 chnl=15
+char id=90 x=45 y=191 width=21 height=31 xoffset=1 yoffset=20 xadvance=24 page=1 chnl=15
+char id=192 x=0 y=92 width=25 height=43 xoffset=1 yoffset=8 xadvance=27 page=0 chnl=15
+char id=193 x=26 y=92 width=25 height=43 xoffset=1 yoffset=8 xadvance=27 page=0 chnl=15
+char id=194 x=27 y=180 width=25 height=42 xoffset=1 yoffset=9 xadvance=27 page=0 chnl=15
+char id=195 x=79 y=180 width=25 height=42 xoffset=1 yoffset=9 xadvance=27 page=0 chnl=15
+char id=196 x=54 y=43 width=25 height=41 xoffset=1 yoffset=10 xadvance=27 page=1 chnl=15
+char id=197 x=91 y=85 width=25 height=39 xoffset=1 yoffset=12 xadvance=27 page=1 chnl=15
+char id=198 x=0 y=223 width=37 height=32 xoffset=0 yoffset=19 xadvance=39 page=0 chnl=15
+char id=199 x=68 y=136 width=21 height=43 xoffset=2 yoffset=19 xadvance=24 page=0 chnl=15
+char id=200 x=134 y=134 width=20 height=43 xoffset=3 yoffset=8 xadvance=25 page=0 chnl=15
+char id=201 x=155 y=134 width=20 height=43 xoffset=3 yoffset=8 xadvance=25 page=0 chnl=15
+char id=202 x=137 y=0 width=20 height=42 xoffset=3 yoffset=9 xadvance=25 page=1 chnl=15
+char id=203 x=177 y=43 width=20 height=41 xoffset=3 yoffset=10 xadvance=25 page=1 chnl=15
+char id=204 x=176 y=133 width=12 height=43 xoffset=-1 yoffset=8 xadvance=12 page=0 chnl=15
+char id=205 x=189 y=133 width=12 height=43 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15
+char id=206 x=179 y=0 width=17 height=42 xoffset=-2 yoffset=9 xadvance=12 page=1 chnl=15
+char id=207 x=240 y=42 width=15 height=41 xoffset=-1 yoffset=10 xadvance=12 page=1 chnl=15
+char id=208 x=65 y=223 width=26 height=32 xoffset=1 yoffset=19 xadvance=29 page=0 chnl=15
+char id=209 x=131 y=179 width=24 height=42 xoffset=3 yoffset=9 xadvance=31 page=0 chnl=15
+char id=210 x=210 y=0 width=26 height=44 xoffset=2 yoffset=8 xadvance=29 page=0 chnl=15
+char id=211 x=156 y=0 width=26 height=44 xoffset=2 yoffset=8 xadvance=29 page=0 chnl=15
+char id=212 x=117 y=46 width=26 height=43 xoffset=2 yoffset=9 xadvance=29 page=0 chnl=15
+char id=213 x=171 y=45 width=26 height=43 xoffset=2 yoffset=9 xadvance=29 page=0 chnl=15
+char id=214 x=0 y=180 width=26 height=42 xoffset=2 yoffset=10 xadvance=29 page=0 chnl=15
+char id=215 x=208 y=182 width=20 height=20 xoffset=2 yoffset=30 xadvance=25 page=1 chnl=15
+char id=216 x=144 y=46 width=26 height=43 xoffset=2 yoffset=14 xadvance=29 page=0 chnl=15
+char id=217 x=48 y=47 width=23 height=44 xoffset=3 yoffset=8 xadvance=29 page=0 chnl=15
+char id=218 x=0 y=47 width=23 height=44 xoffset=3 yoffset=8 xadvance=29 page=0 chnl=15
+char id=219 x=173 y=89 width=23 height=43 xoffset=3 yoffset=9 xadvance=29 page=0 chnl=15
+char id=220 x=48 y=0 width=23 height=42 xoffset=3 yoffset=10 xadvance=29 page=1 chnl=15
+char id=221 x=225 y=45 width=25 height=43 xoffset=0 yoffset=8 xadvance=24 page=0 chnl=15
+char id=222 x=23 y=126 width=22 height=32 xoffset=3 yoffset=19 xadvance=27 page=1 chnl=15
+char id=223 x=192 y=220 width=23 height=34 xoffset=3 yoffset=18 xadvance=27 page=0 chnl=15
+char id=256 x=0 y=85 width=25 height=40 xoffset=1 yoffset=11 xadvance=27 page=1 chnl=15
+char id=258 x=53 y=180 width=25 height=42 xoffset=1 yoffset=9 xadvance=27 page=0 chnl=15
+char id=260 x=0 y=43 width=26 height=41 xoffset=1 yoffset=20 xadvance=27 page=1 chnl=15
+char id=262 x=95 y=46 width=21 height=44 xoffset=2 yoffset=8 xadvance=24 page=0 chnl=15
+char id=264 x=90 y=135 width=21 height=43 xoffset=2 yoffset=9 xadvance=24 page=0 chnl=15
+char id=266 x=94 y=0 width=21 height=42 xoffset=2 yoffset=10 xadvance=24 page=1 chnl=15
+char id=268 x=46 y=136 width=21 height=43 xoffset=2 yoffset=9 xadvance=24 page=0 chnl=15
+char id=270 x=206 y=176 width=23 height=42 xoffset=3 yoffset=9 xadvance=29 page=0 chnl=15
+char id=272 x=38 y=223 width=26 height=32 xoffset=1 yoffset=19 xadvance=29 page=0 chnl=15
+char id=274 x=26 y=85 width=20 height=40 xoffset=3 yoffset=11 xadvance=25 page=1 chnl=15
+char id=276 x=158 y=0 width=20 height=42 xoffset=3 yoffset=9 xadvance=25 page=1 chnl=15
+char id=278 x=219 y=43 width=20 height=41 xoffset=3 yoffset=10 xadvance=25 page=1 chnl=15
+char id=280 x=198 y=43 width=20 height=41 xoffset=3 yoffset=20 xadvance=25 page=1 chnl=15
+char id=282 x=116 y=0 width=20 height=42 xoffset=3 yoffset=9 xadvance=25 page=1 chnl=15
+char id=284 x=149 y=90 width=23 height=43 xoffset=2 yoffset=9 xadvance=27 page=0 chnl=15
+char id=286 x=101 y=91 width=23 height=43 xoffset=2 yoffset=9 xadvance=27 page=0 chnl=15
+char id=288 x=230 y=176 width=23 height=42 xoffset=2 yoffset=10 xadvance=27 page=0 chnl=15
+char id=290 x=0 y=0 width=23 height=46 xoffset=2 yoffset=19 xadvance=27 page=0 chnl=15
+char id=292 x=181 y=177 width=24 height=42 xoffset=3 yoffset=9 xadvance=30 page=0 chnl=15
+char id=294 x=138 y=119 width=30 height=31 xoffset=0 yoffset=20 xadvance=31 page=1 chnl=15
+char id=296 x=197 y=0 width=17 height=42 xoffset=-2 yoffset=9 xadvance=12 page=1 chnl=15
+char id=298 x=47 y=85 width=16 height=40 xoffset=-1 yoffset=11 xadvance=12 page=1 chnl=15
+char id=300 x=215 y=0 width=16 height=42 xoffset=-1 yoffset=9 xadvance=12 page=1 chnl=15
+char id=302 x=244 y=89 width=9 height=41 xoffset=0 yoffset=20 xadvance=12 page=0 chnl=15
+char id=304 x=242 y=133 width=5 height=41 xoffset=3 yoffset=10 xadvance=12 page=0 chnl=15
+char id=308 x=47 y=0 width=16 height=46 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=310 x=24 y=0 width=22 height=46 xoffset=3 yoffset=19 xadvance=26 page=0 chnl=15
+char id=313 x=237 y=0 width=18 height=43 xoffset=3 yoffset=8 xadvance=21 page=0 chnl=15
+char id=315 x=137 y=0 width=18 height=45 xoffset=3 yoffset=20 xadvance=21 page=0 chnl=15
+char id=317 x=46 y=126 width=18 height=32 xoffset=3 yoffset=19 xadvance=22 page=1 chnl=15
+char id=321 x=76 y=157 width=23 height=31 xoffset=-1 yoffset=20 xadvance=21 page=1 chnl=15
+char id=323 x=52 y=92 width=24 height=43 xoffset=3 yoffset=8 xadvance=31 page=0 chnl=15
+char id=325 x=64 y=0 width=24 height=45 xoffset=3 yoffset=20 xadvance=31 page=0 chnl=15
+char id=327 x=156 y=178 width=24 height=42 xoffset=3 yoffset=9 xadvance=31 page=0 chnl=15
+char id=330 x=106 y=43 width=24 height=41 xoffset=3 yoffset=20 xadvance=31 page=1 chnl=15
+char id=332 x=27 y=43 width=26 height=41 xoffset=2 yoffset=11 xadvance=29 page=1 chnl=15
+char id=334 x=198 y=45 width=26 height=43 xoffset=2 yoffset=9 xadvance=29 page=0 chnl=15
+char id=336 x=183 y=0 width=26 height=44 xoffset=2 yoffset=8 xadvance=29 page=0 chnl=15
+char id=338 x=216 y=219 width=38 height=33 xoffset=2 yoffset=19 xadvance=41 page=0 chnl=15
+char id=340 x=197 y=89 width=23 height=43 xoffset=3 yoffset=8 xadvance=28 page=0 chnl=15
+char id=342 x=89 y=0 width=23 height=45 xoffset=3 yoffset=20 xadvance=28 page=0 chnl=15
+char id=344 x=24 y=0 width=23 height=42 xoffset=3 yoffset=9 xadvance=28 page=1 chnl=15
+char id=346 x=72 y=46 width=22 height=44 xoffset=1 yoffset=8 xadvance=24 page=0 chnl=15
+char id=348 x=0 y=136 width=22 height=43 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15
+char id=350 x=23 y=136 width=22 height=43 xoffset=1 yoffset=19 xadvance=24 page=0 chnl=15
+char id=352 x=221 y=89 width=22 height=43 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15
+char id=356 x=0 y=0 width=23 height=42 xoffset=0 yoffset=9 xadvance=23 page=1 chnl=15
+char id=358 x=148 y=151 width=23 height=31 xoffset=0 yoffset=20 xadvance=24 page=1 chnl=15
+char id=360 x=125 y=90 width=23 height=43 xoffset=3 yoffset=9 xadvance=29 page=0 chnl=15
+char id=362 x=131 y=43 width=23 height=41 xoffset=3 yoffset=11 xadvance=29 page=1 chnl=15
+char id=364 x=77 y=91 width=23 height=43 xoffset=3 yoffset=9 xadvance=29 page=0 chnl=15
+char id=366 x=113 y=0 width=23 height=45 xoffset=3 yoffset=7 xadvance=29 page=0 chnl=15
+char id=368 x=24 y=47 width=23 height=44 xoffset=3 yoffset=8 xadvance=29 page=0 chnl=15
+char id=370 x=232 y=0 width=23 height=41 xoffset=3 yoffset=20 xadvance=29 page=1 chnl=15
+char id=372 x=202 y=133 width=39 height=42 xoffset=1 yoffset=9 xadvance=41 page=0 chnl=15
+char id=374 x=105 y=179 width=25 height=42 xoffset=0 yoffset=9 xadvance=24 page=0 chnl=15
+char id=376 x=80 y=43 width=25 height=41 xoffset=0 yoffset=10 xadvance=24 page=1 chnl=15
+char id=377 x=112 y=135 width=21 height=43 xoffset=1 yoffset=8 xadvance=24 page=0 chnl=15
+char id=379 x=155 y=43 width=21 height=41 xoffset=1 yoffset=10 xadvance=24 page=1 chnl=15
+char id=381 x=72 y=0 width=21 height=42 xoffset=1 yoffset=9 xadvance=24 page=1 chnl=15
+kernings count=553
+kerning first=65 second=86 amount=-1
+kerning first=376 second=308 amount=-1
+kerning first=376 second=74 amount=-1
+kerning first=376 second=260 amount=-2
+kerning first=376 second=258 amount=-2
+kerning first=376 second=256 amount=-2
+kerning first=66 second=89 amount=-1
+kerning first=376 second=197 amount=-2
+kerning first=376 second=196 amount=-2
+kerning first=376 second=195 amount=-2
+kerning first=376 second=194 amount=-2
+kerning first=376 second=193 amount=-2
+kerning first=376 second=192 amount=-2
+kerning first=376 second=65 amount=-2
+kerning first=66 second=221 amount=-1
+kerning first=376 second=352 amount=-1
+kerning first=376 second=350 amount=-1
+kerning first=376 second=348 amount=-1
+kerning first=376 second=346 amount=-1
+kerning first=376 second=83 amount=-1
+kerning first=376 second=338 amount=-1
+kerning first=66 second=374 amount=-1
+kerning first=66 second=376 amount=-1
+kerning first=376 second=336 amount=-1
+kerning first=68 second=88 amount=-1
+kerning first=376 second=334 amount=-1
+kerning first=70 second=65 amount=-1
+kerning first=376 second=332 amount=-1
+kerning first=70 second=192 amount=-1
+kerning first=70 second=193 amount=-1
+kerning first=70 second=194 amount=-1
+kerning first=70 second=195 amount=-1
+kerning first=70 second=196 amount=-1
+kerning first=70 second=197 amount=-1
+kerning first=70 second=198 amount=-1
+kerning first=70 second=256 amount=-1
+kerning first=70 second=258 amount=-1
+kerning first=70 second=260 amount=-1
+kerning first=376 second=290 amount=-1
+kerning first=376 second=288 amount=-1
+kerning first=76 second=86 amount=-2
+kerning first=376 second=286 amount=-1
+kerning first=79 second=88 amount=-1
+kerning first=376 second=284 amount=-1
+kerning first=80 second=65 amount=-1
+kerning first=376 second=216 amount=-1
+kerning first=376 second=214 amount=-1
+kerning first=80 second=88 amount=-1
+kerning first=80 second=89 amount=-1
+kerning first=80 second=192 amount=-1
+kerning first=80 second=193 amount=-1
+kerning first=80 second=194 amount=-1
+kerning first=80 second=195 amount=-1
+kerning first=80 second=196 amount=-1
+kerning first=80 second=197 amount=-1
+kerning first=80 second=198 amount=-1
+kerning first=80 second=221 amount=-1
+kerning first=80 second=256 amount=-1
+kerning first=80 second=258 amount=-1
+kerning first=80 second=260 amount=-1
+kerning first=376 second=213 amount=-1
+kerning first=80 second=374 amount=-1
+kerning first=80 second=376 amount=-1
+kerning first=376 second=212 amount=-1
+kerning first=81 second=88 amount=-1
+kerning first=376 second=211 amount=-1
+kerning first=376 second=210 amount=-1
+kerning first=376 second=81 amount=-1
+kerning first=376 second=79 amount=-1
+kerning first=376 second=71 amount=-1
+kerning first=84 second=198 amount=-2
+kerning first=376 second=268 amount=-1
+kerning first=86 second=65 amount=-1
+kerning first=376 second=266 amount=-1
+kerning first=376 second=264 amount=-1
+kerning first=86 second=74 amount=-1
+kerning first=376 second=262 amount=-1
+kerning first=376 second=199 amount=-1
+kerning first=376 second=67 amount=-1
+kerning first=86 second=192 amount=-1
+kerning first=86 second=193 amount=-1
+kerning first=86 second=194 amount=-1
+kerning first=86 second=195 amount=-1
+kerning first=86 second=196 amount=-1
+kerning first=86 second=197 amount=-1
+kerning first=86 second=198 amount=-1
+kerning first=374 second=308 amount=-1
+kerning first=374 second=74 amount=-1
+kerning first=374 second=260 amount=-2
+kerning first=374 second=258 amount=-2
+kerning first=374 second=256 amount=-2
+kerning first=374 second=197 amount=-2
+kerning first=374 second=196 amount=-2
+kerning first=86 second=256 amount=-1
+kerning first=86 second=258 amount=-1
+kerning first=86 second=260 amount=-1
+kerning first=374 second=195 amount=-2
+kerning first=374 second=194 amount=-2
+kerning first=374 second=193 amount=-2
+kerning first=374 second=192 amount=-2
+kerning first=374 second=65 amount=-2
+kerning first=374 second=352 amount=-1
+kerning first=374 second=350 amount=-1
+kerning first=374 second=348 amount=-1
+kerning first=86 second=308 amount=-1
+kerning first=374 second=346 amount=-1
+kerning first=374 second=83 amount=-1
+kerning first=374 second=338 amount=-1
+kerning first=374 second=336 amount=-1
+kerning first=374 second=334 amount=-1
+kerning first=374 second=332 amount=-1
+kerning first=374 second=290 amount=-1
+kerning first=374 second=288 amount=-1
+kerning first=87 second=198 amount=-1
+kerning first=88 second=67 amount=-1
+kerning first=88 second=71 amount=-1
+kerning first=88 second=79 amount=-1
+kerning first=88 second=81 amount=-1
+kerning first=88 second=199 amount=-1
+kerning first=88 second=210 amount=-1
+kerning first=88 second=211 amount=-1
+kerning first=88 second=212 amount=-1
+kerning first=88 second=213 amount=-1
+kerning first=88 second=214 amount=-1
+kerning first=88 second=216 amount=-1
+kerning first=88 second=262 amount=-1
+kerning first=88 second=264 amount=-1
+kerning first=88 second=266 amount=-1
+kerning first=88 second=268 amount=-1
+kerning first=88 second=284 amount=-1
+kerning first=88 second=286 amount=-1
+kerning first=88 second=288 amount=-1
+kerning first=88 second=290 amount=-1
+kerning first=88 second=332 amount=-1
+kerning first=88 second=334 amount=-1
+kerning first=88 second=336 amount=-1
+kerning first=88 second=338 amount=-1
+kerning first=89 second=198 amount=-2
+kerning first=374 second=286 amount=-1
+kerning first=192 second=86 amount=-1
+kerning first=193 second=86 amount=-1
+kerning first=194 second=86 amount=-1
+kerning first=195 second=86 amount=-1
+kerning first=196 second=86 amount=-1
+kerning first=197 second=86 amount=-1
+kerning first=374 second=284 amount=-1
+kerning first=208 second=88 amount=-1
+kerning first=374 second=216 amount=-1
+kerning first=374 second=214 amount=-1
+kerning first=210 second=88 amount=-1
+kerning first=374 second=213 amount=-1
+kerning first=374 second=212 amount=-1
+kerning first=211 second=88 amount=-1
+kerning first=374 second=211 amount=-1
+kerning first=374 second=210 amount=-1
+kerning first=212 second=88 amount=-1
+kerning first=374 second=81 amount=-1
+kerning first=374 second=79 amount=-1
+kerning first=213 second=88 amount=-1
+kerning first=374 second=71 amount=-1
+kerning first=374 second=268 amount=-1
+kerning first=214 second=88 amount=-1
+kerning first=374 second=266 amount=-1
+kerning first=374 second=264 amount=-1
+kerning first=216 second=88 amount=-1
+kerning first=374 second=262 amount=-1
+kerning first=374 second=199 amount=-1
+kerning first=374 second=67 amount=-1
+kerning first=372 second=260 amount=-1
+kerning first=372 second=258 amount=-1
+kerning first=221 second=198 amount=-2
+kerning first=372 second=256 amount=-1
+kerning first=372 second=197 amount=-1
+kerning first=372 second=196 amount=-1
+kerning first=222 second=84 amount=-1
+kerning first=372 second=195 amount=-1
+kerning first=372 second=194 amount=-1
+kerning first=222 second=88 amount=-1
+kerning first=222 second=89 amount=-1
+kerning first=372 second=193 amount=-1
+kerning first=372 second=192 amount=-1
+kerning first=372 second=65 amount=-1
+kerning first=358 second=260 amount=-2
+kerning first=358 second=258 amount=-2
+kerning first=358 second=256 amount=-2
+kerning first=358 second=197 amount=-2
+kerning first=222 second=198 amount=-1
+kerning first=222 second=221 amount=-1
+kerning first=358 second=196 amount=-2
+kerning first=358 second=195 amount=-2
+kerning first=358 second=194 amount=-2
+kerning first=358 second=193 amount=-2
+kerning first=222 second=356 amount=-1
+kerning first=222 second=358 amount=-1
+kerning first=358 second=192 amount=-2
+kerning first=222 second=374 amount=-1
+kerning first=222 second=376 amount=-1
+kerning first=358 second=65 amount=-2
+kerning first=356 second=260 amount=-2
+kerning first=356 second=258 amount=-2
+kerning first=356 second=256 amount=-2
+kerning first=223 second=84 amount=-1
+kerning first=223 second=86 amount=-1
+kerning first=356 second=197 amount=-2
+kerning first=223 second=89 amount=-1
+kerning first=223 second=221 amount=-1
+kerning first=356 second=196 amount=-2
+kerning first=223 second=356 amount=-1
+kerning first=223 second=358 amount=-1
+kerning first=356 second=195 amount=-2
+kerning first=223 second=374 amount=-1
+kerning first=223 second=376 amount=-1
+kerning first=256 second=86 amount=-1
+kerning first=258 second=86 amount=-1
+kerning first=260 second=86 amount=-1
+kerning first=356 second=194 amount=-2
+kerning first=270 second=88 amount=-1
+kerning first=356 second=193 amount=-2
+kerning first=356 second=192 amount=-2
+kerning first=272 second=88 amount=-1
+kerning first=356 second=65 amount=-2
+kerning first=344 second=376 amount=-1
+kerning first=344 second=374 amount=-1
+kerning first=344 second=221 amount=-1
+kerning first=344 second=89 amount=-1
+kerning first=313 second=86 amount=-2
+kerning first=315 second=86 amount=-2
+kerning first=317 second=84 amount=-1
+kerning first=317 second=86 amount=-1
+kerning first=317 second=87 amount=-1
+kerning first=317 second=89 amount=-1
+kerning first=317 second=221 amount=-1
+kerning first=317 second=356 amount=-1
+kerning first=317 second=358 amount=-1
+kerning first=317 second=372 amount=-1
+kerning first=317 second=374 amount=-1
+kerning first=317 second=376 amount=-1
+kerning first=321 second=86 amount=-2
+kerning first=342 second=376 amount=-1
+kerning first=332 second=88 amount=-1
+kerning first=342 second=374 amount=-1
+kerning first=342 second=221 amount=-1
+kerning first=334 second=88 amount=-1
+kerning first=342 second=89 amount=-1
+kerning first=340 second=376 amount=-1
+kerning first=336 second=88 amount=-1
+kerning first=340 second=374 amount=-1
+kerning first=340 second=221 amount=-1
+kerning first=340 second=89 amount=-1
+kerning first=336 second=376 amount=-1
+kerning first=336 second=374 amount=-1
+kerning first=336 second=221 amount=-1
+kerning first=336 second=89 amount=-1
+kerning first=334 second=376 amount=-1
+kerning first=334 second=374 amount=-1
+kerning first=334 second=221 amount=-1
+kerning first=334 second=89 amount=-1
+kerning first=332 second=376 amount=-1
+kerning first=332 second=374 amount=-1
+kerning first=332 second=221 amount=-1
+kerning first=332 second=89 amount=-1
+kerning first=356 second=198 amount=-2
+kerning first=358 second=198 amount=-2
+kerning first=321 second=376 amount=-4
+kerning first=321 second=374 amount=-4
+kerning first=321 second=221 amount=-4
+kerning first=321 second=89 amount=-4
+kerning first=321 second=372 amount=-2
+kerning first=321 second=87 amount=-2
+kerning first=372 second=198 amount=-1
+kerning first=374 second=198 amount=-2
+kerning first=321 second=358 amount=-4
+kerning first=376 second=198 amount=-2
+kerning first=321 second=356 amount=-4
+kerning first=321 second=84 amount=-4
+kerning first=317 second=376 amount=-4
+kerning first=317 second=374 amount=-4
+kerning first=317 second=221 amount=-4
+kerning first=317 second=89 amount=-4
+kerning first=317 second=372 amount=-2
+kerning first=317 second=87 amount=-2
+kerning first=317 second=358 amount=-4
+kerning first=317 second=356 amount=-4
+kerning first=317 second=84 amount=-4
+kerning first=315 second=376 amount=-4
+kerning first=315 second=374 amount=-4
+kerning first=315 second=221 amount=-4
+kerning first=315 second=89 amount=-4
+kerning first=315 second=372 amount=-2
+kerning first=315 second=87 amount=-2
+kerning first=315 second=358 amount=-4
+kerning first=315 second=356 amount=-4
+kerning first=315 second=84 amount=-4
+kerning first=313 second=376 amount=-4
+kerning first=313 second=374 amount=-4
+kerning first=313 second=221 amount=-4
+kerning first=313 second=89 amount=-4
+kerning first=313 second=372 amount=-2
+kerning first=313 second=87 amount=-2
+kerning first=313 second=358 amount=-4
+kerning first=313 second=356 amount=-4
+kerning first=313 second=84 amount=-4
+kerning first=65 second=84 amount=-2
+kerning first=65 second=356 amount=-2
+kerning first=65 second=358 amount=-2
+kerning first=272 second=376 amount=-1
+kerning first=272 second=374 amount=-1
+kerning first=272 second=221 amount=-1
+kerning first=272 second=89 amount=-1
+kerning first=270 second=376 amount=-1
+kerning first=270 second=374 amount=-1
+kerning first=270 second=221 amount=-1
+kerning first=270 second=89 amount=-1
+kerning first=260 second=376 amount=-2
+kerning first=260 second=374 amount=-2
+kerning first=260 second=221 amount=-2
+kerning first=65 second=87 amount=-1
+kerning first=65 second=372 amount=-1
+kerning first=65 second=89 amount=-2
+kerning first=65 second=221 amount=-2
+kerning first=65 second=374 amount=-2
+kerning first=65 second=376 amount=-2
+kerning first=260 second=89 amount=-2
+kerning first=260 second=372 amount=-1
+kerning first=260 second=87 amount=-1
+kerning first=260 second=358 amount=-2
+kerning first=260 second=356 amount=-2
+kerning first=260 second=84 amount=-2
+kerning first=258 second=376 amount=-2
+kerning first=258 second=374 amount=-2
+kerning first=258 second=221 amount=-2
+kerning first=258 second=89 amount=-2
+kerning first=258 second=372 amount=-1
+kerning first=258 second=87 amount=-1
+kerning first=258 second=358 amount=-2
+kerning first=258 second=356 amount=-2
+kerning first=258 second=84 amount=-2
+kerning first=256 second=376 amount=-2
+kerning first=256 second=374 amount=-2
+kerning first=256 second=221 amount=-2
+kerning first=256 second=89 amount=-2
+kerning first=256 second=372 amount=-1
+kerning first=68 second=89 amount=-1
+kerning first=68 second=221 amount=-1
+kerning first=68 second=374 amount=-1
+kerning first=68 second=376 amount=-1
+kerning first=256 second=87 amount=-1
+kerning first=256 second=358 amount=-2
+kerning first=256 second=356 amount=-2
+kerning first=256 second=84 amount=-2
+kerning first=221 second=308 amount=-1
+kerning first=221 second=74 amount=-1
+kerning first=221 second=260 amount=-2
+kerning first=221 second=258 amount=-2
+kerning first=221 second=256 amount=-2
+kerning first=221 second=197 amount=-2
+kerning first=221 second=196 amount=-2
+kerning first=221 second=195 amount=-2
+kerning first=221 second=194 amount=-2
+kerning first=221 second=193 amount=-2
+kerning first=221 second=192 amount=-2
+kerning first=221 second=65 amount=-2
+kerning first=221 second=352 amount=-1
+kerning first=221 second=350 amount=-1
+kerning first=221 second=348 amount=-1
+kerning first=221 second=346 amount=-1
+kerning first=221 second=83 amount=-1
+kerning first=221 second=338 amount=-1
+kerning first=221 second=336 amount=-1
+kerning first=221 second=334 amount=-1
+kerning first=221 second=332 amount=-1
+kerning first=221 second=290 amount=-1
+kerning first=221 second=288 amount=-1
+kerning first=221 second=286 amount=-1
+kerning first=221 second=284 amount=-1
+kerning first=221 second=216 amount=-1
+kerning first=221 second=214 amount=-1
+kerning first=221 second=213 amount=-1
+kerning first=221 second=212 amount=-1
+kerning first=221 second=211 amount=-1
+kerning first=221 second=210 amount=-1
+kerning first=221 second=81 amount=-1
+kerning first=221 second=79 amount=-1
+kerning first=221 second=71 amount=-1
+kerning first=221 second=268 amount=-1
+kerning first=221 second=266 amount=-1
+kerning first=221 second=264 amount=-1
+kerning first=221 second=262 amount=-1
+kerning first=221 second=199 amount=-1
+kerning first=221 second=67 amount=-1
+kerning first=216 second=376 amount=-1
+kerning first=216 second=374 amount=-1
+kerning first=216 second=221 amount=-1
+kerning first=216 second=89 amount=-1
+kerning first=214 second=376 amount=-1
+kerning first=214 second=374 amount=-1
+kerning first=214 second=221 amount=-1
+kerning first=214 second=89 amount=-1
+kerning first=213 second=376 amount=-1
+kerning first=213 second=374 amount=-1
+kerning first=213 second=221 amount=-1
+kerning first=213 second=89 amount=-1
+kerning first=212 second=376 amount=-1
+kerning first=212 second=374 amount=-1
+kerning first=212 second=221 amount=-1
+kerning first=212 second=89 amount=-1
+kerning first=211 second=376 amount=-1
+kerning first=211 second=374 amount=-1
+kerning first=211 second=221 amount=-1
+kerning first=211 second=89 amount=-1
+kerning first=210 second=376 amount=-1
+kerning first=210 second=374 amount=-1
+kerning first=210 second=221 amount=-1
+kerning first=210 second=89 amount=-1
+kerning first=208 second=376 amount=-1
+kerning first=208 second=374 amount=-1
+kerning first=208 second=221 amount=-1
+kerning first=208 second=89 amount=-1
+kerning first=197 second=376 amount=-2
+kerning first=197 second=374 amount=-2
+kerning first=197 second=221 amount=-2
+kerning first=197 second=89 amount=-2
+kerning first=197 second=372 amount=-1
+kerning first=197 second=87 amount=-1
+kerning first=197 second=358 amount=-2
+kerning first=197 second=356 amount=-2
+kerning first=197 second=84 amount=-2
+kerning first=196 second=376 amount=-2
+kerning first=196 second=374 amount=-2
+kerning first=196 second=221 amount=-2
+kerning first=196 second=89 amount=-2
+kerning first=76 second=84 amount=-4
+kerning first=76 second=356 amount=-4
+kerning first=76 second=358 amount=-4
+kerning first=196 second=372 amount=-1
+kerning first=196 second=87 amount=-1
+kerning first=196 second=358 amount=-2
+kerning first=196 second=356 amount=-2
+kerning first=196 second=84 amount=-2
+kerning first=195 second=376 amount=-2
+kerning first=195 second=374 amount=-2
+kerning first=195 second=221 amount=-2
+kerning first=195 second=89 amount=-2
+kerning first=195 second=372 amount=-1
+kerning first=195 second=87 amount=-1
+kerning first=76 second=87 amount=-2
+kerning first=76 second=372 amount=-2
+kerning first=76 second=89 amount=-4
+kerning first=76 second=221 amount=-4
+kerning first=76 second=374 amount=-4
+kerning first=76 second=376 amount=-4
+kerning first=195 second=358 amount=-2
+kerning first=195 second=356 amount=-2
+kerning first=195 second=84 amount=-2
+kerning first=79 second=89 amount=-1
+kerning first=79 second=221 amount=-1
+kerning first=79 second=374 amount=-1
+kerning first=79 second=376 amount=-1
+kerning first=194 second=376 amount=-2
+kerning first=194 second=374 amount=-2
+kerning first=194 second=221 amount=-2
+kerning first=194 second=89 amount=-2
+kerning first=194 second=372 amount=-1
+kerning first=194 second=87 amount=-1
+kerning first=194 second=358 amount=-2
+kerning first=194 second=356 amount=-2
+kerning first=194 second=84 amount=-2
+kerning first=193 second=376 amount=-2
+kerning first=193 second=374 amount=-2
+kerning first=193 second=221 amount=-2
+kerning first=193 second=89 amount=-2
+kerning first=193 second=372 amount=-1
+kerning first=193 second=87 amount=-1
+kerning first=81 second=89 amount=-1
+kerning first=81 second=221 amount=-1
+kerning first=81 second=374 amount=-1
+kerning first=81 second=376 amount=-1
+kerning first=193 second=358 amount=-2
+kerning first=193 second=356 amount=-2
+kerning first=193 second=84 amount=-2
+kerning first=192 second=376 amount=-2
+kerning first=192 second=374 amount=-2
+kerning first=192 second=221 amount=-2
+kerning first=192 second=89 amount=-2
+kerning first=192 second=372 amount=-1
+kerning first=192 second=87 amount=-1
+kerning first=192 second=358 amount=-2
+kerning first=192 second=356 amount=-2
+kerning first=192 second=84 amount=-2
+kerning first=82 second=89 amount=-1
+kerning first=82 second=221 amount=-1
+kerning first=82 second=374 amount=-1
+kerning first=82 second=376 amount=-1
+kerning first=89 second=308 amount=-1
+kerning first=89 second=74 amount=-1
+kerning first=89 second=260 amount=-2
+kerning first=89 second=258 amount=-2
+kerning first=89 second=256 amount=-2
+kerning first=89 second=197 amount=-2
+kerning first=89 second=196 amount=-2
+kerning first=89 second=195 amount=-2
+kerning first=89 second=194 amount=-2
+kerning first=89 second=193 amount=-2
+kerning first=89 second=192 amount=-2
+kerning first=89 second=65 amount=-2
+kerning first=89 second=352 amount=-1
+kerning first=89 second=350 amount=-1
+kerning first=89 second=348 amount=-1
+kerning first=89 second=346 amount=-1
+kerning first=89 second=83 amount=-1
+kerning first=89 second=338 amount=-1
+kerning first=89 second=336 amount=-1
+kerning first=89 second=334 amount=-1
+kerning first=89 second=332 amount=-1
+kerning first=89 second=290 amount=-1
+kerning first=89 second=288 amount=-1
+kerning first=89 second=286 amount=-1
+kerning first=89 second=284 amount=-1
+kerning first=89 second=216 amount=-1
+kerning first=89 second=214 amount=-1
+kerning first=89 second=213 amount=-1
+kerning first=89 second=212 amount=-1
+kerning first=89 second=211 amount=-1
+kerning first=89 second=210 amount=-1
+kerning first=89 second=81 amount=-1
+kerning first=89 second=79 amount=-1
+kerning first=89 second=71 amount=-1
+kerning first=89 second=268 amount=-1
+kerning first=89 second=266 amount=-1
+kerning first=89 second=264 amount=-1
+kerning first=89 second=262 amount=-1
+kerning first=89 second=199 amount=-1
+kerning first=89 second=67 amount=-1
+kerning first=87 second=260 amount=-1
+kerning first=87 second=258 amount=-1
+kerning first=87 second=256 amount=-1
+kerning first=87 second=197 amount=-1
+kerning first=87 second=196 amount=-1
+kerning first=87 second=195 amount=-1
+kerning first=87 second=194 amount=-1
+kerning first=87 second=193 amount=-1
+kerning first=87 second=192 amount=-1
+kerning first=84 second=65 amount=-2
+kerning first=84 second=192 amount=-2
+kerning first=84 second=193 amount=-2
+kerning first=84 second=194 amount=-2
+kerning first=84 second=195 amount=-2
+kerning first=84 second=196 amount=-2
+kerning first=84 second=197 amount=-2
+kerning first=84 second=256 amount=-2
+kerning first=84 second=258 amount=-2
+kerning first=84 second=260 amount=-2
+kerning first=87 second=65 amount=-1
diff --git a/resources-round-454x454/fonts/titillium-web-semibold-45_0.png b/resources-round-454x454/fonts/titillium-web-semibold-45_0.png
new file mode 100644
index 00000000..5417286f
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-semibold-45_0.png differ
diff --git a/resources-round-454x454/fonts/titillium-web-semibold-45_1.png b/resources-round-454x454/fonts/titillium-web-semibold-45_1.png
new file mode 100644
index 00000000..96a819a1
Binary files /dev/null and b/resources-round-454x454/fonts/titillium-web-semibold-45_1.png differ
diff --git a/resources-round-454x454/layouts/layout.xml b/resources-round-454x454/layouts/layout.xml
new file mode 100644
index 00000000..88fdb65c
--- /dev/null
+++ b/resources-round-454x454/layouts/layout.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+ :left
+ 14
+ 302
+ 3
+
+
+
+ :right
+ 14
+ 302
+ 3
+
+
+
+ 136
+ 157
+ 308
+ 337
+ 366
+ 395
+ 361
+ 92
+ 353
+
+
+
+ 134
+ 318
+ 44
+ 85
+ 53
+
+
+
+ 138
+
+
+
+ 62
+ 227
+ 60
+ 45
+
+
+
+ -4
+ 304
+ 263
+
+
+
+ 88
+ 312
+ 209
+ 14
+ 4
+
+
+
+
+
+
+
+ [-60, -30, 30, 60]
+ -4
+ 195
+ 241
+
+ 251
+
+ 281
+ 114
+
+
+
\ No newline at end of file
diff --git a/resources-rus/strings/strings.xml b/resources-rus/strings/strings.xml
index d4722902..b509513c 100644
--- a/resources-rus/strings/strings.xml
+++ b/resources-rus/strings/strings.xml
@@ -1,7 +1,6 @@
Crystal
- Версия
Тема
Цвет часов
@@ -14,8 +13,12 @@
Добавить местное время в городе (бета)
Вид полосы подвижности
Скрывать секунды
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Скрывать нули перед часами
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Количество полей данных
Поле данных 1
@@ -57,7 +60,11 @@
Шаги
Пройденные вверх этажи
+ Solar Intensity
+ Body Battery
+ Recovery Time
Время интенсивной активности (минуты за неделю)
+ Active Calories (Manual Goal)
Калории (ручной ввод цели)
Выключено
@@ -67,6 +74,7 @@
Заряд аккумулятора (скрывать проценты)
Уведомления
Калории
+ Active Calories
Расстояние
Будильники
Высота
@@ -102,4 +110,24 @@
Ноя
Дек
+
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-semiround-215x180-ciq_1.x/layouts/layout.xml b/resources-semiround-215x180-ciq_1.x/layouts/layout.xml
deleted file mode 100644
index ddf82b7f..00000000
--- a/resources-semiround-215x180-ciq_1.x/layouts/layout.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
- :left
- 6
- 180
- 2
-
-
-
- :right
- 6
- 180
- 2
-
-
-
-
- 6
-
-
-
- 65
- 85
- 147
- 163
- 145
- 42
- 173
-
-
-
- 68
- 147
- 12
- 31
- 24
-
-
-
- 53
-
-
-
- 28
- 90
- 28
- 20
-
-
-
- 147
- 109
-
-
-
-
-
-
- 1
-
-
-
- 46
- 126
- 93
- 7
- 3
-
-
-
\ No newline at end of file
diff --git a/resources-semiround-215x180/layouts/layout.xml b/resources-semiround-215x180/layouts/layout.xml
deleted file mode 100644
index bf300a65..00000000
--- a/resources-semiround-215x180/layouts/layout.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
- :left
- 6
- 180
- 2
-
-
-
- :right
- 6
- 180
- 2
-
-
-
- 65
- 85
- 147
- 163
- 145
- 42
- 173
-
-
-
- 68
- 147
- 12
- 31
- 24
-
-
-
- 53
-
-
-
- 28
- 90
- 28
- 20
-
-
-
- 147
- 109
-
-
-
-
-
-
- 1
-
-
-
- 46
- 126
- 93
- 7
- 3
-
-
-
\ No newline at end of file
diff --git a/resources-slo/strings/strings.xml b/resources-slo/strings/strings.xml
index f00d62a9..0b62b621 100644
--- a/resources-slo/strings/strings.xml
+++ b/resources-slo/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Nov
Dec
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-slv/strings/strings.xml b/resources-slv/strings/strings.xml
index 5bd646b7..f0c224f3 100644
--- a/resources-slv/strings/strings.xml
+++ b/resources-slv/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Nov
Dec
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-small-icons/fonts/crystal-icons-small.fnt b/resources-small-icons/fonts/crystal-icons-small.fnt
index 148876d9..2c6562de 100644
--- a/resources-small-icons/fonts/crystal-icons-small.fnt
+++ b/resources-small-icons/fonts/crystal-icons-small.fnt
@@ -1,7 +1,7 @@
info face="Crystal Icons" size=-20 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=20 base=20 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="crystal-icons-small.png"
-chars count=17
+chars count=25
char id=48 x=0 y=0 width=20 height=20 xoffset=0 yoffset=0 xadvance=20 page=0 chnl=15
char id=49 x=21 y=0 width=20 height=20 xoffset=0 yoffset=0 xadvance=20 page=0 chnl=15
char id=50 x=42 y=0 width=20 height=20 xoffset=0 yoffset=0 xadvance=20 page=0 chnl=15
@@ -18,4 +18,12 @@ char id=61 x=250 y=0 width=6 height=6 xoffset=0 yoffset=7
char id=62 x=0 y=21 width=23 height=20 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=15
char id=63 x=24 y=21 width=23 height=20 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=15
char id=64 x=48 y=21 width=17 height=20 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15
-char id=65 x=66 y=21 width=14 height=20 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
\ No newline at end of file
+char id=65 x=66 y=21 width=14 height=20 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
+char id=66 x=80 y=21 width=26 height=22 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15
+char id=67 x=106 y=21 width=24 height=20 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
+char id=68 x=133 y=21 width=21 height=22 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
+char id=69 x=154 y=21 width=17 height=20 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15
+char id=70 x=172 y=21 width=14 height=20 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
+char id=71 x=187 y=21 width=18 height=20 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15
+char id=84 x=205 y=21 width=15 height=17 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
+char id=72 x=220 y=21 width=12 height=17 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15
\ No newline at end of file
diff --git a/resources-small-icons/fonts/crystal-icons-small.png b/resources-small-icons/fonts/crystal-icons-small.png
index 351e80c2..8dbfa295 100644
Binary files a/resources-small-icons/fonts/crystal-icons-small.png and b/resources-small-icons/fonts/crystal-icons-small.png differ
diff --git a/resources-small-time/fonts/fonts.xml b/resources-small-time/fonts/fonts.xml
index dc63011b..281f6a7f 100644
--- a/resources-small-time/fonts/fonts.xml
+++ b/resources-small-time/fonts/fonts.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/resources-small-time/fonts/titillium-web-bold-58-tall.bmfc b/resources-small-time/fonts/titillium-web-bold-58-tall.bmfc
index f44abb3a..5b3f5453 100644
--- a/resources-small-time/fonts/titillium-web-bold-58-tall.bmfc
+++ b/resources-small-time/fonts/titillium-web-bold-58-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
diff --git a/resources-small-time/fonts/titillium-web-bold-58-tall.fnt b/resources-small-time/fonts/titillium-web-bold-58-tall.fnt
index 09f9daf4..64d1a3e0 100644
--- a/resources-small-time/fonts/titillium-web-bold-58-tall.fnt
+++ b/resources-small-time/fonts/titillium-web-bold-58-tall.fnt
@@ -1,14 +1,14 @@
info face="Titillium Web" size=-58 bold=1 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=42 base=42 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+common lineHeight=94 base=70 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-bold-58-tall_0.png"
chars count=10
-char id=48 x=0 y=0 width=32 height=42 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15
-char id=49 x=31 y=43 width=22 height=40 xoffset=3 yoffset=1 xadvance=32 page=0 chnl=15
-char id=50 x=187 y=0 width=26 height=41 xoffset=3 yoffset=0 xadvance=32 page=0 chnl=15
-char id=51 x=129 y=0 width=28 height=42 xoffset=2 yoffset=0 xadvance=32 page=0 chnl=15
-char id=52 x=0 y=43 width=30 height=40 xoffset=1 yoffset=1 xadvance=32 page=0 chnl=15
-char id=53 x=158 y=0 width=28 height=41 xoffset=2 yoffset=1 xadvance=32 page=0 chnl=15
-char id=54 x=98 y=0 width=30 height=42 xoffset=1 yoffset=0 xadvance=32 page=0 chnl=15
-char id=55 x=214 y=0 width=26 height=41 xoffset=3 yoffset=1 xadvance=32 page=0 chnl=15
-char id=56 x=33 y=0 width=32 height=42 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15
-char id=57 x=66 y=0 width=31 height=42 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15
+char id=48 x=0 y=0 width=30 height=42 xoffset=1 yoffset=28 xadvance=32 page=0 chnl=15
+char id=49 x=234 y=0 width=21 height=41 xoffset=4 yoffset=28 xadvance=32 page=0 chnl=15
+char id=50 x=0 y=43 width=26 height=41 xoffset=3 yoffset=28 xadvance=32 page=0 chnl=15
+char id=51 x=151 y=0 width=26 height=42 xoffset=3 yoffset=28 xadvance=32 page=0 chnl=15
+char id=52 x=204 y=0 width=29 height=41 xoffset=2 yoffset=28 xadvance=32 page=0 chnl=15
+char id=53 x=123 y=0 width=27 height=42 xoffset=3 yoffset=28 xadvance=32 page=0 chnl=15
+char id=54 x=93 y=0 width=29 height=42 xoffset=2 yoffset=28 xadvance=32 page=0 chnl=15
+char id=55 x=178 y=0 width=25 height=42 xoffset=4 yoffset=28 xadvance=32 page=0 chnl=15
+char id=56 x=31 y=0 width=30 height=42 xoffset=1 yoffset=28 xadvance=32 page=0 chnl=15
+char id=57 x=62 y=0 width=30 height=42 xoffset=1 yoffset=28 xadvance=32 page=0 chnl=15
diff --git a/resources-small-time/fonts/titillium-web-bold-58-tall_0.png b/resources-small-time/fonts/titillium-web-bold-58-tall_0.png
index 0794c8e0..900a8290 100644
Binary files a/resources-small-time/fonts/titillium-web-bold-58-tall_0.png and b/resources-small-time/fonts/titillium-web-bold-58-tall_0.png differ
diff --git a/resources-small-time/fonts/titillium-web-light-58-tall.bmfc b/resources-small-time/fonts/titillium-web-light-58-tall.bmfc
index 7e5e6342..4ec093fb 100644
--- a/resources-small-time/fonts/titillium-web-light-58-tall.bmfc
+++ b/resources-small-time/fonts/titillium-web-light-58-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,6 +54,6 @@ invB=0
outlineThickness=0
# selected chars
-chars=48-57
+chars=48-58
# imported icon images
diff --git a/resources-small-time/fonts/titillium-web-light-58-tall.fnt b/resources-small-time/fonts/titillium-web-light-58-tall.fnt
index 01cf3d79..29abb678 100644
--- a/resources-small-time/fonts/titillium-web-light-58-tall.fnt
+++ b/resources-small-time/fonts/titillium-web-light-58-tall.fnt
@@ -1,14 +1,15 @@
info face="Titillium Web Light" size=-58 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=42 base=42 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+common lineHeight=94 base=70 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-light-58-tall_0.png"
-chars count=10
-char id=48 x=0 y=0 width=30 height=42 xoffset=1 yoffset=0 xadvance=32 page=0 chnl=15
-char id=49 x=231 y=0 width=18 height=40 xoffset=5 yoffset=1 xadvance=32 page=0 chnl=15
-char id=50 x=177 y=0 width=26 height=41 xoffset=3 yoffset=0 xadvance=32 page=0 chnl=15
-char id=51 x=122 y=0 width=26 height=42 xoffset=3 yoffset=0 xadvance=32 page=0 chnl=15
-char id=52 x=0 y=43 width=30 height=40 xoffset=1 yoffset=1 xadvance=32 page=0 chnl=15
-char id=53 x=149 y=0 width=27 height=41 xoffset=3 yoffset=1 xadvance=32 page=0 chnl=15
-char id=54 x=62 y=0 width=29 height=42 xoffset=2 yoffset=0 xadvance=32 page=0 chnl=15
-char id=55 x=204 y=0 width=26 height=41 xoffset=3 yoffset=1 xadvance=32 page=0 chnl=15
-char id=56 x=31 y=0 width=30 height=42 xoffset=1 yoffset=0 xadvance=32 page=0 chnl=15
-char id=57 x=92 y=0 width=29 height=42 xoffset=1 yoffset=0 xadvance=32 page=0 chnl=15
+chars count=11
+char id=48 x=31 y=0 width=28 height=42 xoffset=2 yoffset=28 xadvance=32 page=0 chnl=15
+char id=49 x=0 y=43 width=16 height=41 xoffset=6 yoffset=28 xadvance=32 page=0 chnl=15
+char id=50 x=226 y=0 width=25 height=41 xoffset=4 yoffset=28 xadvance=32 page=0 chnl=15
+char id=51 x=117 y=0 width=26 height=42 xoffset=3 yoffset=28 xadvance=32 page=0 chnl=15
+char id=52 x=196 y=0 width=29 height=41 xoffset=2 yoffset=28 xadvance=32 page=0 chnl=15
+char id=53 x=144 y=0 width=25 height=42 xoffset=4 yoffset=28 xadvance=32 page=0 chnl=15
+char id=54 x=89 y=0 width=27 height=42 xoffset=3 yoffset=28 xadvance=32 page=0 chnl=15
+char id=55 x=170 y=0 width=25 height=42 xoffset=4 yoffset=28 xadvance=32 page=0 chnl=15
+char id=56 x=0 y=0 width=30 height=42 xoffset=1 yoffset=28 xadvance=32 page=0 chnl=15
+char id=57 x=60 y=0 width=28 height=42 xoffset=2 yoffset=28 xadvance=32 page=0 chnl=15
+char id=58 x=17 y=43 width=4 height=27 xoffset=4 yoffset=42 xadvance=12 page=0 chnl=15
diff --git a/resources-small-time/fonts/titillium-web-light-58-tall_0.png b/resources-small-time/fonts/titillium-web-light-58-tall_0.png
index 2bd90c66..0779760a 100644
Binary files a/resources-small-time/fonts/titillium-web-light-58-tall_0.png and b/resources-small-time/fonts/titillium-web-light-58-tall_0.png differ
diff --git a/resources-spa/strings/strings.xml b/resources-spa/strings/strings.xml
index 5bf5b9bc..5e34afd6 100644
--- a/resources-spa/strings/strings.xml
+++ b/resources-spa/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
Nov
Dic
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-swe/strings/strings.xml b/resources-swe/strings/strings.xml
index 0f3b06a1..2b214904 100644
--- a/resources-swe/strings/strings.xml
+++ b/resources-swe/strings/strings.xml
@@ -1,7 +1,6 @@
Crystal
- App-version
Tema
Färg timme
@@ -14,8 +13,12 @@
Lägg till lokal tid för stad (Beta)
Rörelsemätarstil
Dölj sekunder
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Dölj inledande nollor
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Antal datafält
Datafält 1
@@ -57,8 +60,12 @@
Steg
Våningar
+ Solar Intensity
+ Body Battery
+ Recovery Time
Aktiva minuter (Vecka)
Kalorier (Manuellt mål)
+ Active Calories (Manual Goal)
Off
Puls
@@ -67,6 +74,7 @@
Batteri (Dölj procent)
Notifieringar
Kalorier
+ Active Calories
Distans
Alarm
Altitud
@@ -102,4 +110,24 @@
nov
dec
+
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-vivoactive/settings/properties.xml b/resources-vivoactive/settings/properties.xml
deleted file mode 100644
index cb2de3ec..00000000
--- a/resources-vivoactive/settings/properties.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- -1
- 3
-
-
- 4
-
-
\ No newline at end of file
diff --git a/resources-vivoactive/settings/settings.xml b/resources-vivoactive/settings/settings.xml
deleted file mode 100644
index 5b0c6ee1..00000000
--- a/resources-vivoactive/settings/settings.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
- @Strings.ThemeBlueDark
- @Strings.ThemePinkDark
- @Strings.ThemeRedDark
- @Strings.ThemeGreenDark
-
-
- @Strings.ThemeCornflowerBlueDark
- @Strings.ThemeLemonCreamDark
- @Strings.ThemeVividYellowDark
-
- @Strings.ThemeCornYellowDark
- @Strings.ThemeDaygloOrangeDark
- @Strings.ThemeMonoDark
- @Strings.ThemeMonoLight
- @Strings.ThemeBlueLight
- @Strings.ThemeGreenLight
- @Strings.ThemeRedLight
- @Strings.ThemeDaygloOrangeLight
-
-
-
-
-
- @Strings.Steps
-
-
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
- @Strings.Steps
-
-
- @Strings.Battery
- @Strings.CaloriesManualGoal
- @Strings.Off
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
-
-
- @Strings.Battery
- @Strings.BatteryHidePercentage
- @Strings.Notifications
- @Strings.Calories
- @Strings.Distance
- @Strings.Alarms
- @Strings.Altitude
-
-
- @Strings.SunriseSunset
-
-
-
-
-
-
-
-
-
-
diff --git a/resources-zhs/strings/strings.xml b/resources-zhs/strings/strings.xml
index 0ccda644..d290cc52 100644
--- a/resources-zhs/strings/strings.xml
+++ b/resources-zhs/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
十一月
十二月
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources-zht/strings/strings.xml b/resources-zht/strings/strings.xml
index c0d9b744..96788c57 100644
--- a/resources-zht/strings/strings.xml
+++ b/resources-zht/strings/strings.xml
@@ -2,7 +2,6 @@
Crystal
- App Version
Theme
Hours Colour
@@ -15,8 +14,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -58,8 +61,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -68,6 +75,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -103,4 +111,23 @@
十一月
十二月
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
diff --git a/resources/fonts/crystal-icons.fnt b/resources/fonts/crystal-icons.fnt
index dd5b89a7..c079d204 100644
--- a/resources/fonts/crystal-icons.fnt
+++ b/resources/fonts/crystal-icons.fnt
@@ -1,7 +1,7 @@
info face="Crystal Icons" size=-24 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=24 base=24 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="crystal-icons.png"
-chars count=17
+chars count=24
char id=48 x=0 y=0 width=21 height=24 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=15
char id=49 x=22 y=0 width=24 height=24 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
char id=50 x=47 y=0 width=24 height=24 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
@@ -18,4 +18,11 @@ char id=61 x=38 y=25 width=6 height=6 xoffset=0 yoffset=9
char id=62 x=47 y=25 width=28 height=24 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=15
char id=63 x=76 y=25 width=28 height=24 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=15
char id=64 x=105 y=25 width=20 height=24 xoffset=0 yoffset=0 xadvance=20 page=0 chnl=15
-char id=65 x=126 y=25 width=17 height=24 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15
\ No newline at end of file
+char id=65 x=126 y=25 width=17 height=24 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15
+char id=66 x=145 y=27 width=24 height=22 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
+char id=67 x=169 y=27 width=24 height=22 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
+char id=68 x=195 y=27 width=24 height=22 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
+char id=69 x=218 y=26 width=21 height=24 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15
+char id=70 x=0 y=47 width=18 height=26 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15
+char id=71 x=17 y=48 width=22 height=24 xoffset=0 yoffset=0 xadvance=22 page=0 chnl=15
+char id=72 x=39 y=48 width=14 height=24 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
diff --git a/resources/fonts/crystal-icons.png b/resources/fonts/crystal-icons.png
index 9a7b658c..69b968a1 100644
Binary files a/resources/fonts/crystal-icons.png and b/resources/fonts/crystal-icons.png differ
diff --git a/resources/fonts/fonts.xml b/resources/fonts/fonts.xml
index 18a64842..6f8714ce 100644
--- a/resources/fonts/fonts.xml
+++ b/resources/fonts/fonts.xml
@@ -2,9 +2,9 @@
-
-
-
+
+
+
diff --git a/resources/fonts/titillium-web-bold-68-tall.bmfc b/resources/fonts/titillium-web-bold-68-tall.bmfc
index 5c36c932..33400b45 100644
--- a/resources/fonts/titillium-web-bold-68-tall.bmfc
+++ b/resources/fonts/titillium-web-bold-68-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
diff --git a/resources/fonts/titillium-web-bold-68-tall.fnt b/resources/fonts/titillium-web-bold-68-tall.fnt
index 61201be0..ed904213 100644
--- a/resources/fonts/titillium-web-bold-68-tall.fnt
+++ b/resources/fonts/titillium-web-bold-68-tall.fnt
@@ -1,14 +1,14 @@
info face="Titillium Web" size=-68 bold=1 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=49 base=49 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+common lineHeight=109 base=81 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-bold-68-tall_0.png"
chars count=10
-char id=48 x=0 y=0 width=37 height=49 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15
-char id=49 x=67 y=50 width=25 height=47 xoffset=4 yoffset=1 xadvance=38 page=0 chnl=15
-char id=50 x=215 y=0 width=31 height=48 xoffset=3 yoffset=0 xadvance=38 page=0 chnl=15
-char id=51 x=148 y=0 width=32 height=49 xoffset=3 yoffset=0 xadvance=38 page=0 chnl=15
-char id=52 x=32 y=50 width=34 height=47 xoffset=2 yoffset=1 xadvance=38 page=0 chnl=15
-char id=53 x=181 y=0 width=33 height=48 xoffset=2 yoffset=1 xadvance=38 page=0 chnl=15
-char id=54 x=38 y=0 width=36 height=49 xoffset=1 yoffset=0 xadvance=38 page=0 chnl=15
-char id=55 x=0 y=50 width=31 height=48 xoffset=3 yoffset=1 xadvance=38 page=0 chnl=15
-char id=56 x=75 y=0 width=36 height=49 xoffset=1 yoffset=0 xadvance=38 page=0 chnl=15
-char id=57 x=112 y=0 width=35 height=49 xoffset=1 yoffset=0 xadvance=38 page=0 chnl=15
+char id=48 x=0 y=0 width=36 height=49 xoffset=1 yoffset=33 xadvance=38 page=0 chnl=15
+char id=49 x=66 y=50 width=24 height=47 xoffset=5 yoffset=34 xadvance=38 page=0 chnl=15
+char id=50 x=206 y=0 width=30 height=48 xoffset=4 yoffset=33 xadvance=38 page=0 chnl=15
+char id=51 x=142 y=0 width=30 height=49 xoffset=4 yoffset=33 xadvance=38 page=0 chnl=15
+char id=52 x=31 y=50 width=34 height=47 xoffset=2 yoffset=34 xadvance=38 page=0 chnl=15
+char id=53 x=173 y=0 width=32 height=48 xoffset=3 yoffset=34 xadvance=38 page=0 chnl=15
+char id=54 x=37 y=0 width=34 height=49 xoffset=2 yoffset=33 xadvance=38 page=0 chnl=15
+char id=55 x=0 y=50 width=30 height=48 xoffset=4 yoffset=34 xadvance=38 page=0 chnl=15
+char id=56 x=72 y=0 width=34 height=49 xoffset=2 yoffset=33 xadvance=38 page=0 chnl=15
+char id=57 x=107 y=0 width=34 height=49 xoffset=2 yoffset=33 xadvance=38 page=0 chnl=15
diff --git a/resources/fonts/titillium-web-bold-68-tall_0.png b/resources/fonts/titillium-web-bold-68-tall_0.png
index 6661cf12..84d543fe 100644
Binary files a/resources/fonts/titillium-web-bold-68-tall_0.png and b/resources/fonts/titillium-web-bold-68-tall_0.png differ
diff --git a/resources/fonts/titillium-web-light-68-tall.bmfc b/resources/fonts/titillium-web-light-68-tall.bmfc
index 0055f7d2..e95db30c 100644
--- a/resources/fonts/titillium-web-light-68-tall.bmfc
+++ b/resources/fonts/titillium-web-light-68-tall.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=0
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,6 +54,6 @@ invB=0
outlineThickness=0
# selected chars
-chars=48-57
+chars=48-58
# imported icon images
diff --git a/resources/fonts/titillium-web-light-68-tall.fnt b/resources/fonts/titillium-web-light-68-tall.fnt
index 9bce10ab..dcd50625 100644
--- a/resources/fonts/titillium-web-light-68-tall.fnt
+++ b/resources/fonts/titillium-web-light-68-tall.fnt
@@ -1,14 +1,15 @@
info face="Titillium Web Light" size=-68 bold=0 italic=0 charset="" unicode=1 stretchH=105 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=49 base=49 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+common lineHeight=109 base=81 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-light-68-tall_0.png"
-chars count=10
-char id=48 x=37 y=0 width=34 height=49 xoffset=2 yoffset=0 xadvance=38 page=0 chnl=15
-char id=49 x=66 y=50 width=20 height=48 xoffset=7 yoffset=0 xadvance=38 page=0 chnl=15
-char id=50 x=35 y=50 width=30 height=48 xoffset=4 yoffset=0 xadvance=38 page=0 chnl=15
-char id=51 x=174 y=0 width=31 height=49 xoffset=3 yoffset=0 xadvance=38 page=0 chnl=15
-char id=52 x=0 y=50 width=34 height=48 xoffset=2 yoffset=0 xadvance=38 page=0 chnl=15
-char id=53 x=141 y=0 width=32 height=49 xoffset=3 yoffset=0 xadvance=38 page=0 chnl=15
-char id=54 x=72 y=0 width=34 height=49 xoffset=2 yoffset=0 xadvance=38 page=0 chnl=15
-char id=55 x=206 y=0 width=30 height=49 xoffset=4 yoffset=0 xadvance=38 page=0 chnl=15
-char id=56 x=0 y=0 width=36 height=49 xoffset=1 yoffset=0 xadvance=38 page=0 chnl=15
-char id=57 x=107 y=0 width=33 height=49 xoffset=2 yoffset=0 xadvance=38 page=0 chnl=15
+chars count=11
+char id=48 x=35 y=0 width=32 height=49 xoffset=3 yoffset=33 xadvance=38 page=0 chnl=15
+char id=49 x=228 y=0 width=18 height=47 xoffset=8 yoffset=34 xadvance=38 page=0 chnl=15
+char id=50 x=197 y=0 width=30 height=48 xoffset=4 yoffset=33 xadvance=38 page=0 chnl=15
+char id=51 x=134 y=0 width=30 height=49 xoffset=4 yoffset=33 xadvance=38 page=0 chnl=15
+char id=52 x=29 y=50 width=34 height=47 xoffset=2 yoffset=34 xadvance=38 page=0 chnl=15
+char id=53 x=165 y=0 width=31 height=48 xoffset=4 yoffset=34 xadvance=38 page=0 chnl=15
+char id=54 x=68 y=0 width=32 height=49 xoffset=3 yoffset=33 xadvance=38 page=0 chnl=15
+char id=55 x=0 y=50 width=28 height=48 xoffset=5 yoffset=34 xadvance=38 page=0 chnl=15
+char id=56 x=0 y=0 width=34 height=49 xoffset=2 yoffset=33 xadvance=38 page=0 chnl=15
+char id=57 x=101 y=0 width=32 height=49 xoffset=3 yoffset=33 xadvance=38 page=0 chnl=15
+char id=58 x=247 y=0 width=6 height=31 xoffset=4 yoffset=50 xadvance=14 page=0 chnl=15
diff --git a/resources/fonts/titillium-web-light-68-tall_0.png b/resources/fonts/titillium-web-light-68-tall_0.png
index bcde7549..b740243e 100644
Binary files a/resources/fonts/titillium-web-light-68-tall_0.png and b/resources/fonts/titillium-web-light-68-tall_0.png differ
diff --git a/resources/fonts/titillium-web-semibold-24-chars.txt b/resources/fonts/titillium-web-semibold-24-chars.txt
index 4a273147..7d872abd 100644
--- a/resources/fonts/titillium-web-semibold-24-chars.txt
+++ b/resources/fonts/titillium-web-semibold-24-chars.txt
@@ -1,8 +1,8 @@
0123456789AP
- 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÁÄÅÉÍÖØÚČĚŘŚŠŹŽ
- 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÁÄÅÉÍÖØÚČĚŘŚŠŹŽ
+ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÁÄÅÉÍÖØÚÛČĚŘŚŠŹŽ
+ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÁÄÅÉÍÖØÚÛČĚŘŚŠŹŽ
%0123456789
%-.0123456789!:?CFabefgikmpsty°
%',-.0123456789!:?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz°ÅÍÎÖáãäåæèéíðñóôöøûüž
- 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÁÄÅÉÍÖØÚČĚŘŚŠŹŽ
+ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÁÄÅÉÍÖØÚÛČĚŘŚŠŹŽ
%0123456789
\ No newline at end of file
diff --git a/resources/fonts/titillium-web-semibold-24.bmfc b/resources/fonts/titillium-web-semibold-24.bmfc
index d2b2de57..f98fa303 100644
--- a/resources/fonts/titillium-web-semibold-24.bmfc
+++ b/resources/fonts/titillium-web-semibold-24.bmfc
@@ -18,6 +18,9 @@ dontIncludeKerningPairs=0
useHinting=1
renderFromOutline=0
useClearType=1
+autoFitNumPages=0
+autoFitFontSizeMin=0
+autoFitFontSizeMax=0
# character alignment
paddingDown=0
@@ -28,6 +31,7 @@ spacingHoriz=1
spacingVert=1
useFixedHeight=0
forceZero=0
+widthPaddingFactor=0.00
# output file
outWidth=256
@@ -50,7 +54,7 @@ invB=0
outlineThickness=0
# selected chars
-chars=32-33,37,39,44-46,48-58,63,65-90,97-122,176,192-223,225,227-230,232-233,237,240-241,243-244,246
+chars=32-33,37,39,43-46,48-58,63,65-90,97-122,176,192-223,225,227-230,232-233,237,240-241,243-244,246
chars=248,251-252,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296
chars=298,300,302,304,308,310,313,315,317,321,323,325,327,330,332,334,336,338,340,342,344,346,348,350
chars=352,356,358,360,362,364,366,368,370,372,374,376-377,379,381-382
diff --git a/resources/fonts/titillium-web-semibold-24.fnt b/resources/fonts/titillium-web-semibold-24.fnt
index b5f857e1..85ff9df6 100644
--- a/resources/fonts/titillium-web-semibold-24.fnt
+++ b/resources/fonts/titillium-web-semibold-24.fnt
@@ -1,125 +1,126 @@
info face="Titillium Web SemiBold" size=-24 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=36 base=27 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="titillium-web-semibold-24_0.png"
-chars count=181
+chars count=182
char id=32 x=102 y=137 width=3 height=1 xoffset=-1 yoffset=35 xadvance=5 page=0 chnl=15
-char id=33 x=97 y=176 width=4 height=17 xoffset=1 yoffset=10 xadvance=6 page=0 chnl=15
-char id=37 x=141 y=116 width=14 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=39 x=100 y=194 width=4 height=7 xoffset=1 yoffset=10 xadvance=5 page=0 chnl=15
-char id=44 x=105 y=193 width=5 height=6 xoffset=0 yoffset=24 xadvance=6 page=0 chnl=15
-char id=45 x=116 y=193 width=8 height=3 xoffset=1 yoffset=19 xadvance=10 page=0 chnl=15
-char id=46 x=111 y=193 width=4 height=4 xoffset=1 yoffset=23 xadvance=6 page=0 chnl=15
-char id=48 x=186 y=115 width=13 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=33 x=87 y=177 width=4 height=17 xoffset=1 yoffset=10 xadvance=6 page=0 chnl=15
+char id=37 x=171 y=116 width=14 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=39 x=114 y=193 width=4 height=7 xoffset=1 yoffset=10 xadvance=5 page=0 chnl=15
+char id=43 x=40 y=195 width=13 height=12 xoffset=0 yoffset=15 xadvance=13 page=0 chnl=15
+char id=44 x=119 y=193 width=5 height=6 xoffset=0 yoffset=24 xadvance=6 page=0 chnl=15
+char id=45 x=130 y=190 width=8 height=3 xoffset=1 yoffset=19 xadvance=10 page=0 chnl=15
+char id=46 x=125 y=193 width=4 height=4 xoffset=1 yoffset=23 xadvance=6 page=0 chnl=15
+char id=48 x=228 y=115 width=13 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
char id=49 x=128 y=173 width=9 height=16 xoffset=1 yoffset=11 xadvance=13 page=0 chnl=15
-char id=50 x=228 y=152 width=12 height=17 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
-char id=51 x=26 y=140 width=12 height=18 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
+char id=50 x=241 y=152 width=12 height=17 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
+char id=51 x=13 y=140 width=12 height=18 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
char id=52 x=102 y=176 width=13 height=16 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15
-char id=53 x=0 y=177 width=12 height=17 xoffset=1 yoffset=11 xadvance=13 page=0 chnl=15
+char id=53 x=228 y=152 width=12 height=17 xoffset=1 yoffset=11 xadvance=13 page=0 chnl=15
char id=54 x=200 y=115 width=13 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
char id=55 x=116 y=176 width=11 height=16 xoffset=1 yoffset=11 xadvance=13 page=0 chnl=15
char id=56 x=214 y=115 width=13 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=57 x=117 y=155 width=13 height=17 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15
+char id=57 x=173 y=153 width=13 height=17 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15
char id=58 x=251 y=170 width=4 height=11 xoffset=1 yoffset=16 xadvance=6 page=0 chnl=15
char id=63 x=61 y=177 width=10 height=17 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15
-char id=65 x=190 y=134 width=15 height=17 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15
-char id=66 x=89 y=158 width=13 height=17 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
-char id=67 x=52 y=140 width=12 height=18 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
-char id=68 x=15 y=159 width=14 height=17 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
-char id=69 x=241 y=152 width=12 height=17 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
-char id=70 x=215 y=152 width=12 height=17 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
-char id=71 x=171 y=116 width=14 height=18 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15
-char id=72 x=0 y=159 width=14 height=17 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
-char id=73 x=87 y=177 width=4 height=17 xoffset=1 yoffset=10 xadvance=6 page=0 chnl=15
+char id=65 x=222 y=134 width=15 height=17 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15
+char id=66 x=131 y=155 width=13 height=17 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
+char id=67 x=0 y=140 width=12 height=18 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
+char id=68 x=45 y=159 width=14 height=17 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
+char id=69 x=215 y=152 width=12 height=17 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
+char id=70 x=0 y=177 width=12 height=17 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
+char id=71 x=141 y=116 width=14 height=18 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15
+char id=72 x=30 y=159 width=14 height=17 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
+char id=73 x=97 y=176 width=4 height=17 xoffset=1 yoffset=10 xadvance=6 page=0 chnl=15
char id=74 x=248 y=95 width=6 height=19 xoffset=0 yoffset=10 xadvance=7 page=0 chnl=15
-char id=75 x=187 y=153 width=13 height=17 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15
-char id=76 x=25 y=177 width=11 height=17 xoffset=1 yoffset=10 xadvance=11 page=0 chnl=15
+char id=75 x=145 y=155 width=13 height=17 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15
+char id=76 x=49 y=177 width=11 height=17 xoffset=1 yoffset=10 xadvance=11 page=0 chnl=15
char id=77 x=153 y=135 width=18 height=17 xoffset=1 yoffset=10 xadvance=20 page=0 chnl=15
-char id=78 x=238 y=134 width=14 height=17 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
+char id=78 x=15 y=159 width=14 height=17 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
char id=79 x=125 y=118 width=15 height=18 xoffset=0 yoffset=10 xadvance=16 page=0 chnl=15
-char id=80 x=173 y=153 width=13 height=17 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15
+char id=80 x=201 y=152 width=13 height=17 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15
char id=81 x=70 y=97 width=15 height=21 xoffset=0 yoffset=10 xadvance=16 page=0 chnl=15
-char id=82 x=201 y=152 width=13 height=17 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
-char id=83 x=228 y=115 width=13 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=84 x=159 y=153 width=13 height=17 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=82 x=187 y=153 width=13 height=17 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
+char id=83 x=186 y=115 width=13 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=84 x=117 y=155 width=13 height=17 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
char id=85 x=156 y=116 width=14 height=18 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
-char id=86 x=60 y=159 width=14 height=17 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15
+char id=86 x=0 y=159 width=14 height=17 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15
char id=87 x=108 y=137 width=22 height=17 xoffset=0 yoffset=10 xadvance=22 page=0 chnl=15
-char id=88 x=45 y=159 width=14 height=17 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15
-char id=89 x=30 y=159 width=14 height=17 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=90 x=131 y=155 width=13 height=17 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=97 x=184 y=171 width=12 height=14 xoffset=0 yoffset=14 xadvance=12 page=0 chnl=15
-char id=98 x=39 y=140 width=12 height=18 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
+char id=88 x=238 y=134 width=14 height=17 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15
+char id=89 x=60 y=159 width=14 height=17 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=90 x=89 y=158 width=13 height=17 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=97 x=171 y=171 width=12 height=14 xoffset=0 yoffset=14 xadvance=12 page=0 chnl=15
+char id=98 x=242 y=115 width=12 height=18 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
char id=99 x=209 y=170 width=10 height=14 xoffset=0 yoffset=14 xadvance=11 page=0 chnl=15
-char id=100 x=13 y=140 width=12 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=101 x=171 y=171 width=12 height=14 xoffset=0 yoffset=14 xadvance=12 page=0 chnl=15
+char id=100 x=39 y=140 width=12 height=18 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=101 x=158 y=173 width=12 height=14 xoffset=0 yoffset=14 xadvance=12 page=0 chnl=15
char id=102 x=89 y=139 width=9 height=18 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15
char id=103 x=155 y=96 width=13 height=19 xoffset=0 yoffset=14 xadvance=13 page=0 chnl=15
-char id=104 x=13 y=177 width=11 height=17 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
-char id=105 x=92 y=176 width=4 height=17 xoffset=1 yoffset=10 xadvance=6 page=0 chnl=15
-char id=106 x=247 y=0 width=7 height=23 xoffset=-2 yoffset=10 xadvance=6 page=0 chnl=15
-char id=107 x=49 y=177 width=11 height=17 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15
-char id=108 x=82 y=177 width=4 height=17 xoffset=1 yoffset=10 xadvance=6 page=0 chnl=15
+char id=104 x=25 y=177 width=11 height=17 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
+char id=105 x=82 y=177 width=4 height=17 xoffset=1 yoffset=10 xadvance=6 page=0 chnl=15
+char id=106 x=171 y=49 width=7 height=23 xoffset=-2 yoffset=10 xadvance=6 page=0 chnl=15
+char id=107 x=13 y=177 width=11 height=17 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15
+char id=108 x=92 y=176 width=4 height=17 xoffset=1 yoffset=10 xadvance=6 page=0 chnl=15
char id=109 x=220 y=170 width=18 height=13 xoffset=1 yoffset=14 xadvance=20 page=0 chnl=15
char id=110 x=239 y=170 width=11 height=13 xoffset=1 yoffset=14 xadvance=13 page=0 chnl=15
-char id=111 x=158 y=173 width=12 height=14 xoffset=0 yoffset=14 xadvance=13 page=0 chnl=15
-char id=112 x=39 y=120 width=12 height=19 xoffset=1 yoffset=14 xadvance=13 page=0 chnl=15
-char id=113 x=52 y=120 width=12 height=19 xoffset=0 yoffset=14 xadvance=13 page=0 chnl=15
+char id=111 x=184 y=171 width=12 height=14 xoffset=0 yoffset=14 xadvance=13 page=0 chnl=15
+char id=112 x=52 y=120 width=12 height=19 xoffset=1 yoffset=14 xadvance=13 page=0 chnl=15
+char id=113 x=65 y=120 width=12 height=19 xoffset=0 yoffset=14 xadvance=13 page=0 chnl=15
char id=114 x=12 y=195 width=8 height=13 xoffset=1 yoffset=14 xadvance=9 page=0 chnl=15
char id=115 x=197 y=171 width=11 height=14 xoffset=0 yoffset=14 xadvance=11 page=0 chnl=15
char id=116 x=72 y=177 width=9 height=17 xoffset=0 yoffset=11 xadvance=9 page=0 chnl=15
char id=117 x=0 y=195 width=11 height=13 xoffset=1 yoffset=15 xadvance=13 page=0 chnl=15
-char id=118 x=40 y=195 width=12 height=12 xoffset=0 yoffset=15 xadvance=12 page=0 chnl=15
+char id=118 x=54 y=195 width=12 height=12 xoffset=0 yoffset=15 xadvance=12 page=0 chnl=15
char id=119 x=21 y=195 width=18 height=12 xoffset=0 yoffset=15 xadvance=18 page=0 chnl=15
-char id=120 x=53 y=195 width=11 height=12 xoffset=0 yoffset=15 xadvance=11 page=0 chnl=15
-char id=121 x=242 y=115 width=12 height=18 xoffset=0 yoffset=15 xadvance=12 page=0 chnl=15
-char id=122 x=65 y=195 width=11 height=12 xoffset=0 yoffset=15 xadvance=11 page=0 chnl=15
-char id=176 x=90 y=195 width=9 height=8 xoffset=2 yoffset=10 xadvance=13 page=0 chnl=15
-char id=192 x=0 y=26 width=15 height=23 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15
-char id=193 x=96 y=25 width=15 height=23 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15
+char id=120 x=67 y=195 width=11 height=12 xoffset=0 yoffset=15 xadvance=11 page=0 chnl=15
+char id=121 x=52 y=140 width=12 height=18 xoffset=0 yoffset=15 xadvance=12 page=0 chnl=15
+char id=122 x=79 y=195 width=11 height=12 xoffset=0 yoffset=15 xadvance=11 page=0 chnl=15
+char id=176 x=104 y=193 width=9 height=8 xoffset=2 yoffset=10 xadvance=13 page=0 chnl=15
+char id=192 x=16 y=26 width=15 height=23 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15
+char id=193 x=0 y=26 width=15 height=23 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15
char id=194 x=202 y=49 width=15 height=22 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=15
-char id=195 x=80 y=25 width=15 height=23 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15
-char id=196 x=0 y=74 width=15 height=22 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=15
+char id=195 x=96 y=25 width=15 height=23 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15
+char id=196 x=16 y=74 width=15 height=22 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=15
char id=197 x=86 y=97 width=15 height=21 xoffset=0 yoffset=6 xadvance=14 page=0 chnl=15
char id=198 x=131 y=137 width=21 height=17 xoffset=0 yoffset=10 xadvance=21 page=0 chnl=15
-char id=199 x=135 y=49 width=12 height=23 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
-char id=200 x=109 y=49 width=12 height=23 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=15
-char id=201 x=122 y=49 width=12 height=23 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=15
-char id=202 x=26 y=97 width=12 height=22 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
-char id=203 x=234 y=72 width=12 height=22 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
-char id=204 x=247 y=24 width=7 height=23 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15
-char id=205 x=171 y=49 width=7 height=23 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15
+char id=199 x=109 y=49 width=12 height=23 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
+char id=200 x=122 y=49 width=12 height=23 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=15
+char id=201 x=135 y=49 width=12 height=23 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=15
+char id=202 x=234 y=72 width=12 height=22 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
+char id=203 x=26 y=97 width=12 height=22 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
+char id=204 x=247 y=0 width=7 height=23 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15
+char id=205 x=247 y=24 width=7 height=23 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15
char id=206 x=39 y=97 width=10 height=22 xoffset=-2 yoffset=5 xadvance=6 page=0 chnl=15
char id=207 x=60 y=97 width=9 height=22 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=15
char id=208 x=206 y=134 width=15 height=17 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15
-char id=209 x=202 y=25 width=14 height=23 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
-char id=210 x=70 y=0 width=15 height=24 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
-char id=211 x=118 y=0 width=15 height=24 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
-char id=212 x=48 y=26 width=15 height=23 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15
-char id=213 x=102 y=0 width=15 height=24 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
-char id=214 x=64 y=26 width=15 height=23 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15
-char id=215 x=77 y=195 width=12 height=10 xoffset=1 yoffset=16 xadvance=13 page=0 chnl=15
+char id=209 x=172 y=25 width=14 height=23 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
+char id=210 x=118 y=0 width=15 height=24 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
+char id=211 x=102 y=0 width=15 height=24 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
+char id=212 x=80 y=25 width=15 height=23 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15
+char id=213 x=86 y=0 width=15 height=24 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
+char id=214 x=48 y=26 width=15 height=23 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15
+char id=215 x=91 y=195 width=12 height=10 xoffset=1 yoffset=16 xadvance=13 page=0 chnl=15
char id=216 x=32 y=26 width=15 height=23 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15
-char id=217 x=164 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
-char id=218 x=179 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
+char id=217 x=194 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
+char id=218 x=134 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
char id=219 x=142 y=25 width=14 height=23 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
char id=220 x=157 y=25 width=14 height=23 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=221 x=187 y=25 width=14 height=23 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15
+char id=221 x=127 y=25 width=14 height=23 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15
char id=222 x=75 y=159 width=13 height=17 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15
char id=223 x=169 y=96 width=13 height=19 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
-char id=225 x=26 y=120 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
-char id=227 x=13 y=120 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
-char id=228 x=0 y=120 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
-char id=229 x=235 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+char id=225 x=39 y=120 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+char id=227 x=26 y=120 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+char id=228 x=13 y=120 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+char id=229 x=0 y=120 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
char id=230 x=138 y=173 width=19 height=14 xoffset=0 yoffset=14 xadvance=19 page=0 chnl=15
char id=232 x=222 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
-char id=233 x=196 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+char id=233 x=209 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
char id=237 x=99 y=139 width=8 height=18 xoffset=0 yoffset=9 xadvance=6 page=0 chnl=15
char id=240 x=141 y=96 width=13 height=19 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=241 x=65 y=140 width=11 height=18 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=243 x=183 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=244 x=65 y=120 width=12 height=19 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=246 x=209 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=248 x=0 y=140 width=12 height=18 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15
+char id=241 x=77 y=140 width=11 height=18 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=243 x=196 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=244 x=183 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=246 x=235 y=95 width=12 height=19 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=248 x=26 y=140 width=12 height=18 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15
char id=251 x=78 y=119 width=11 height=19 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
char id=252 x=90 y=119 width=11 height=19 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
char id=256 x=102 y=96 width=15 height=21 xoffset=0 yoffset=6 xadvance=14 page=0 chnl=15
@@ -129,18 +130,18 @@ char id=262 x=223 y=0 width=12 height=24 xoffset=1 yoffset=4
char id=264 x=96 y=49 width=12 height=23 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
char id=266 x=83 y=49 width=12 height=23 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
char id=268 x=70 y=50 width=12 height=23 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
-char id=270 x=32 y=74 width=14 height=22 xoffset=1 yoffset=5 xadvance=15 page=0 chnl=15
-char id=272 x=222 y=134 width=15 height=17 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15
+char id=270 x=62 y=74 width=14 height=22 xoffset=1 yoffset=5 xadvance=15 page=0 chnl=15
+char id=272 x=190 y=134 width=15 height=17 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15
char id=274 x=118 y=96 width=12 height=21 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15
char id=276 x=208 y=72 width=12 height=22 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
char id=278 x=221 y=72 width=12 height=22 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
char id=280 x=0 y=97 width=12 height=22 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15
char id=282 x=13 y=97 width=12 height=22 xoffset=1 yoffset=5 xadvance=13 page=0 chnl=15
-char id=284 x=217 y=25 width=14 height=23 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15
-char id=286 x=112 y=25 width=14 height=23 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15
-char id=288 x=127 y=25 width=14 height=23 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15
-char id=290 x=0 y=0 width=14 height=25 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15
-char id=292 x=62 y=74 width=14 height=22 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=284 x=112 y=25 width=14 height=23 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15
+char id=286 x=232 y=25 width=14 height=23 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15
+char id=288 x=217 y=25 width=14 height=23 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15
+char id=290 x=15 y=0 width=14 height=25 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15
+char id=292 x=47 y=74 width=14 height=22 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
char id=294 x=172 y=135 width=17 height=17 xoffset=0 yoffset=10 xadvance=16 page=0 chnl=15
char id=296 x=160 y=49 width=10 height=23 xoffset=-2 yoffset=4 xadvance=6 page=0 chnl=15
char id=298 x=131 y=96 width=9 height=21 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15
@@ -152,38 +153,301 @@ char id=310 x=44 y=0 width=13 height=25 xoffset=1 yoffset=10
char id=313 x=148 y=49 width=11 height=23 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=15
char id=315 x=58 y=0 width=11 height=25 xoffset=1 yoffset=10 xadvance=11 page=0 chnl=15
char id=317 x=37 y=177 width=11 height=17 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15
-char id=321 x=103 y=158 width=13 height=17 xoffset=-1 yoffset=10 xadvance=12 page=0 chnl=15
-char id=323 x=232 y=25 width=14 height=23 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
-char id=325 x=15 y=0 width=14 height=25 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
+char id=321 x=159 y=153 width=13 height=17 xoffset=-1 yoffset=10 xadvance=12 page=0 chnl=15
+char id=323 x=202 y=25 width=14 height=23 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
+char id=325 x=0 y=0 width=14 height=25 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
char id=327 x=77 y=74 width=14 height=22 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
char id=330 x=92 y=73 width=14 height=22 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
-char id=332 x=16 y=74 width=15 height=22 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
-char id=334 x=16 y=26 width=15 height=23 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15
-char id=336 x=86 y=0 width=15 height=24 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
+char id=332 x=0 y=74 width=15 height=22 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=334 x=64 y=26 width=15 height=23 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15
+char id=336 x=70 y=0 width=15 height=24 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
char id=338 x=102 y=118 width=22 height=18 xoffset=0 yoffset=10 xadvance=22 page=0 chnl=15
-char id=340 x=28 y=50 width=13 height=23 xoffset=1 yoffset=4 xadvance=15 page=0 chnl=15
+char id=340 x=42 y=50 width=13 height=23 xoffset=1 yoffset=4 xadvance=15 page=0 chnl=15
char id=342 x=30 y=0 width=13 height=25 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
char id=344 x=166 y=73 width=13 height=22 xoffset=1 yoffset=5 xadvance=15 page=0 chnl=15
char id=346 x=209 y=0 width=13 height=24 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15
-char id=348 x=14 y=50 width=13 height=23 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
-char id=350 x=0 y=50 width=13 height=23 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=352 x=56 y=50 width=13 height=23 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
+char id=348 x=28 y=50 width=13 height=23 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
+char id=350 x=14 y=50 width=13 height=23 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=352 x=0 y=50 width=13 height=23 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
char id=356 x=152 y=73 width=13 height=22 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
-char id=358 x=145 y=155 width=13 height=17 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=358 x=103 y=158 width=13 height=17 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
char id=360 x=149 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
-char id=362 x=47 y=74 width=14 height=22 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
-char id=364 x=172 y=25 width=14 height=23 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
-char id=366 x=194 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
-char id=368 x=134 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
+char id=362 x=32 y=74 width=14 height=22 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=15
+char id=364 x=187 y=25 width=14 height=23 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15
+char id=366 x=179 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
+char id=368 x=164 y=0 width=14 height=24 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
char id=370 x=107 y=73 width=14 height=22 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=15
char id=372 x=179 y=49 width=22 height=22 xoffset=0 yoffset=5 xadvance=22 page=0 chnl=15
char id=374 x=122 y=73 width=14 height=22 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
char id=376 x=137 y=73 width=14 height=22 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
-char id=377 x=42 y=50 width=13 height=23 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15
+char id=377 x=56 y=50 width=13 height=23 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15
char id=379 x=194 y=72 width=13 height=22 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
char id=381 x=180 y=72 width=13 height=22 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15
-char id=382 x=77 y=140 width=11 height=18 xoffset=0 yoffset=9 xadvance=11 page=0 chnl=15
-kernings count=980
+char id=382 x=65 y=140 width=11 height=18 xoffset=0 yoffset=9 xadvance=11 page=0 chnl=15
+kernings count=1243
+kerning first=39 second=198 amount=-1
+kerning first=44 second=86 amount=-1
+kerning first=44 second=118 amount=-1
+kerning first=45 second=86 amount=-1
+kerning first=45 second=88 amount=-1
+kerning first=45 second=120 amount=-1
+kerning first=46 second=86 amount=-1
+kerning first=46 second=118 amount=-1
+kerning first=65 second=86 amount=-1
+kerning first=66 second=89 amount=-1
+kerning first=66 second=221 amount=-1
+kerning first=66 second=374 amount=-1
+kerning first=66 second=376 amount=-1
+kerning first=70 second=44 amount=-1
+kerning first=70 second=46 amount=-1
+kerning first=70 second=65 amount=-1
+kerning first=70 second=97 amount=-1
+kerning first=70 second=192 amount=-1
+kerning first=70 second=193 amount=-1
+kerning first=70 second=194 amount=-1
+kerning first=70 second=195 amount=-1
+kerning first=70 second=196 amount=-1
+kerning first=70 second=197 amount=-1
+kerning first=70 second=198 amount=-1
+kerning first=70 second=225 amount=-1
+kerning first=70 second=227 amount=-1
+kerning first=70 second=228 amount=-1
+kerning first=70 second=229 amount=-1
+kerning first=70 second=230 amount=-1
+kerning first=70 second=256 amount=-1
+kerning first=70 second=258 amount=-1
+kerning first=70 second=260 amount=-1
+kerning first=76 second=86 amount=-1
+kerning first=76 second=118 amount=-1
+kerning first=80 second=44 amount=-2
+kerning first=80 second=46 amount=-2
+kerning first=80 second=65 amount=-1
+kerning first=80 second=192 amount=-1
+kerning first=80 second=193 amount=-1
+kerning first=80 second=194 amount=-1
+kerning first=80 second=195 amount=-1
+kerning first=80 second=196 amount=-1
+kerning first=80 second=197 amount=-1
+kerning first=80 second=198 amount=-1
+kerning first=80 second=256 amount=-1
+kerning first=80 second=258 amount=-1
+kerning first=80 second=260 amount=-1
+kerning first=84 second=118 amount=-1
+kerning first=84 second=120 amount=-1
+kerning first=84 second=198 amount=-1
+kerning first=84 second=227 amount=-1
+kerning first=84 second=228 amount=-2
+kerning first=84 second=240 amount=-1
+kerning first=86 second=44 amount=-1
+kerning first=86 second=45 amount=-1
+kerning first=86 second=46 amount=-1
+kerning first=86 second=65 amount=-1
+kerning first=86 second=97 amount=-1
+kerning first=86 second=99 amount=-1
+kerning first=86 second=100 amount=-1
+kerning first=86 second=101 amount=-1
+kerning first=86 second=103 amount=-1
+kerning first=86 second=109 amount=-1
+kerning first=86 second=110 amount=-1
+kerning first=86 second=111 amount=-1
+kerning first=86 second=112 amount=-1
+kerning first=86 second=113 amount=-1
+kerning first=86 second=114 amount=-1
+kerning first=86 second=115 amount=-1
+kerning first=86 second=192 amount=-1
+kerning first=86 second=193 amount=-1
+kerning first=86 second=194 amount=-1
+kerning first=86 second=195 amount=-1
+kerning first=86 second=196 amount=-1
+kerning first=86 second=197 amount=-1
+kerning first=86 second=198 amount=-1
+kerning first=86 second=225 amount=-1
+kerning first=86 second=227 amount=-1
+kerning first=86 second=228 amount=-1
+kerning first=86 second=229 amount=-1
+kerning first=86 second=230 amount=-1
+kerning first=86 second=232 amount=-1
+kerning first=86 second=233 amount=-1
+kerning first=86 second=240 amount=-1
+kerning first=86 second=241 amount=-1
+kerning first=86 second=243 amount=-1
+kerning first=86 second=244 amount=-1
+kerning first=86 second=246 amount=-1
+kerning first=86 second=248 amount=-1
+kerning first=86 second=256 amount=-1
+kerning first=86 second=258 amount=-1
+kerning first=86 second=260 amount=-1
+kerning first=87 second=198 amount=-1
+kerning first=88 second=45 amount=-1
+kerning first=88 second=99 amount=-1
+kerning first=88 second=101 amount=-1
+kerning first=88 second=111 amount=-1
+kerning first=88 second=118 amount=-1
+kerning first=88 second=119 amount=-1
+kerning first=88 second=121 amount=-1
+kerning first=88 second=232 amount=-1
+kerning first=88 second=233 amount=-1
+kerning first=88 second=243 amount=-1
+kerning first=88 second=244 amount=-1
+kerning first=88 second=246 amount=-1
+kerning first=88 second=248 amount=-1
+kerning first=89 second=118 amount=-1
+kerning first=89 second=120 amount=-1
+kerning first=89 second=198 amount=-1
+kerning first=89 second=227 amount=-1
+kerning first=89 second=228 amount=-1
+kerning first=89 second=240 amount=-1
+kerning first=97 second=86 amount=-1
+kerning first=98 second=86 amount=-1
+kerning first=101 second=86 amount=-1
+kerning first=102 second=44 amount=-1
+kerning first=102 second=45 amount=-1
+kerning first=102 second=46 amount=-1
+kerning first=102 second=65 amount=-1
+kerning first=102 second=192 amount=-1
+kerning first=102 second=193 amount=-1
+kerning first=102 second=194 amount=-1
+kerning first=102 second=195 amount=-1
+kerning first=102 second=196 amount=-1
+kerning first=102 second=197 amount=-1
+kerning first=102 second=198 amount=-1
+kerning first=102 second=240 amount=-1
+kerning first=102 second=256 amount=-1
+kerning first=102 second=258 amount=-1
+kerning first=102 second=260 amount=-1
+kerning first=103 second=106 amount=1
+kerning first=104 second=86 amount=-1
+kerning first=109 second=86 amount=-1
+kerning first=110 second=86 amount=-1
+kerning first=111 second=86 amount=-1
+kerning first=111 second=88 amount=-1
+kerning first=112 second=86 amount=-1
+kerning first=113 second=86 amount=-1
+kerning first=114 second=88 amount=-1
+kerning first=114 second=198 amount=-1
+kerning first=114 second=240 amount=-1
+kerning first=117 second=86 amount=-1
+kerning first=118 second=44 amount=-1
+kerning first=118 second=46 amount=-1
+kerning first=118 second=84 amount=-1
+kerning first=118 second=88 amount=-1
+kerning first=118 second=89 amount=-1
+kerning first=118 second=221 amount=-1
+kerning first=118 second=356 amount=-1
+kerning first=118 second=358 amount=-1
+kerning first=118 second=374 amount=-1
+kerning first=118 second=376 amount=-1
+kerning first=119 second=88 amount=-1
+kerning first=120 second=45 amount=-1
+kerning first=120 second=84 amount=-1
+kerning first=120 second=89 amount=-1
+kerning first=120 second=221 amount=-1
+kerning first=120 second=356 amount=-1
+kerning first=120 second=358 amount=-1
+kerning first=120 second=374 amount=-1
+kerning first=120 second=376 amount=-1
+kerning first=121 second=88 amount=-1
+kerning first=192 second=86 amount=-1
+kerning first=193 second=86 amount=-1
+kerning first=194 second=86 amount=-1
+kerning first=195 second=86 amount=-1
+kerning first=196 second=86 amount=-1
+kerning first=197 second=86 amount=-1
+kerning first=221 second=118 amount=-1
+kerning first=221 second=120 amount=-1
+kerning first=221 second=198 amount=-1
+kerning first=221 second=227 amount=-1
+kerning first=221 second=228 amount=-1
+kerning first=221 second=240 amount=-1
+kerning first=222 second=44 amount=-1
+kerning first=222 second=46 amount=-1
+kerning first=222 second=84 amount=-1
+kerning first=222 second=88 amount=-1
+kerning first=222 second=89 amount=-1
+kerning first=222 second=221 amount=-1
+kerning first=222 second=356 amount=-1
+kerning first=222 second=358 amount=-1
+kerning first=222 second=374 amount=-1
+kerning first=222 second=376 amount=-1
+kerning first=223 second=84 amount=-1
+kerning first=223 second=86 amount=-1
+kerning first=223 second=89 amount=-1
+kerning first=223 second=221 amount=-1
+kerning first=223 second=356 amount=-1
+kerning first=223 second=358 amount=-1
+kerning first=223 second=374 amount=-1
+kerning first=223 second=376 amount=-1
+kerning first=225 second=86 amount=-1
+kerning first=227 second=86 amount=-1
+kerning first=228 second=86 amount=-1
+kerning first=229 second=86 amount=-1
+kerning first=230 second=86 amount=-1
+kerning first=232 second=86 amount=-1
+kerning first=233 second=86 amount=-1
+kerning first=237 second=39 amount=1
+kerning first=237 second=63 amount=1
+kerning first=240 second=84 amount=-1
+kerning first=240 second=88 amount=-1
+kerning first=240 second=89 amount=-1
+kerning first=240 second=221 amount=-1
+kerning first=240 second=356 amount=-1
+kerning first=240 second=358 amount=-1
+kerning first=240 second=374 amount=-1
+kerning first=240 second=376 amount=-1
+kerning first=241 second=86 amount=-1
+kerning first=243 second=86 amount=-1
+kerning first=243 second=88 amount=-1
+kerning first=244 second=86 amount=-1
+kerning first=244 second=88 amount=-1
+kerning first=246 second=86 amount=-1
+kerning first=246 second=88 amount=-1
+kerning first=248 second=86 amount=-1
+kerning first=248 second=88 amount=-1
+kerning first=251 second=86 amount=-1
+kerning first=252 second=86 amount=-1
+kerning first=256 second=86 amount=-1
+kerning first=258 second=86 amount=-1
+kerning first=260 second=86 amount=-1
+kerning first=260 second=106 amount=1
+kerning first=313 second=86 amount=-1
+kerning first=313 second=118 amount=-1
+kerning first=315 second=86 amount=-1
+kerning first=315 second=118 amount=-1
+kerning first=317 second=39 amount=-2
+kerning first=317 second=84 amount=-1
+kerning first=317 second=86 amount=-1
+kerning first=317 second=87 amount=-1
+kerning first=317 second=118 amount=-1
+kerning first=317 second=356 amount=-1
+kerning first=317 second=358 amount=-1
+kerning first=317 second=372 amount=-1
+kerning first=321 second=86 amount=-1
+kerning first=321 second=118 amount=-1
+kerning first=356 second=118 amount=-1
+kerning first=356 second=120 amount=-1
+kerning first=356 second=198 amount=-1
+kerning first=356 second=227 amount=-1
+kerning first=356 second=228 amount=-2
+kerning first=356 second=240 amount=-1
+kerning first=358 second=118 amount=-1
+kerning first=358 second=120 amount=-1
+kerning first=358 second=198 amount=-1
+kerning first=358 second=227 amount=-1
+kerning first=358 second=228 amount=-2
+kerning first=358 second=240 amount=-1
+kerning first=372 second=198 amount=-1
+kerning first=374 second=118 amount=-1
+kerning first=374 second=120 amount=-1
+kerning first=374 second=198 amount=-1
+kerning first=374 second=227 amount=-1
+kerning first=374 second=228 amount=-1
+kerning first=374 second=240 amount=-1
+kerning first=376 second=118 amount=-1
+kerning first=376 second=120 amount=-1
+kerning first=376 second=198 amount=-1
+kerning first=376 second=227 amount=-1
+kerning first=376 second=228 amount=-1
+kerning first=376 second=240 amount=-1
kerning first=39 second=45 amount=-2
kerning first=39 second=65 amount=-1
kerning first=39 second=192 amount=-1
diff --git a/resources/fonts/titillium-web-semibold-24_0.png b/resources/fonts/titillium-web-semibold-24_0.png
index ce5f8777..46183d73 100644
Binary files a/resources/fonts/titillium-web-semibold-24_0.png and b/resources/fonts/titillium-web-semibold-24_0.png differ
diff --git a/resources/layouts/layout.xml b/resources/layouts/layout.xml
index 149ad044..f76747cc 100644
--- a/resources/layouts/layout.xml
+++ b/resources/layouts/layout.xml
@@ -19,6 +19,8 @@
76
88
+ 160
+ 176
192
208
188
diff --git a/resources/settings/properties.xml b/resources/settings/properties.xml
index 23df79c6..ba673f3b 100644
--- a/resources/settings/properties.xml
+++ b/resources/settings/properties.xml
@@ -1,11 +1,13 @@
-
- 2.5.0
+
0
+
+ false
- 0
- 0
+ false
+
+
0
1
@@ -15,21 +17,36 @@
3
0
- 1
- 2
+ 14
+ 11
- 1
- 0
- 1
- 2
+ 2
+ 5
+ 3
+ 0
+
+ 0
+ 0
+ true
+ true
+ false
+ 0
0
-
- false
- true
-
+
+
+
+ true
+ 2651f49cb20de925fc57590709b86ce6
+
+ false
+ 1
+
+
+ owner-api.teslamotors.com
+ auth.tesla.com
diff --git a/resources/settings/settings.xml b/resources/settings/settings.xml
index d1ad615a..2d8783f2 100644
--- a/resources/settings/settings.xml
+++ b/resources/settings/settings.xml
@@ -1,6 +1,5 @@
-
-
+
@@ -24,6 +23,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@Strings.Steps
@@ -31,7 +49,10 @@
@Strings.ActiveMinutes
@Strings.Battery
@Strings.CaloriesManualGoal
- @Strings.Off
+ @Strings.ActiveCaloriesManualGoal
+ @Strings.BodyBattery
+ @Strings.StressLevel
+ @Strings.Off
@@ -42,7 +63,10 @@
@Strings.ActiveMinutes
@Strings.Battery
@Strings.CaloriesManualGoal
- @Strings.Off
+ @Strings.ActiveCaloriesManualGoal
+ @Strings.BodyBattery
+ @Strings.StressLevel
+ @Strings.Off
@@ -80,6 +104,7 @@
@Strings.BatteryHidePercentage
@Strings.Notifications
@Strings.Calories
+ @Strings.ActiveCalories
@Strings.Distance
@Strings.Alarms
@Strings.Altitude
@@ -88,6 +113,12 @@
@Strings.SunriseSunset
@Strings.Weather
@Strings.Humidity
+ @Strings.PulseOx
+ @Strings.FloorsClimbed
+ @Strings.SolarIntensity
+ @Strings.BodyBattery
+ @Strings.RecoveryTime
+ @Strings.StressLevel
@@ -99,6 +130,7 @@
@Strings.BatteryHidePercentage
@Strings.Notifications
@Strings.Calories
+ @Strings.ActiveCalories
@Strings.Distance
@Strings.Alarms
@Strings.Altitude
@@ -107,6 +139,12 @@
@Strings.SunriseSunset
@Strings.Weather
@Strings.Humidity
+ @Strings.PulseOx
+ @Strings.FloorsClimbed
+ @Strings.SolarIntensity
+ @Strings.BodyBattery
+ @Strings.RecoveryTime
+ @Strings.StressLevel
@@ -118,6 +156,7 @@
@Strings.BatteryHidePercentage
@Strings.Notifications
@Strings.Calories
+ @Strings.ActiveCalories
@Strings.Distance
@Strings.Alarms
@Strings.Altitude
@@ -126,6 +165,12 @@
@Strings.SunriseSunset
@Strings.Weather
@Strings.Humidity
+ @Strings.PulseOx
+ @Strings.FloorsClimbed
+ @Strings.SolarIntensity
+ @Strings.BodyBattery
+ @Strings.RecoveryTime
+ @Strings.StressLevel
@@ -140,6 +185,9 @@
@Strings.Notifications
@Strings.BluetoothOrNotifications
@Strings.Battery
+ @Strings.BatteryNumeric
+ @Strings.Tesla
+ @Strings.DND
@@ -150,6 +198,9 @@
@Strings.Notifications
@Strings.BluetoothOrNotifications
@Strings.Battery
+ @Strings.BatteryNumeric
+ @Strings.Tesla
+ @Strings.DND
@@ -160,6 +211,9 @@
@Strings.Notifications
@Strings.BluetoothOrNotifications
@Strings.Battery
+ @Strings.BatteryNumeric
+ @Strings.Tesla
+ @Strings.DND
@@ -183,10 +237,22 @@
-
+
+
+
+
+
+
+
+ @Strings.HideSecondsOff
+ @Strings.HideSecondsLowPower
+ @Strings.HideSecondsAlways
+
+
+
@@ -195,12 +261,47 @@
@Strings.AllSegments
@Strings.FilledSegments
- @Strings.Hidden
+ @Strings.RecoveryTime
+ @Strings.Hidden
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/strings/strings.xml b/resources/strings/strings.xml
index 3f805380..575ca5ea 100644
--- a/resources/strings/strings.xml
+++ b/resources/strings/strings.xml
@@ -1,7 +1,6 @@
-
- Crystal
- App Version
+ Crystal
+ Crystal-Tesla V2.23.0.b1
Theme
Hours Colour
@@ -14,8 +13,12 @@
Add Local Time in City (Beta)
Move Bar Style
Hide Seconds
+ Show seconds
+ Hide seconds when inactive
+ Always hide seconds
Hide Hours Leading Zero
- OpenWeatherMap API Key Override
+ Hide Day Leading Zero
+ Add colon between hours and minutes
Number Of Data Fields
Data Field 1
@@ -57,8 +60,12 @@
Steps
Floors Climbed
+ Solar Intensity
+ Body Battery
+ Recovery Time
Active Minutes (Weekly)
Calories (Manual Goal)
+ Active Calories (Manual Goal)
Off
Heart Rate
@@ -67,6 +74,7 @@
Battery (Hide Percentage)
Notifications
Calories
+ Active Calories
Distance
Alarms
Altitude
@@ -102,4 +110,27 @@
Nov
Dec
+ Battery Numeric
+ Pulse Ox
+ Tesla Info
+ Tesla Access Token
+ Tesla Refresh Token
+ Location of Tesla's API servers?
+ Location of Tesla's Auth servers?
+ Enter the server domain name
+ Do Not Disturb
+ RGB Theme override
+ In hexadecimal using this format RRGGBB. If this is other than 0, it's this color combination that will be used instead of the theme
+ Light theme override
+ Stress Level
+ Use Complications if available
+ Get Tesla info from Tesla-Link Complications
+ Which vehicle to show?
+ Show weather station name?
+ Default Complication Long Name
+ Battery Complication Long Name
+
+ Latitude
+ Longitude
+ OpenWeatherMap API Key Override
diff --git a/source/BackgroundService.mc b/source/BackgroundService.mc
index 17e30159..958ce2ed 100644
--- a/source/BackgroundService.mc
+++ b/source/BackgroundService.mc
@@ -2,168 +2,142 @@ using Toybox.Background as Bg;
using Toybox.System as Sys;
using Toybox.Communications as Comms;
using Toybox.Application as App;
+using Toybox.Time;
+using Toybox.Time.Gregorian;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
(:background)
class BackgroundService extends Sys.ServiceDelegate {
-
- (:background_method)
+
+ var _token;
+ var _vehicle_id;
+ var _stop;
+ var _bg_data;
+ var _pendingWebRequests;
+
+ (:background)
function initialize() {
+ //DEBUG*/ logMessage("In ServiceDelegate");
Sys.ServiceDelegate.initialize();
+
+ if (_bg_data == null) {
+ _bg_data = Bg.getBackgroundData();
+ if (_bg_data == null) {
+ _bg_data = {};
+ }
+ }
+ else {
+ //DEBUG*/ var keys = _bg_data.keys(); logMessage("initialize: _bg_data has keys " + keys);
+ }
+
+ _stop = false;
+
+//****************************************************************
+//******** REMVOVED THIS SECTION IF TESLA CODE NOT WANTED ********
+//****************************************************************
+ if (Storage.getValue("Tesla") == null || gTeslaComplication == true) {
+ //DEBUG*/ logMessage("initialize:Not doing Tesla because Storage.getValue(\"Tesla\") is null (it's " + Storage.getValue("Tesla") + ") or gTeslaComplication is true (it's " + gTeslaComplication + ")");
+ return;
+ }
+
+ // Get the unexpired token from the buffer if we have one, otherwise from Properties/Storage
+ var teslaInfo = _bg_data.get("TeslaInfo");
+ if (teslaInfo != null) {
+ _token = teslaInfo.get("AccessToken");
+ _vehicle_id = teslaInfo.get("VehicleID");
+ }
+
+ if (_vehicle_id == null) {
+ _vehicle_id = Storage.getValue("TeslaVehicleID");
+ }
+
+ if (_token == null) {
+ _token = $.getStringProperty("TeslaAccessToken", null);
+ }
+
+ if (_token != null && _token.length() == 0) {
+ _token = null;
+ }
+
+//****************************************************************
+//******************** END OF REMVOVED SECTION *******************
+//****************************************************************
}
// Read pending web requests, and call appropriate web request function.
// This function determines priority of web requests, if multiple are pending.
// Pending web request flag will be cleared only once the background data has been successfully received.
- (:background_method)
+ (:background)
function onTemporalEvent() {
- //Sys.println("onTemporalEvent");
- var pendingWebRequests = App.getApp().getProperty("PendingWebRequests");
- if (pendingWebRequests != null) {
-
- // 1. City local time.
- if (pendingWebRequests["CityLocalTime"] != null) {
- makeWebRequest(
- "https://script.google.com/macros/s/AKfycbwPas8x0JMVWRhLaraJSJUcTkdznRifXPDovVZh8mviaf8cTw/exec",
- {
- "city" => App.getApp().getProperty("LocalTimeInCity")
- },
- method(:onReceiveCityLocalTime)
- );
-
- // 2. Weather.
- } else if (pendingWebRequests["OpenWeatherMapCurrent"] != null) {
- var owmKeyOverride = App.getApp().getProperty("OWMKeyOverride");
- makeWebRequest(
- "https://api.openweathermap.org/data/2.5/weather",
- {
- "lat" => App.getApp().getProperty("LastLocationLat"),
- "lon" => App.getApp().getProperty("LastLocationLng"),
-
- // Polite request from Vince, developer of the Crystal Watch Face:
- //
- // Please do not abuse this API key, or else I will be forced to make thousands of users of Crystal
- // sign up for their own Open Weather Map free account, and enter their key in settings - a much worse
- // user experience for everyone.
- //
- // Crystal has been registered with OWM on the Open Source Plan, which lifts usage limits for free, so
- // that everyone benefits. However, these lifted limits only apply to the Current Weather API, and *not*
- // the One Call API. Usage of this key for the One Call API risks blocking the key for everyone.
- //
- // If you intend to use this key in your own app, especially for the One Call API, please create your own
- // OWM account, and own key. You should be able to apply for the Open Source Plan to benefit from the same
- // lifted limits as Crystal. Thank you.
- "appid" => ((owmKeyOverride != null) && (owmKeyOverride.length() == 0)) ? "2651f49cb20de925fc57590709b86ce6" : owmKeyOverride,
-
- "units" => "metric" // Celcius.
- },
- method(:onReceiveOpenWeatherMapCurrent)
- );
- }
- } /* else {
- Sys.println("onTemporalEvent() called with no pending web requests!");
- } */
- }
+ _pendingWebRequests = Storage.getValue("PendingWebRequests");
- // Sample time zone data:
- /*
- {
- "requestCity":"london",
- "city":"London",
- "current":{
- "gmtOffset":3600,
- "dst":true
- },
- "next":{
- "when":1540688400,
- "gmtOffset":0,
- "dst":false
- }
- }
- */
+ //DEBUG*/ logMessage("onTemporalEvent:_pendingWebRequests is '" + _pendingWebRequests + "'");
+ //DEBUG*/ var keys = _bg_data.keys(); logMessage("onTemporalEvent:_bg_data has '" + keys);
+ //DEBUG*/ if (_token != null) { logMessage("onTemporalEvent:Using token '" + _token.substring(0,20) + "...'"); } else { logMessage("onTemporalEvent:No token");}
- // Sample error when city is not found:
- /*
- {
- "requestCity":"atlantis",
- "error":{
- "code":2, // CITY_NOT_FOUND
- "message":"City \"atlantis\" not found."
- }
- }
- */
- (:background_method)
- function onReceiveCityLocalTime(responseCode, data) {
-
- // HTTP failure: return responseCode.
- // Otherwise, return data response.
- if (responseCode != 200) {
- data = {
- "httpError" => responseCode
- };
- }
+ if (_pendingWebRequests != null) {
+ if (_pendingWebRequests["OpenWeatherMapCurrent"] != null) {
+ var owmKeyOverride = $.getStringProperty("OWMKeyOverride","");
+ var lat = $.getStringProperty("LastLocationLat","");
+ var lon = $.getStringProperty("LastLocationLng","");
+ //DEBUG*/ logMessage("onTemporalEvent:OWM with overide=" + owmKeyOverride + " lat=" + lat + " lon=" + lon);
- Bg.exit({
- "CityLocalTime" => data
- });
- }
+ if (lat.length() > 0 && lon.length() > 0) {
+ makeWebRequest(
+ "https://api.openweathermap.org/data/2.5/weather",
+// "https://api.openweathermap.org/data/3.0/onecall",
+ {
+ "lat" => lat,
+ "lon" => lon,
- // Sample invalid API key:
- /*
- {
- "cod":401,
- "message": "Invalid API key. Please see http://openweathermap.org/faq#error401 for more info."
+ // Polite request from Vince, developer of the Crystal Watch Face:
+ //
+ // Please do not abuse this API key, or else I will be forced to make thousands of users of Crystal
+ // sign up for their own Open Weather Map free account, and enter their key in settings - a much worse
+ // user experience for everyone.
+ //
+ // Crystal has been registered with OWM on the Open Source Plan, which lifts usage limits for free, so
+ // that everyone benefits. However, these lifted limits only apply to the Current Weather API, and *not*
+ // the One Call API. Usage of this key for the One Call API risks blocking the key for everyone.
+ //
+ // If you intend to use this key in your own app, especially for the One Call API, please create your own
+ // OWM account, and own key. You should be able to apply for the Open Source Plan to benefit from the same
+ // lifted limits as Crystal. Thank you.
+ "appid" => ((owmKeyOverride == null) || (owmKeyOverride.length() == 0)) ? "2651f49cb20de925fc57590709b86ce6" : owmKeyOverride,
+
+ "units" => "metric" // Celcius.
+ },
+ method(:onReceiveOpenWeatherMapCurrent)
+ );
+ }
+//****************************************************************
+//******** REMVOVED THIS SECTION IF TESLA CODE NOT WANTED ********
+//****************************************************************
+ else {
+ doTesla();
+ }
+ }
+ else {
+ doTesla();
+ }
+//****************************************************************
+//******************** END OF REMVOVED SECTION *******************
+//****************************************************************
+ }
+ else {
+ //DEBUG*/ logMessage("onTemporalEvent() called with no pending web requests!");
+ }
}
- */
- // Sample current weather:
- /*
+ (:background)
+ function onReceiveOpenWeatherMapCurrent(responseCode, data)
{
- "coord":{
- "lon":-0.46,
- "lat":51.75
- },
- "weather":[
- {
- "id":521,
- "main":"Rain",
- "description":"shower rain",
- "icon":"09d"
- }
- ],
- "base":"stations",
- "main":{
- "temp":281.82,
- "pressure":1018,
- "humidity":70,
- "temp_min":280.15,
- "temp_max":283.15
- },
- "visibility":10000,
- "wind":{
- "speed":6.2,
- "deg":10
- },
- "clouds":{
- "all":0
- },
- "dt":1540741800,
- "sys":{
- "type":1,
- "id":5078,
- "message":0.0036,
- "country":"GB",
- "sunrise":1540709390,
- "sunset":1540744829
- },
- "id":2647138,
- "name":"Hemel Hempstead",
- "cod":200
- }
- */
- (:background_method)
- function onReceiveOpenWeatherMapCurrent(responseCode, data) {
var result;
-
+
+ //DEBUG*/ logMessage("onReceiveOpenWeatherMapCurrent responseCode: " + responseCode);
+ //DEBUG*/ logMessage("onReceiveOpenWeatherMapCurrent data: " + data);
+
// Useful data only available if result was successful.
// Filter and flatten data response for data that we actually need.
// Reduces runtime memory spike in main app.
@@ -175,30 +149,355 @@ class BackgroundService extends Sys.ServiceDelegate {
"dt" => data["dt"],
"temp" => data["main"]["temp"],
"humidity" => data["main"]["humidity"],
- "icon" => data["weather"][0]["icon"]
+ "icon" => data["weather"][0]["icon"],
+ "name" => data["name"]
};
// HTTP error: do not save.
- } else {
- result = {
- "httpError" => responseCode
- };
}
+ else {
+ result = Storage.getValue("OpenWeatherMapCurrent");
+ if (result) {
+ result["cod"] = responseCode;
+ } else {
+ result = {
+ "httpError" => responseCode
+ };
+ }
+ }
+
+ _bg_data.put("OpenWeatherMapCurrent", result);
- Bg.exit({
- "OpenWeatherMapCurrent" => result
- });
+ //DEBUG*/ logMessage("onReceiveOpenWeatherMapCurrent: result=" + result);
+//****************************************************************
+//******** REMVOVED THIS SECTION IF TESLA CODE NOT WANTED ********
+//****************************************************************
+ doTesla(); // Call back so we get the next steps done right now
+//****************************************************************
+//******** DO THIS INSTEAD ********
+//****************************************************************
+ // try {
+ // //DEBUG*/ logMessage("onReceiveVehicles: Exiting with " + _bg_data);
+ // Bg.exit(_bg_data);
+ // }
+ // catch (e) {
+ // //DEBUG*/ logMessage("onReceiveVehicles exit assertion " + e);
+ // }
+
+ }
+
+//****************************************************************
+//******** REMVOVED THIS SECTION IF TESLA CODE NOT WANTED ********
+//****************************************************************
+ (:background)
+ function doTesla()
+ {
+ if (_pendingWebRequests["TeslaInfo"] != null && Storage.getValue("Tesla") != null && gTeslaComplication != true) {
+ if (_token == null) {
+ //DEBUG*/ logMessage("doTesla:Generating Access Token");
+ var refreshToken = $.getStringProperty("TeslaRefreshToken","");
+ if (refreshToken != null && refreshToken.length() > 0) {
+ //DEBUG*/ logMessage("doTesla:Get new Access token with Refresh token at '" + refreshToken.substring(0, 20) + "'...");
+ makeTeslaWebPost(refreshToken, method(:onReceiveToken));
+ return;
+ } else {
+ //DEBUG*/ logMessage("doTesla:No refresh token!");
+ _bg_data.put("TeslaInfo", { "httpErrorTesla" => 401, "httpInternalErrorTesla" => 401 } );
+ //DEBUG*/ _bg_data.put({ "TeslaInfo" => { "httpErrorTesla" => 200, "httpInternalErrorTesla" => 200, "BatteryLevel" => 70, "ChargingState" => "Charging", "InsideTemp" => 21, "PrecondEnabled" => false, "SentryEnabled" => false, "VehicleID" => "12345678" , "VehicleState" => "online"} });
+ }
+ }
+ else if (_vehicle_id == null) {
+ //DEBUG*/ logMessage("doTesla:Getting vehicles");
+ makeTeslaWebRequest("https://" + $.getStringProperty("TeslaServerAPILocation","") + "/api/1/products?orders=true", Comms.HTTP_RESPONSE_CONTENT_TYPE_JSON, method(:onReceiveVehicles));
+ return;
+ }
+ else {
+ //DEBUG*/ logMessage("doTesla: Getting vehicle data");
+ makeTeslaWebRequest("https://" + $.getStringProperty("TeslaServerAPILocation","") + "/api/1/vehicles/" + _vehicle_id + "/vehicle_data", Comms.HTTP_RESPONSE_CONTENT_TYPE_TEXT_PLAIN, method(:onReceiveVehicleData));
+ return;
+ }
+ }
+ else {
+ //DEBUG*/ logMessage("doTesla:Not doing Tesla because _pendingWebRequests[\"TeslaInfo\"] is null (it's " + _pendingWebRequests["TeslaInfo"] + ") Storage.getValue(\"Tesla\") is null (it's " + Storage.getValue("Tesla") + ") or gTeslaComplication is true (it's " + gTeslaComplication + ")");
+ }
+
+ try {
+ //DEBUG*/ logMessage("doTesla: Exiting with " + _bg_data);
+ Bg.exit(_bg_data);
+ }
+ catch (e) {
+ //DEBUG*/ logMessage("doTesla exit assertion " + e);
+ }
}
+//****************************************************************
+//******************** END OF REMVOVED SECTION *******************
+//****************************************************************
+
+ (:background)
+ function onReceiveToken(responseCode, responseData) {
+ //DEBUG*/ logMessage("onReceiveToken: " + responseCode);
+
+ if (_bg_data == null) {
+ _bg_data = Bg.getBackgroundData();
+ if (_bg_data == null) {
+ _bg_data = {};
+ }
+ }
+ else {
+ //DEBUG*/ var keys = _bg_data.keys(); logMessage("onReceiveToken: _bg_data has keys " + keys);
+ }
+
+ var teslaInfo = _bg_data.get("TeslaInfo");
+ if (teslaInfo == null) {
+ teslaInfo = {};
+ }
+
+ if (responseCode == 200) {
+ _token = responseData["access_token"];
+ //DEBUG*/ logMessage("onReceiveToken:Has token '" + _token.substring(0,20) + "...', calling back doTesla");
+ teslaInfo.put("AccessToken", _token);
+ teslaInfo.put("RefreshToken", responseData["refresh_token"]);
+ teslaInfo.put("TokenExpiresIn", responseData["expires_in"]);
+ teslaInfo.put("TokenCreatedAt", Time.now().value());
+
+ _bg_data.put("TeslaInfo", teslaInfo);
+ doTesla();
+ }
+ else {
+ _bg_data.put("TeslaInfo", { "httpErrorTesla" => 401, "httpInternalErrorTesla" => responseCode } );
+ try {
+ //DEBUG*/ logMessage("onReceiveVehicles: Exiting with " + _bg_data);
+ Bg.exit(_bg_data);
+ }
+ catch (e) {
+ //DEBUG*/ logMessage("onReceiveVehicles exit assertion " + e);
+ }
+ }
+ }
+
+ (:background)
+ function onReceiveVehicles(responseCode, responseData) {
+ //DEBUG*/ logMessage("onReceiveVehicles: " + responseCode);
+
+ if (_bg_data == null) {
+ _bg_data = Bg.getBackgroundData();
+ if (_bg_data == null) {
+ _bg_data = {};
+ }
+ }
+ else {
+ //DEBUG*/ var keys = _bg_data.keys(); logMessage("onReceiveVehicles: _bg_data has keys " + keys);
+ }
+
+ var teslaInfo = _bg_data.get("TeslaInfo");
+ if (teslaInfo == null) {
+ teslaInfo = {};
+ }
+
+ if (responseCode == 200) {
+ var vehicles = responseData.get("response");
+ var vehice_state;
+ if (vehicles != null) {
+ var storVehicleIndex = Storage.getValue("TeslaVehicleIndex");
+ if (storVehicleIndex == null || storVehicleIndex < 1) {
+ storVehicleIndex = 0; // Base 0 so 0, not 1
+ }
+ else {
+ storVehicleIndex--; // Array are zero based but we want user to start numbering from 1 for ease of use
+ }
+ if (vehicles.size() > 0) {
+ if (vehicles.size() > storVehicleIndex) {
+ _vehicle_id = vehicles[storVehicleIndex].get("id").toString();
+ vehice_state = vehicles[storVehicleIndex].get("state");
+ }
+ else {
+ _vehicle_id = null;
+ vehice_state = "VehicleNotFound";
+ }
+ }
+ else {
+ _vehicle_id = null;
+ vehice_state = "NoVehicles";
+ }
+ }
+ else {
+ _vehicle_id = null;
+ vehice_state = "NoVehicleResponse";
+ }
+ teslaInfo.put("VehicleID", _vehicle_id);
+ teslaInfo.put("VehicleState",vehice_state);
+
+ _bg_data.put("TeslaInfo", teslaInfo);
+
+ //DEBUG*/ logMessage("onReceiveVehicles:vehice_state=" + vehice_state);
+
+ if (_vehicle_id != null) {
+ doTesla();
+ return;
+ }
+ }
+
+ _bg_data.put("TeslaInfo", { "httpErrorTesla" => (_vehicle_id == null ? 404 : 408), "httpInternalErrorTesla" => responseCode } );
+
+ try {
+ //DEBUG*/ logMessage("onReceiveVehicles: Exiting with " + _bg_data);
+ Bg.exit(_bg_data);
+ }
+ catch (e) {
+ //DEBUG*/ logMessage("onReceiveVehicles exit assertion " + e);
+ }
+ }
+
+ (:background)
+ function onReceiveVehicleData(responseCode, responseData) {
+ //DEBUG*/ logMessage("onReceiveVehicleData: " + responseCode);
+ //DEBUG*/ var myStats = Sys.getSystemStats(); logMessage("Total memory: " + myStats.totalMemory + " Used memory: " + myStats.usedMemory + " Free memory: " + myStats.freeMemory);
- (:background_method)
+ if (_bg_data == null) {
+ _bg_data = Bg.getBackgroundData();
+ if (_bg_data == null) {
+ _bg_data = {};
+ }
+ else {
+ //DEBUG*/ var keys = _bg_data.keys(); logMessage("onReceiveVehicleData: _bg_data has keys " + keys);
+ }
+ }
+
+ var teslaInfo = _bg_data.get("TeslaInfo");
+ if (teslaInfo == null) {
+ teslaInfo = {};
+ }
+
+ teslaInfo.put("httpErrorTesla", responseCode);
+
+ if (responseCode == 200) {
+ teslaInfo.put("httpInternalErrorTesla", 200);
+ teslaInfo.put("VehicleState", "online");
+
+ if (responseData instanceof Lang.Dictionary) {
+ teslaInfo.put("BatteryLevel", $.validateNumber(responseData.get("response").get("charge_state").get("battery_level"), 0));
+ teslaInfo.put("ChargingState", $.validateString(responseData.get("response").get("charge_state").get("charging_state"), ""));
+ teslaInfo.put("PrecondEnabled", $.validateBoolean(responseData.get("response").get("charge_state").get("preconditioning_enabled"), false));
+ teslaInfo.put("InsideTemp", $.validateNumber(responseData.get("response").get("climate_state").get("inside_temp"), 0));
+ teslaInfo.put("SentryEnabled", $.validateBoolean(responseData.get("response").get("vehicle_state").get("sentry_mode"), false));
+ }
+ else if (responseData instanceof Lang.String) {
+ var pos = responseData.find("battery_level");
+ var str = responseData.substring(pos + 15, pos + 20);
+ var posEnd = str.find(",");
+ teslaInfo.put("BatteryLevel", $.validateNumber(str.substring(0, posEnd), 0));
+
+ pos = responseData.find("charging_state");
+ str = responseData.substring(pos + 17, pos + 37);
+ posEnd = str.find("\"");
+ teslaInfo.put("ChargingState", $.validateString(str.substring(0, posEnd), ""));
+
+ pos = responseData.find("inside_temp");
+ str = responseData.substring(pos + 13, pos + 20);
+ posEnd = str.find(",");
+ teslaInfo.put("InsideTemp", $.validateNumber(str.substring(0, posEnd), 0));
+
+ pos = responseData.find("sentry_mode");
+ str = responseData.substring(pos + 13, pos + 20);
+ posEnd = str.find(",");
+ teslaInfo.put("SentryEnabled", $.validateString(str.substring(0, posEnd), "").equals("true"));
+
+ pos = responseData.find("preconditioning_enabled");
+ str = responseData.substring(pos + 25, pos + 32);
+ posEnd = str.find(",");
+ teslaInfo.put("PrecondEnabled", $.validateString(str.substring(0, posEnd), "").equals("true"));
+ }
+ _bg_data.put("TeslaInfo", teslaInfo);
+ }
+ // If no vehicle (rare) or can't contact (much more frequent) is received, try to get a new vehicle (404) or retrieve its state (408)
+ else if (responseCode == 404 || responseCode == 408) {
+ // If Tesla can't find our vehicle by its ID, reset it and maybe we'll have better luck next time
+ if (responseCode == 404) {
+ _vehicle_id = null;
+ _bg_data.put("TeslaInfo", { "httpErrorTesla" => 404, "httpInternalErrorTesla" => responseCode, "VehicleID" => null } );
+ }
+ //DEBUG*/ logMessage("Requesting vehicles from onReceiveVehicleData with _stop at " + _stop);
+ if (_stop == false) { // We we're true, we already came back here for the next lines so don't get into an infinite loop
+ _stop = true; // Don't get vehicle_data anymore if we fail again
+ makeTeslaWebRequest("https://" + $.getStringProperty("TeslaServerAPILocation","") + "/api/1/products?orders=true", Comms.HTTP_RESPONSE_CONTENT_TYPE_JSON, method(:onReceiveVehicles));
+ return;
+ }
+ }
+ // Our access token has expired, ask for a new one
+ else if (responseCode == 401) {
+ var refreshToken = $.getStringProperty("TeslaRefreshToken","");
+ if (refreshToken != null) {
+ //DEBUG*/ logMessage("Requesting access token from onReceiveVehicleData with _stop at " + _stop);
+ if (_stop == false) { // We we're true, we already came back here for the next lines so don't get into an infinite loop
+ _stop = true; // Don't get vehicle_data anymore if we fail again
+ makeTeslaWebPost(refreshToken, method(:onReceiveToken));
+ return;
+ }
+ else {
+ _bg_data.put("TeslaInfo", { "httpErrorTesla" => 401, "httpInternalErrorTesla" => responseCode } );
+ }
+ }
+ }
+ else {
+ _bg_data.put("TeslaInfo", { "httpErrorTesla" => responseCode, "httpInternalErrorTesla" => responseCode } );
+ }
+
+ _bg_data.put("TeslaInfo", teslaInfo);
+
+ try {
+ //DEBUG*/ logMessage("onReceiveVehicleData: Exiting with " + _bg_data);
+ Bg.exit(_bg_data);
+ }
+ catch (e) {
+ //DEBUG*/ logMessage("onReceiveVehicleData exit assertion " + e);
+ }
+ }
+
+ (:background)
+ function makeTeslaWebPost(token, notify) {
+ var url = "https://" + $.getStringProperty("TeslaServerAUTHLocation","") + "/oauth2/v3/token";
+ Comms.makeWebRequest(
+ url,
+ {
+ "grant_type" => "refresh_token",
+ "client_id" => "ownerapi",
+ "refresh_token" => token,
+ "scope" => "openid email offline_access"
+ },
+ {
+ :method => Comms.HTTP_REQUEST_METHOD_POST,
+ :responseType => Comms.HTTP_RESPONSE_CONTENT_TYPE_JSON
+ },
+ notify
+ );
+ }
+
+ (:background)
+ function makeTeslaWebRequest(url, method, callback) {
+ var options = {
+ :method => Comms.HTTP_REQUEST_METHOD_GET,
+ :headers => {
+ "Authorization" => "Bearer " + _token,
+ "User-Agent" => "Crystal-Tesla for Garmin",
+ },
+ :responseType => method
+ };
+ //DEBUG*/ logMessage("makeWebRequest url: '" + url + "'");
+ //DEBUG*/ logMessage("makeWebRequest options: '" + options + "'");
+ Comms.makeWebRequest(url, null, options, callback);
+ }
+//****************************************************************
+//******************** END OF REMVOVED SECTION *******************
+//****************************************************************
+
+ (:background)
function makeWebRequest(url, params, callback) {
var options = {
:method => Comms.HTTP_REQUEST_METHOD_GET,
:headers => {
- "Content-Type" => Communications.REQUEST_CONTENT_TYPE_URL_ENCODED},
+ "Content-Type" => Comms.REQUEST_CONTENT_TYPE_URL_ENCODED},
:responseType => Comms.HTTP_RESPONSE_CONTENT_TYPE_JSON
};
-
Comms.makeWebRequest(url, params, options, callback);
}
}
diff --git a/source/CrystalApp.mc b/source/CrystalApp.mc
index 20d3a0a4..783e7beb 100644
--- a/source/CrystalApp.mc
+++ b/source/CrystalApp.mc
@@ -3,6 +3,14 @@ using Toybox.Background as Bg;
using Toybox.System as Sys;
using Toybox.WatchUi as Ui;
using Toybox.Time;
+using Toybox.Time.Gregorian;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
+using Toybox.Complications;
+
+import Toybox.Application;
+import Toybox.Lang;
+import Toybox.WatchUi;
// In-memory current location.
// Previously persisted in App.Storage, but now persisted in Object Store due to #86 workaround for App.Storage firmware bug.
@@ -12,251 +20,185 @@ using Toybox.Time;
var gLocationLat = null;
var gLocationLng = null;
+var gTeslaComplication = false;
+
(:background)
class CrystalApp extends App.AppBase {
-
var mView;
- var mFieldTypes = new [3];
function initialize() {
AppBase.initialize();
- }
- /*
- // onStart() is called on application start up
- function onStart(state) {
+ gTeslaComplication = $.getBoolProperty("TeslaLink", false);
}
- // onStop() is called when your application is exiting
- function onStop(state) {
- }
- */
+ // function onStart(state) {
+ // //DEBUG*/ logMessage("App starting");
+ // }
+
+ // function onStop(state) {
+ // //DEBUG*/ logMessage("App stopping");
+ // }
// Return the initial view of your application here
function getInitialView() {
- mView = new CrystalView();
- onSettingsChanged(); // After creating view.
- return [mView];
+ //DEBUG*/ logMessage("Getting initial view");
+
+ if (WatchUi has :WatchFaceDelegate) {
+ mView = new CrystalView();
+ onSettingsChanged(); // After creating view.
+ var delegate = new CrystalDelegate(mView);
+ return [mView, delegate] as Array;
+ }
+ else {
+ mView = new CrystalView();
+ onSettingsChanged(); // After creating view.
+ return [mView];
+ }
}
function getView() {
return mView;
}
- function getIntProperty(key, defaultValue) {
- var value = getProperty(key);
- if (value == null) {
- value = defaultValue;
- } else if (!(value instanceof Number)) {
- value = value.toNumber();
- }
- return value;
+ // New app settings have been received so trigger a UI update
+ (:background)
+ function getServiceDelegate() {
+ //DEBUG*/ logMessage("Getting service delegate");
+ return [new BackgroundService()];
}
- // New app settings have been received so trigger a UI update
function onSettingsChanged() {
- mFieldTypes[0] = getIntProperty("Field1Type", 0);
- mFieldTypes[1] = getIntProperty("Field2Type", 1);
- mFieldTypes[2] = getIntProperty("Field3Type", 2);
+ // This code check if the user selected a different vehicle index in its property. If so, we'll need to get a new vehicleID
+ var propVehicleIndex;
+ var storVehicleIndex;
+
+ propVehicleIndex = $.getIntProperty("TeslaVehicleIndex", 1);
+
+ storVehicleIndex = Storage.getValue("TeslaVehicleIndex");
+ if (storVehicleIndex == null || propVehicleIndex != storVehicleIndex) {
+ storVehicleIndex = propVehicleIndex;
+ try {
+ Storage.setValue("TeslaVehicleIndex", storVehicleIndex);
+ Storage.setValue("TeslaVehicleID", null);
+ }
+ catch (e) {
+ }
+ }
mView.onSettingsChanged(); // Calls checkPendingWebRequests().
Ui.requestUpdate();
}
- function hasField(fieldType) {
- return ((mFieldTypes[0] == fieldType) ||
- (mFieldTypes[1] == fieldType) ||
- (mFieldTypes[2] == fieldType));
- }
-
- // Determine if any web requests are needed.
- // If so, set approrpiate pendingWebRequests flag for use by BackgroundService, then register for
- // temporal event.
- // Currently called on layout initialisation, when settings change, and on exiting sleep.
- (:background_method)
- function checkPendingWebRequests() {
-
- // Attempt to update current location, to be used by Sunrise/Sunset, and Weather.
- // If current location available from current activity, save it in case it goes "stale" and can not longer be retrieved.
- var location = Activity.getActivityInfo().currentLocation;
- if (location) {
- // Sys.println("Saving location");
- location = location.toDegrees(); // Array of Doubles.
- gLocationLat = location[0].toFloat();
- gLocationLng = location[1].toFloat();
-
- setProperty("LastLocationLat", gLocationLat);
- setProperty("LastLocationLng", gLocationLng);
-
- // If current location is not available, read stored value from Object Store, being careful not to overwrite a valid
- // in-memory value with an invalid stored one.
- } else {
- var lat = getProperty("LastLocationLat");
- if (lat != null) {
- gLocationLat = lat;
- }
-
- var lng = getProperty("LastLocationLng");
- if (lng != null) {
- gLocationLng = lng;
- }
- }
- // Sys.println(gLocationLat + ", " + gLocationLng);
-
- if (!(Sys has :ServiceDelegate)) {
- return;
- }
- var pendingWebRequests = getProperty("PendingWebRequests");
+ (:background)
+ function onBackgroundData(data) {
+ //DEBUG*/ logMessage("onBackgroundData:received '" + data + "'");
+ var pendingWebRequests = Storage.getValue("PendingWebRequests");
if (pendingWebRequests == null) {
pendingWebRequests = {};
}
- // 1. City local time:
- // City has been specified.
- var city = getProperty("LocalTimeInCity");
-
- // #78 Setting with value of empty string may cause corresponding property to be null.
- if ((city != null) && (city.length() > 0)) {
-
- var cityLocalTime = getProperty("CityLocalTime");
-
- // No existing data.
- if ((cityLocalTime == null) ||
-
- // Existing data is old.
- ((cityLocalTime["next"] != null) && (Time.now().value() >= cityLocalTime["next"]["when"]))) {
-
- pendingWebRequests["CityLocalTime"] = true;
-
- // Existing data not for this city: delete it.
- // Error response from server: contains requestCity. Likely due to unrecognised city. Prevent requesting this
- // city again.
- } else if (!cityLocalTime["requestCity"].equals(city)) {
-
- deleteProperty("CityLocalTime");
- pendingWebRequests["CityLocalTime"] = true;
- }
+ if (data == null) {
+ //DEBUG*/ logMessage("onBackgroundData:data is null");
+ return;
}
- // 2. Weather:
- // Location must be available, weather or humidity (#113) data field must be shown.
- if ((gLocationLat != null) &&
- (hasField(FIELD_TYPE_WEATHER) || hasField(FIELD_TYPE_HUMIDITY))) {
-
- var owmCurrent = getProperty("OpenWeatherMapCurrent");
-
- // No existing data.
- if (owmCurrent == null) {
-
- pendingWebRequests["OpenWeatherMapCurrent"] = true;
-
- // Successfully received weather data.
- } else if (owmCurrent["cod"] == 200) {
-
- // Existing data is older than 30 mins.
- // TODO: Consider requesting weather at sunrise/sunset to update weather icon.
- if ((Time.now().value() > (owmCurrent["dt"] + 1800)) ||
-
- // Existing data not for this location.
- // Not a great test, as a degree of longitude varies betwee 69 (equator) and 0 (pole) miles, but simpler than
- // true distance calculation. 0.02 degree of latitude is just over a mile.
- (((gLocationLat - owmCurrent["lat"]).abs() > 0.02) || ((gLocationLng - owmCurrent["lon"]).abs() > 0.02))) {
-
- pendingWebRequests["OpenWeatherMapCurrent"] = true;
- }
- }
+ if (data.isEmpty()) {
+ //DEBUG*/ logMessage("onBackgroundData:Empty data");
+ return;
}
- // If there are any pending requests:
- if (pendingWebRequests.keys().size() > 0) {
-
- // Register for background temporal event as soon as possible.
- var lastTime = Bg.getLastTemporalEventTime();
- if (lastTime) {
- // Events scheduled for a time in the past trigger immediately.
- var nextTime = lastTime.add(new Time.Duration(5 * 60));
- Bg.registerForTemporalEvent(nextTime);
- } else {
- Bg.registerForTemporalEvent(Time.now());
+ for (var keyIndex = 0; keyIndex < data.size(); keyIndex++) {
+ var type = data.keys()[keyIndex]; // Type of received data.
+ var storedData = Storage.getValue(type);
+ if (storedData == null) {
+ storedData = {};
}
- }
-
- setProperty("PendingWebRequests", pendingWebRequests);
- }
+ var receivedData = data[type]; // The actual data received: strip away type key.
+
+ // Do process the data if what we got was an error
+ if (receivedData["httpError"] == null) {
+ // New data received: clear pendingWebRequests flag and overwrite stored data that with what we received, leaving others intact.
+ // storedData = receivedData;
+ var keys = receivedData.keys();
+ var values = receivedData.values();
+ for (var i = 0; i < keys.size(); i++) {
+ storedData.put(keys[i], values[i]);
+ }
- (:background_method)
- function getServiceDelegate() {
- return [new BackgroundService()];
- }
+ storedData.put("NewData", true);
+ Storage.setValue(type, storedData);
- // Handle data received from BackgroundService.
- // On success, clear appropriate pendingWebRequests flag.
- // data is Dictionary with single key that indicates the data type received. This corresponds with Object Store and
- // pendingWebRequests keys.
- (:background_method)
- function onBackgroundData(data) {
- var pendingWebRequests = getProperty("PendingWebRequests");
- if (pendingWebRequests == null) {
- //Sys.println("onBackgroundData() called with no pending web requests!");
- pendingWebRequests = {};
- }
+ pendingWebRequests.remove(type);
+ }
- var type = data.keys()[0]; // Type of received data.
- var storedData = getProperty(type);
- var receivedData = data[type]; // The actual data received: strip away type key.
-
- // No value in showing any HTTP error to the user, so no need to modify stored data.
- // Leave pendingWebRequests flag set, and simply return early.
- if (receivedData["httpError"]) {
- return;
+ // No benifit of doing this now as it adds code to the background process that can be done in the main view instead
+ // checkPendingWebRequests(); // We just got new data, process them right away before displaying
}
- // New data received: clear pendingWebRequests flag and overwrite stored data.
- storedData = receivedData;
- pendingWebRequests.remove(type);
- setProperty("PendingWebRequests", pendingWebRequests);
- setProperty(type, storedData);
+ Storage.setValue("PendingWebRequests", pendingWebRequests);
+ //DEBUG*/ logMessage("onBackgroundData:Flag that requests are pending");
+ Storage.setValue("RequestsPending", true);
Ui.requestUpdate();
}
-
- // Return a formatted time dictionary that respects is24Hour and HideHoursLeadingZero settings.
- // - hour: 0-23.
- // - min: 0-59.
- function getFormattedTime(hour, min) {
- var amPm = "";
-
- if (!Sys.getDeviceSettings().is24Hour) {
-
- // #6 Ensure noon is shown as PM.
- var isPm = (hour >= 12);
- if (isPm) {
-
- // But ensure noon is shown as 12, not 00.
- if (hour > 12) {
- hour = hour - 12;
- }
- amPm = "p";
- } else {
-
- // #27 Ensure midnight is shown as 12, not 00.
- if (hour == 0) {
- hour = 12;
- }
- amPm = "a";
- }
- }
-
- // #10 If in 12-hour mode with Hide Hours Leading Zero set, hide leading zero. Otherwise, show leading zero.
- // #69 Setting now applies to both 12- and 24-hour modes.
- hour = hour.format(getProperty("HideHoursLeadingZero") ? INTEGER_FORMAT : "%02d");
-
- return {
- :hour => hour,
- :min => min.format("%02d"),
- :amPm => amPm
- };
- }
+ // Handle data received from BackgroundService.
+ // data is Dictionary with single key that indicates the data type received.
+ // (:background)
+ // function onBackgroundData(data) {
+ // var teslaInfo = Storage.getValue("TeslaInfo"); // What we have in Storage
+ // if (teslaInfo == null) {
+ // teslaInfo = {};
+ // }
+
+ // // Update in TeslaInfo what has been received in receivedData
+ // var receivedData = data["TeslaInfo"]; // What we just received
+ // if (receivedData != null && receivedData instanceof Lang.Dictionary) {
+ // var keys = receivedData.keys();
+ // var values = receivedData.values();
+ // for (var i = 0; i < keys.size(); i++) {
+ // teslaInfo.put(keys[i], values[i]);
+ // }
+ // }
+ // else {
+ // //DEBUG*/ logMessage("Unexpected invalid receivedData: " + receivedData);
+ // }
+
+ // // Copy into their own name some of the entries in TeslaInfo, then delete from TeslaInfo
+ // var arrayKey = ["RefreshToken", "AccessToken", "TokenCreatedAt", "TokenExpiresIn", "VehicleID"];
+ // var arrayProp = [true, true, false, false, false ];
+ // for (var i = 0; i < arrayKey.size(); i++) {
+ // var value = teslaInfo.get(arrayKey[i]);
+ // if (value != null) {
+ // if (arrayProp[i]) {
+ // Properties.setValue("Tesla" + arrayKey[i], value);
+ // }
+ // else {
+ // Storage.setValue("Tesla" + arrayKey[i], value);
+ // }
+ // teslaInfo.remove(arrayKey[i]);
+ // }
+ // }
+
+ // // Now store our updated copy of TeslaInfo
+ // Storage.setValue("TeslaInfo", teslaInfo);
+
+ // // We deal with specific errors here, leaving the good stuff to the battery indicator
+ // var responseCode = teslaInfo["httpErrorTesla"];
+ // var internalResponseCode = teslaInfo["httpInternalErrorTesla"];
+ // if (responseCode != null && internalResponseCode != null) {
+ // if (responseCode == 401 && internalResponseCode != 200) { // Our token has expired and we were unable to get one, refresh it
+ // Properties.setValue("TeslaAccessToken", null); // Try to get a new vehicleID
+ // } else if (responseCode == 404 && internalResponseCode != 200) { // We got a vehicle not found error and we were unable to get one, reset our vehicle ID
+ // Storage.deleteValue("VehicleID"); // Try to get a new vehicleID
+ // }
+ // }
+
+ // //DEBUG*/ var nextTime = Time.now().add(new Time.Duration(5 * 60)); var local = Gregorian.info(nextTime, Time.FORMAT_SHORT); var time = $.getFormattedTime(local.hour, local.min, local.sec); logMessage("Next event: " + time[:hour] + ":" + time[:min] + ":" + time[:sec] + time[:amPm]);
+ // Bg.registerForTemporalEvent(new Time.Duration(5 * 60)); // Since onSettingsChanged go for a specific time, go for duration here once we get going, otherwise we'll get background data only once the view is shown
+
+ // Ui.requestUpdate();
+ // }
}
diff --git a/source/CrystalView.mc b/source/CrystalView.mc
index bcae44d1..1d63ee59 100644
--- a/source/CrystalView.mc
+++ b/source/CrystalView.mc
@@ -1,13 +1,27 @@
using Toybox.WatchUi as Ui;
+using Toybox.Background as Bg;
using Toybox.Graphics as Graphics;
using Toybox.System as Sys;
using Toybox.Application as App;
using Toybox.ActivityMonitor as ActivityMonitor;
+using Toybox.Communications as Comms;
+using Toybox.Time;
+using Toybox.Time.Gregorian;
+using Toybox.Weather;
+using Toybox.Position;
+using Toybox.SensorHistory as SensorHistory;
+using Toybox.Complications as Complications;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
+using Toybox.Complications;
using Toybox.Math;
const INTEGER_FORMAT = "%d";
+import Toybox.Lang;
+import Toybox.WatchUi;
+
var gThemeColour;
var gMonoLightColour;
var gMonoDarkColour;
@@ -19,74 +33,41 @@ var gMinutesColour;
var gNormalFont;
var gIconsFont;
+var gStressLevel;
+//DEBUG*/ var gStressLevelLogText;
+
const SCREEN_MULTIPLIER = (Sys.getDeviceSettings().screenWidth < 360) ? 1 : 2;
//const BATTERY_LINE_WIDTH = 2;
const BATTERY_HEAD_HEIGHT = 4 * SCREEN_MULTIPLIER;
const BATTERY_MARGIN = SCREEN_MULTIPLIER;
+var mGarminToOWM = [ 1, 2, 3, 10, 13, 4, 11, 13, 50, 50, 10, 9, 11, 1, 9, 10, 13, 13, 13, 13, 4, 13, 3, 2, 9, 10, 10, 9, 11, 50, 4, 9, 11, 4, 13, 4, 4, 4, 4, 50, 2, 11, 11, 13, 13, 9, 13, 13, 13, 13, 13, 13, 2, 1 ];
+
//const BATTERY_LEVEL_LOW = 20;
//const BATTERY_LEVEL_CRITICAL = 10;
-// x, y are co-ordinates of centre point.
-// width and height are outer dimensions of battery "body".
-function drawBatteryMeter(dc, x, y, width, height) {
- dc.setColor(gThemeColour, Graphics.COLOR_TRANSPARENT);
- dc.setPenWidth(/* BATTERY_LINE_WIDTH */ 2);
-
- // Body.
- // drawRoundedRectangle's x and y are top-left corner of middle of stroke.
- // Bottom-right corner of middle of stroke will be (x + width - 1, y + height - 1).
- dc.drawRoundedRectangle(
- x - (width / 2) + /* (BATTERY_LINE_WIDTH / 2) */ 1,
- y - (height / 2) + /* (BATTERY_LINE_WIDTH / 2) */ 1,
- width - /* BATTERY_LINE_WIDTH + 1 */ 1,
- height - /* BATTERY_LINE_WIDTH + 1 */ 1,
- /* BATTERY_CORNER_RADIUS */ 2 * SCREEN_MULTIPLIER);
-
- // Head.
- // fillRectangle() works as expected.
- dc.fillRectangle(
- x + (width / 2) + BATTERY_MARGIN,
- y - (BATTERY_HEAD_HEIGHT / 2),
- /* BATTERY_HEAD_WIDTH */ 2,
- BATTERY_HEAD_HEIGHT);
-
- // Fill.
- // #8: battery returned as float. Use floor() to match native. Must match getValueForFieldType().
- var batteryLevel = Math.floor(Sys.getSystemStats().battery);
-
- // Fill colour based on battery level.
- var fillColour;
- if (batteryLevel <= /* BATTERY_LEVEL_CRITICAL */ 10) {
- fillColour = Graphics.COLOR_RED;
- } else if (batteryLevel <= /* BATTERY_LEVEL_LOW */ 20) {
- fillColour = Graphics.COLOR_YELLOW;
- } else {
- fillColour = gThemeColour;
- }
-
- dc.setColor(fillColour, Graphics.COLOR_TRANSPARENT);
-
- var lineWidthPlusMargin = (/* BATTERY_LINE_WIDTH */ 2 + BATTERY_MARGIN);
- var fillWidth = width - (2 * lineWidthPlusMargin);
- dc.fillRectangle(
- x - (width / 2) + lineWidthPlusMargin,
- y - (height / 2) + lineWidthPlusMargin,
- Math.ceil(fillWidth * (batteryLevel / 100)),
- height - (2 * lineWidthPlusMargin));
-}
-
class CrystalView extends Ui.WatchFace {
private var mIsSleeping = false;
private var mIsBurnInProtection = false; // Is burn-in protection required and active?
private var mBurnInProtectionChangedSinceLastDraw = false; // Did burn-in protection change since last full update?
private var mSettingsChangedSinceLastDraw = true; // Have settings changed since last full update?
-
private var mTime;
var mDataFields;
+ var mFieldTypes = new [3];
+ var mGoalTypes = new [2];
+ var mMoveBarType;
// Cache references to drawables immediately after layout, to avoid expensive findDrawableById() calls in onUpdate();
- private var mDrawables = {};
+ var mDrawables = {};
+
+ var mWeatherStationName; // Weather Station name removed from firmware
+ var mLocalCityName;
+ var mLocalCityLat;
+ var mLocalCityLon;
+
+ private var mUseComplications;
+ var mDigitStyle;
+ var mShowWeatherStationName;
// N.B. Not all watches that support SDK 2.3.0 support per-second updates e.g. 735xt.
private const PER_SECOND_UPDATES_SUPPORTED = Ui.WatchFace has :onPartialUpdate;
@@ -117,6 +98,23 @@ class CrystalView extends Ui.WatchFace {
function initialize() {
WatchFace.initialize();
+
+ gNormalFont = Ui.loadResource(Rez.Fonts.NormalFontCities);
+
+ mFieldTypes[0] = {};
+ mFieldTypes[1] = {};
+ mFieldTypes[2] = {};
+
+ mGoalTypes[0] = {};
+ mGoalTypes[1] = {};
+
+ mMoveBarType = {};
+
+ //DEBUG*/ logMessage("View:Initialize");
+ }
+
+ function burnInProtectionIsOrWasActive() {
+ return mIsBurnInProtection | mBurnInProtectionChangedSinceLastDraw;
}
// Load your resources here
@@ -145,24 +143,72 @@ class CrystalView extends Ui.WatchFace {
mDrawables[:MoveBar] = View.findDrawableById("MoveBar");
- setHideSeconds(App.getApp().getProperty("HideSeconds")); // Requires mTime, mDrawables[:MoveBar];
+ setHideSeconds($.getIntProperty("HideSeconds", 0)); // Requires mTime, mDrawables[:MoveBar];
}
/*
// Called when this View is brought to the foreground. Restore
// the state of this View and prepare it to be shown. This includes
- // loading resources into memory.
+ // loading resources into memory. */
function onShow() {
+ //DEBUG*/ logMessage("View showing");
}
- */
// Set flag to respond to settings change on next full draw (onUpdate()), as we may be in 1Hz (lower power) mode, and cannot
// update the full screen immediately. This is true on real hardware, but not in the simulator, which calls onUpdate()
// immediately. Ui.requestUpdate() does not appear to work in 1Hz mode on real hardware.
+ (:noComplications)
+ function onSettingsChanged() {
+ mSettingsChangedSinceLastDraw = true;
+ //logMessage("onSettingsChanged called");
+
+ mFieldTypes[0].put("type", $.getIntProperty("Field1Type", 0));
+ mFieldTypes[1].put("type", $.getIntProperty("Field2Type", 1));
+ mFieldTypes[2].put("type", $.getIntProperty("Field3Type", 2));
+
+ mGoalTypes[0].put("type", $.getIntProperty("LeftGoalType", 0));
+ mGoalTypes[1].put("type", $.getIntProperty("RightGoalType", 0));
+
+ mMoveBarType.put("type", $.getIntProperty("MoveBarType", 0));
+
+ // Themes: explicitly set *Colour properties that have no corresponding (user-facing) setting.
+ updateThemeColours();
+
+ // Update hours/minutes colours after theme colours have been set.
+ updateHoursMinutesColours();
+
+ ReadWeather(false);
+ checkPendingWebRequests();
+
+ // Get our 2nd local time if available
+ var localTimeInCity = $.getStringProperty("LocalTimeInCity", "");
+ var splitArray = $.to_array(localTimeInCity, ",");
+ if (splitArray.size() == 3) {
+ mLocalCityName = $.validateString(splitArray[0], "???");
+ mLocalCityLat = $.validateFloat(splitArray[1], null);
+ mLocalCityLon = $.validateFloat(splitArray[2], null);
+ }
+ else {
+ mLocalCityName = null;
+ }
+
+ mDigitStyle = $.getIntProperty("GoalMeterDigitsStyle", 0);
+ mShowWeatherStationName = $.getBoolProperty("ShowWeatherStationName", true);
+ }
+
+ (:hasComplications)
function onSettingsChanged() {
mSettingsChangedSinceLastDraw = true;
+ //logMessage("onSettingsChanged called");
+
+ mFieldTypes[0].put("type", $.getIntProperty("Field1Type", 0));
+ mFieldTypes[1].put("type", $.getIntProperty("Field2Type", 1));
+ mFieldTypes[2].put("type", $.getIntProperty("Field3Type", 2));
- updateNormalFont();
+ mGoalTypes[0].put("type", $.getIntProperty("LeftGoalType", 0));
+ mGoalTypes[1].put("type", $.getIntProperty("RightGoalType", 0));
+
+ mMoveBarType.put("type", $.getIntProperty("MoveBarType", 0));
// Themes: explicitly set *Colour properties that have no corresponding (user-facing) setting.
updateThemeColours();
@@ -170,80 +216,366 @@ class CrystalView extends Ui.WatchFace {
// Update hours/minutes colours after theme colours have been set.
updateHoursMinutesColours();
- if (CrystalApp has :checkPendingWebRequests) { // checkPendingWebRequests() can be excluded to save memory.
- App.getApp().checkPendingWebRequests();
+ ReadWeather(false);
+ checkPendingWebRequests();
+
+ // Get our 2nd local time if available
+ var localTimeInCity = $.getStringProperty("LocalTimeInCity", "");
+ var splitArray = $.to_array(localTimeInCity, ",");
+ if (splitArray.size() == 3) {
+ mLocalCityName = $.validateString(splitArray[0], "???");
+ mLocalCityLat = $.validateFloat(splitArray[1], null);
+ mLocalCityLon = $.validateFloat(splitArray[2], null);
+ }
+ else {
+ mLocalCityName = null;
+ }
+
+ mDigitStyle = $.getIntProperty("GoalMeterDigitsStyle", 0);
+ mShowWeatherStationName = $.getBoolProperty("ShowWeatherStationName", true);
+
+ // Reread our complications if we're allowed
+ mUseComplications = $.getBoolProperty("UseComplications", false);
+ gTeslaComplication = $.getBoolProperty("TeslaLink", false);
+
+ // We're not looking at the Complication sent by Tesla-Link and we have a refesh token, register for temporal events
+ if (gTeslaComplication == false && $.getStringProperty("TeslaRefreshToken", "").length() > 0) {
+ var lastTime = Bg.getLastTemporalEventTime();
+ if (lastTime) {
+ // Events scheduled for a time in the past trigger immediately.
+ var nextTime = lastTime.add(new Time.Duration(5 * 60));
+
+ //DEBUG*/ var local = Gregorian.info(nextTime, Time.FORMAT_SHORT); var time = $.getFormattedTime(local.hour, local.min, local.sec); logMessage("Next temporal event at " + time[:hour] + ":" + time[:min] + ":" + time[:sec] + time[:amPm]);
+ Bg.registerForTemporalEvent(nextTime);
+ } else {
+ //DEBUG*/ logMessage("Next Temporal Events should happen NOW");
+ Bg.registerForTemporalEvent(Time.now());
+ }
+ }
+ else {
+ Bg.deleteTemporalEvent();
+ }
+
+ // Reread our complications if we're allowed
+ if (Toybox has :Complications) {
+ // First we drop all our subscriptions before building a new list
+ Complications.unsubscribeFromAllUpdates();
+ // We listen for complications if we're allowed
+ Complications.registerComplicationChangeCallback($.getBoolProperty("UseComplications", false) ? self.method(:onComplicationUpdated) : null);
}
}
- // Select normal font, based on whether time zone feature is being used.
- // Saves memory when cities are not in use.
- // Update drawables that use normal font.
- function updateNormalFont() {
+ // Determine if any web requests are needed.
+ // If so, set approrpiate pendingWebRequests flag for use by BackgroundService, then register for
+ // temporal event.
+ // Currently called on layout initialisation, when settings change, and on exiting sleep.
+ (:background_method)
+ function checkPendingWebRequests() {
+ // Attempt to update current location, to be used by Sunrise/Sunset, and Weather.
+ // If current location available from current activity, save it in case it goes "stale" and can not longer be retrieved.
+
+ var location = Activity.getActivityInfo().currentLocation;
+ if (location) {
+ location = location.toDegrees(); // Array of Doubles.
+ if (location[0] != 0.0 && location[1] != 0.0) {
+ gLocationLat = location[0];
+ gLocationLng = location[1];
+ Properties.setValue("LastLocationLat", gLocationLat.format("%0.5f"));
+ Properties.setValue("LastLocationLng", gLocationLng.format("%0.5f"));
+ }
+ }
+ // If current location is not available, read stored value from Object Store, being careful not to overwrite a valid
+ // in-memory value with an invalid stored one.
+ else {
+ var lat = $.getStringProperty("LastLocationLat","");
+ if (lat != null) {
+ gLocationLat = lat.toFloat();
+ }
+
+ var lng = $.getStringProperty("LastLocationLng","");
+ if (lng != null) {
+ gLocationLng = lng.toFloat();
+ }
+ }
- var city = App.getApp().getProperty("LocalTimeInCity");
+ if (!(Sys has :ServiceDelegate)) {
+ return;
+ }
- // #78 Setting with value of empty string may cause corresponding property to be null.
- gNormalFont = Ui.loadResource(((city != null) && (city.length() > 0)) ?
- Rez.Fonts.NormalFontCities : Rez.Fonts.NormalFont);
+ var pendingWebRequests = Storage.getValue("PendingWebRequests");
+ if (pendingWebRequests == null) {
+ pendingWebRequests = {};
+ }
+ //DEBUG*/ logMessage("checkPendingWebRequests: pendingWebRequest=" + pendingWebRequests);
+ // 1. Weather:
+ // Location must be available, weather or humidity (#113) data field must be shown.
+ if ((gLocationLat != null) &&
+ (hasField(FIELD_TYPE_WEATHER) || hasField(FIELD_TYPE_HUMIDITY))) {
+
+ var owmKeyOverride = $.getStringProperty("OWMKeyOverride","");
+ if (owmKeyOverride == null || owmKeyOverride.length() == 0) {
+ //DEBUG*/ logMessage("checkPendingWebRequests:Using Garmin Weather so skipping OWM code");
+ } else {
+ //2022-04-10 logMessage("Using OpenWeatherMap");
+ var owmCurrent = Storage.getValue("OpenWeatherMapCurrent");
+ //DEBUG*/ logMessage("checkPendingWebRequests:owmCurrent=" + owmCurrent);
+ // No existing data.
+ if (owmCurrent == null) {
+ pendingWebRequests["OpenWeatherMapCurrent"] = true;
+ // Successfully received weather data.
+ } else if (owmCurrent["cod"] == 200) {
+ if (owmCurrent["NewData"] != null) { // true if we have new data, otherwise null
+ Storage.setValue("NewWeatherInfo", true);
+ owmCurrent.remove("NewData");
+ Storage.setValue("OpenWeatherMapCurrent", owmCurrent);
+ mWeatherStationName = owmCurrent["name"];
+ }
+ // Existing data is older than 5 mins.
+ // TODO: Consider requesting weather at sunrise/sunset to update weather icon.
+ if ((Time.now().value() > (owmCurrent["dt"] + 300)) ||
+ //true || //TODO Remove
+ // Existing data not for this location.
+ // Not a great test, as a degree of longitude varies betwee 69 (equator) and 0 (pole) miles, but simpler than
+ // true distance calculation. 0.02 degree of latitude is just over a mile.
+ (((gLocationLat - owmCurrent["lat"]).abs() > 0.02) || ((gLocationLng - owmCurrent["lon"]).abs() > 0.02))) {
+ pendingWebRequests["OpenWeatherMapCurrent"] = true;
+ }
+ } else {
+ pendingWebRequests["OpenWeatherMapCurrent"] = true;
+ }
+ }
+ }
+
+//****************************************************************
+//******** REMVOVED THIS SECTION IF TESLA CODE NOT WANTED ********
+//****************************************************************
+ // 2. Tesla:
+ if (Storage.getValue("Tesla") != null) {
+ var teslaInfo = Storage.getValue("TeslaInfo");
+ //DEBUG*/ logMessage("checkPendingWebRequests:teslaInfo=" + teslaInfo);
+ if (teslaInfo != null) { // We got Tesla data, process it
+ var arrayKey = ["RefreshToken", "AccessToken", "TokenCreatedAt", "TokenExpiresIn", "VehicleID"];
+ var arrayProp = [true, true, false, false, false ];
+ for (var i = 0; i < arrayKey.size(); i++) {
+ var value = teslaInfo.get(arrayKey[i]);
+ if (value != null) {
+ if (arrayProp[i]) {
+ Properties.setValue("Tesla" + arrayKey[i], value);
+ }
+ else {
+ Storage.setValue("Tesla" + arrayKey[i], value);
+ }
+ teslaInfo.remove(arrayKey[i]);
+ }
+ }
+
+ // Now store our updated copy of TeslaInfo
+ Storage.setValue("TeslaInfo", teslaInfo);
+
+ // We deal with specific errors here, leaving the good stuff to the battery indicator
+ var responseCode = teslaInfo["httpErrorTesla"];
+ var internalResponseCode = teslaInfo["httpInternalErrorTesla"];
+ if (responseCode != null && internalResponseCode != null) {
+ if (responseCode == 401 && internalResponseCode != 200) { // Our token has expired and we were unable to get one, refresh it
+ Properties.setValue("TeslaAccessToken", null); // Try to get a new vehicleID
+ } else if (responseCode == 404 && internalResponseCode != 200) { // We got a vehicle not found error and we were unable to get one, reset our vehicle ID
+ Storage.deleteValue("VehicleID"); // Try to get a new vehicleID
+ }
+ }
+
+ }
+ pendingWebRequests["TeslaInfo"] = true;
+ }
+ else {
+ pendingWebRequests.remove("TeslaInfo");
+ }
+//****************************************************************
+//******************** END OF REMVOVED SECTION *******************
+//****************************************************************
+
+ // If there are any pending requests and we can do background process
+ if (Toybox.System has :ServiceDelegate && pendingWebRequests.keys().size() > 0) {
+ // Register for background temporal event as soon as possible.
+ var lastTime = Bg.getLastTemporalEventTime();
+ if (lastTime) {
+ // Events scheduled for a time in the past trigger immediately.
+ var nextTime = lastTime.add(new Time.Duration(5 * 60));
+ Bg.registerForTemporalEvent(nextTime);
+ } else {
+ Bg.registerForTemporalEvent(Time.now());
+ }
+ }
+
+ Storage.setValue("PendingWebRequests", pendingWebRequests);
}
+ // Read the weather from the Garmin API and store it into the same format OpenWeatherMap expects to see
+ function ReadWeather(fromComplication) {
+ var weather;
+ var result;
+ if (fromComplication) {
+ }
+ else if (Toybox has :Weather && Toybox.Weather has :getCurrentConditions) {
+ var owmKeyOverride = $.getStringProperty("OWMKeyOverride","");
+ if (owmKeyOverride != null && owmKeyOverride.length() > 0) {
+ return; // We have an OWM API key, this means we're going to use OWM and not Garmin weather, so skip function.
+ }
+
+ weather = Weather.getCurrentConditions();
+ if (weather != null) {
+ var temperature = $.validateNumber(weather.temperature, null); // In Celcius
+ if (temperature == null) {
+ temperature = "NaN";
+ }
+
+ var humidity = $.validateNumber(weather.relativeHumidity, null);
+ if (humidity == null) {
+ humidity = "NaN";
+ }
+
+ // Weather Station name removed from firmware
+ // mWeatherStationName = $.validateString(weather.observationLocationName, null);
+
+ var icon = "01";
+ var day = "d";
+ var myLocation = weather.observationLocationPosition;
+ var now = Time.now();
+ if (myLocation != null) {
+ if (Toybox.Weather has :getSunrise) {
+ var sunrise = Weather.getSunrise(myLocation, now);
+ var sunset = Weather.getSunset(myLocation, now);
+
+ if (sunrise != null and sunset != null) {
+ var sinceSunrise = sunrise.compare(now);
+ var sinceSunset = now.compare(sunset);
+ if (sinceSunrise >= 0 || sinceSunset >= 0) {
+ day = "n";
+ }
+ }
+ }
+ else {
+ //logMessage("Sucks, We DON'T have sunrise and sunset routines, do it the old way then");
+ var myLocationArray = myLocation.toDegrees();
+ now = Gregorian.info(now, Time.FORMAT_SHORT);
+
+ // Convert to same format as sunTimes, for easier comparison. Add a minute, so that e.g. if sun rises at
+ // 07:38:17, then 07:38 is already consided daytime (seconds not shown to user).
+ now = now.hour + ((now.min + 1) / 60.0);
+ //logMessage(now);
+
+ // Get today's sunrise/sunset times in current time zone.
+ var sunTimes = getSunTimes(myLocationArray[0], myLocationArray[1], null, /* tomorrow */ false);
+ //logMessage(sunTimes);
+ //logMessage("now=" + now);
+ //logMessage("sunTimes=" + sunTimes);
+ // If sunrise/sunset happens today.
+ var sunriseSunsetToday = ((sunTimes[0] != null) && (sunTimes[1] != null));
+ if (sunriseSunsetToday) {
+ if (now < sunTimes[0] || now > sunTimes[1]) {
+ day = "n";
+ }
+ }
+ }
+ }
+
+ var condition = $.validateNumber(weather.condition, null);
+ if (condition != null && condition < 53) {
+ icon = (mGarminToOWM[condition]).format("%02d") + day;
+ //logMessage("icon=" + icon);
+ }
+ else {
+ icon = icon + day;
+ //DEBUG*/ logMessage("Icon index " + condition + " is invalid");
+ }
+ result = { "cod" => 200, "temp" => temperature, "humidity" => humidity, "icon" => icon };
+ //DEBUG*/ logMessage("Weather is " + result);
+ }
+ else {
+ result = { "cod" => 404 };
+ //DEBUG*/ logMessage("No weather data, returning cod = 404");
+ }
+ }
+ else {
+ result = { "cod" => 400 };
+ //DEBUG*/ logMessage("No weather data, returning cod = 400");
+ }
+ Storage.setValue("OpenWeatherMapCurrent", result);
+ Storage.setValue("NewWeatherInfo", true);
+ }
+
function updateThemeColours() {
// #182 Protect against null or unexpected type e.g. String.
- var theme = App.getApp().getIntProperty("Theme", 0);
-
- // Theme-specific colours.
- gThemeColour = [
- Graphics.COLOR_BLUE, // THEME_BLUE_DARK
- Graphics.COLOR_PINK, // THEME_PINK_DARK
- Graphics.COLOR_GREEN, // THEME_GREEN_DARK
- Graphics.COLOR_DK_GRAY, // THEME_MONO_LIGHT
- 0x55AAFF, // THEME_CORNFLOWER_BLUE_DARK
- 0xFFFFAA, // THEME_LEMON_CREAM_DARK
- Graphics.COLOR_ORANGE, // THEME_DAYGLO_ORANGE_DARK
- Graphics.COLOR_RED, // THEME_RED_DARK
- Graphics.COLOR_WHITE, // THEME_MONO_DARK
- Graphics.COLOR_DK_BLUE, // THEME_BLUE_LIGHT
- Graphics.COLOR_DK_GREEN, // THEME_GREEN_LIGHT
- Graphics.COLOR_DK_RED, // THEME_RED_LIGHT
- 0xFFFF00, // THEME_VIVID_YELLOW_DARK
- Graphics.COLOR_ORANGE, // THEME_DAYGLO_ORANGE_LIGHT
- Graphics.COLOR_YELLOW // THEME_CORN_YELLOW_DARK
- ][theme];
-
- // Light/dark-specific colours.
- var lightFlags = [
- false, // THEME_BLUE_DARK
- false, // THEME_PINK_DARK
- false, // THEME_GREEN_DARK
- true, // THEME_MONO_LIGHT
- false, // THEME_CORNFLOWER_BLUE_DARK
- false, // THEME_LEMON_CREAM_DARK
- false, // THEME_DAYGLO_ORANGE_DARK
- false, // THEME_RED_DARK
- false, // THEME_MONO_DARK
- true, // THEME_BLUE_LIGHT
- true, // THEME_GREEN_LIGHT
- true, // THEME_RED_LIGHT
- false, // THEME_VIVID_YELLOW_DARK
- true, // THEME_DAYGLO_ORANGE_LIGHT
- false, // THEME_CORN_YELLOW_DARK
- ];
+ var theme = $.getIntProperty("Theme", 0);
+ var lightFlag;
+ var themeOverride = $.getStringProperty("ThemeOverride","");
+
+ gThemeColour = null; // Will still be null if our override is invalid
+ if (themeOverride.length() > 0) {
+ try {
+ gThemeColour = themeOverride.toNumberWithBase(16);
+ }
+ catch (e) {
+ }
+ lightFlag = $.getBoolProperty("ThemeLightOverride", false);
+ }
+
+ if (gThemeColour == null) {
+ // Theme-specific colours.
+ gThemeColour = [
+ Graphics.COLOR_BLUE, // THEME_BLUE_DARK
+ Graphics.COLOR_PINK, // THEME_PINK_DARK
+ Graphics.COLOR_GREEN, // THEME_GREEN_DARK
+ Graphics.COLOR_DK_GRAY, // THEME_MONO_LIGHT
+ 0x55AAFF, // THEME_CORNFLOWER_BLUE_DARK
+ 0xFFFFAA, // THEME_LEMON_CREAM_DARK
+ Graphics.COLOR_ORANGE, // THEME_DAYGLO_ORANGE_DARK
+ Graphics.COLOR_RED, // THEME_RED_DARK
+ Graphics.COLOR_WHITE, // THEME_MONO_DARK
+ Graphics.COLOR_DK_BLUE, // THEME_BLUE_LIGHT
+ Graphics.COLOR_DK_GREEN, // THEME_GREEN_LIGHT
+ Graphics.COLOR_DK_RED, // THEME_RED_LIGHT
+ 0xFFFF00, // THEME_VIVID_YELLOW_DARK
+ Graphics.COLOR_ORANGE, // THEME_DAYGLO_ORANGE_LIGHT
+ Graphics.COLOR_YELLOW // THEME_CORN_YELLOW_DARK
+ ][theme];
+
+ // Light/dark-specific colours.
+ var lightFlags = [
+ false, // THEME_BLUE_DARK
+ false, // THEME_PINK_DARK
+ false, // THEME_GREEN_DARK
+ true, // THEME_MONO_LIGHT
+ false, // THEME_CORNFLOWER_BLUE_DARK
+ false, // THEME_LEMON_CREAM_DARK
+ false, // THEME_DAYGLO_ORANGE_DARK
+ false, // THEME_RED_DARK
+ false, // THEME_MONO_DARK
+ true, // THEME_BLUE_LIGHT
+ true, // THEME_GREEN_LIGHT
+ true, // THEME_RED_LIGHT
+ false, // THEME_VIVID_YELLOW_DARK
+ true, // THEME_DAYGLO_ORANGE_LIGHT
+ false, // THEME_CORN_YELLOW_DARK
+ ];
+
+ lightFlag = lightFlags[theme];
+ }
- // #124: fr45 cannot show grey.
- var isFr45 = (Sys.getDeviceSettings().screenWidth == 208);
+ // #124: fr45 cannot show grey. SG Fr45 not supported
+ //var isFr45 = (Sys.getDeviceSettings().screenWidth == 208);
- if (lightFlags[theme]) {
+ if (lightFlag) {
gMonoLightColour = Graphics.COLOR_BLACK;
- gMonoDarkColour = isFr45 ? Graphics.COLOR_BLACK : Graphics.COLOR_DK_GRAY;
+ gMonoDarkColour = /*isFr45 ? Graphics.COLOR_BLACK : */ Graphics.COLOR_DK_GRAY;
- gMeterBackgroundColour = isFr45 ? Graphics.COLOR_BLACK : Graphics.COLOR_LT_GRAY;
+ gMeterBackgroundColour = /*isFr45 ? Graphics.COLOR_BLACK : */ Graphics.COLOR_LT_GRAY;
gBackgroundColour = Graphics.COLOR_WHITE;
} else {
gMonoLightColour = Graphics.COLOR_WHITE;
- gMonoDarkColour = isFr45 ? Graphics.COLOR_WHITE : Graphics.COLOR_LT_GRAY;
+ gMonoDarkColour = /*isFr45 ? Graphics.COLOR_WHITE : */ Graphics.COLOR_LT_GRAY;
- gMeterBackgroundColour = isFr45 ? Graphics.COLOR_WHITE : Graphics.COLOR_DK_GRAY;
+ gMeterBackgroundColour = /*isFr45 ? Graphics.COLOR_WHITE : */ Graphics.COLOR_DK_GRAY;
gBackgroundColour = Graphics.COLOR_BLACK;
}
}
@@ -257,10 +589,10 @@ class CrystalView extends Ui.WatchFace {
// #182 Protect against null or unexpected type e.g. String.
// #182 Protect against invalid integer values (still crashing with getIntProperty()).
- var hco = App.getApp().getIntProperty("HoursColourOverride", 0);
+ var hco = $.getIntProperty("HoursColourOverride", 0);
gHoursColour = overrideColours[(hco < 0 || hco > 2) ? 0 : hco];
- var mco = App.getApp().getIntProperty("MinutesColourOverride", 0);
+ var mco = $.getIntProperty("MinutesColourOverride", 0);
gMinutesColour = overrideColours[(mco < 0 || mco > 2) ? 0 : mco];
}
@@ -268,8 +600,8 @@ class CrystalView extends Ui.WatchFace {
if (!mIsBurnInProtection) {
// Recreate background buffers for each meter, in case theme colour has changed.
- mDrawables[:LeftGoalMeter].onSettingsChanged();
- mDrawables[:RightGoalMeter].onSettingsChanged();
+ mDrawables[:LeftGoalMeter].onSettingsChanged(0);
+ mDrawables[:RightGoalMeter].onSettingsChanged(1);
mDrawables[:MoveBar].onSettingsChanged();
@@ -281,7 +613,7 @@ class CrystalView extends Ui.WatchFace {
// If watch does not support per-second updates, and watch is sleeping, do not show seconds immediately, as they will not
// update. Instead, wait for next onExitSleep().
if (PER_SECOND_UPDATES_SUPPORTED || !mIsSleeping) {
- setHideSeconds(App.getApp().getProperty("HideSeconds"));
+ setHideSeconds($.getIntProperty("HideSeconds", 0));
}
mSettingsChangedSinceLastDraw = false;
@@ -290,15 +622,16 @@ class CrystalView extends Ui.WatchFace {
// Update the view
function onUpdate(dc) {
//Sys.println("onUpdate()");
+ //DEBUG*/ var myStats = Sys.getSystemStats(); logMessage("Total memory: " + myStats.totalMemory + " Used memory: " + myStats.usedMemory + " Free memory: " + myStats.freeMemory);
// If burn-in protection has changed, set layout appropriate to new burn-in protection state.
// If turning on burn-in protection, free memory for regular watch face drawables by clearing references. This means that
// any use of mDrawables cache must only occur when burn in protection is NOT active.
// If turning off burn-in protection, recache regular watch face drawables.
if (mBurnInProtectionChangedSinceLastDraw) {
- mBurnInProtectionChangedSinceLastDraw = false;
setLayout(mIsBurnInProtection ? Rez.Layouts.AlwaysOn(dc) : Rez.Layouts.WatchFace(dc));
cacheDrawables();
+ mBurnInProtectionChangedSinceLastDraw = false;
}
// Respond now to any settings change since last full draw, as we can now update the full screen.
@@ -306,6 +639,14 @@ class CrystalView extends Ui.WatchFace {
onSettingsChangedSinceLastDraw();
}
+ // Do we have requests pending?
+ var requestsPending = Storage.getValue("RequestsPending");
+ if (requestsPending != null) {
+ //DEBUG*/ logMessage("onUpdate:Requests are pending");
+ Storage.deleteValue("RequestsPending");
+ checkPendingWebRequests();
+ }
+
// Clear any partial update clipping.
if (dc has :clearClip) {
dc.clearClip();
@@ -320,43 +661,69 @@ class CrystalView extends Ui.WatchFace {
// Update each goal meter separately, then also pass types and values to data area to draw goal icons.
function updateGoalMeters() {
if (mIsBurnInProtection) {
- return;
+ return;
}
- var leftType = App.getApp().getProperty("LeftGoalType");
- var leftValues = getValuesForGoalType(leftType);
+ var leftType = $.getIntProperty("LeftGoalType", 0);
+ var leftValues = getValuesForGoalType(0, leftType);
mDrawables[:LeftGoalMeter].setValues(leftValues[:current], leftValues[:max], /* isOff */ leftType == GOAL_TYPE_OFF);
- var rightType = App.getApp().getProperty("RightGoalType");
- var rightValues = getValuesForGoalType(rightType);
+ var rightType = $.getIntProperty("RightGoalType", 1);
+ var rightValues = getValuesForGoalType(1, rightType);
mDrawables[:RightGoalMeter].setValues(rightValues[:current], rightValues[:max], /* isOff */ rightType == GOAL_TYPE_OFF);
mDrawables[:DataArea].setGoalValues(leftType, leftValues, rightType, rightValues);
}
- function getValuesForGoalType(type) {
+ function getValuesForGoalType(index, type) {
var values = {
:current => 0,
:max => 1,
- :isValid => true
+ :isValid => true,
+ :staled => false
};
var info = ActivityMonitor.getInfo();
switch(type) {
case GOAL_TYPE_STEPS:
- values[:current] = info.steps;
+ values[:isValid] = false;
+ if (Toybox has :Complications && mUseComplications) {
+ var tmpValue = mGoalTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ // For some stupid reason, above 10K, it becomes a float and divided by 1000, so 15,500 becomes 15.500. WTF?
+ if (tmpValue instanceof Lang.Float) {
+ tmpValue = tmpValue * 1000;
+ }
+ values[:current] = tmpValue.toNumber();
+ values[:isValid] = true;
+ }
+ }
+ if (values[:isValid] == false) { // ignore steps (but get the max value) if we have Complication
+ values[:current] = info.steps;
+ }
values[:max] = info.stepGoal;
+ values[:isValid] = true;
break;
case GOAL_TYPE_FLOORS_CLIMBED:
+ values[:isValid] = false;
+ if (Toybox has :Complications && mUseComplications) {
+ var tmpValue = mGoalTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ values[:current] = tmpValue.toNumber();
+ values[:isValid] = true;
+ }
+ }
if (info has :floorsClimbed) {
- values[:current] = info.floorsClimbed;
+ if (values[:isValid] == false) { // ignore floor climbs (but get the max value) if we have Complication
+ values[:current] = info.floorsClimbed;
+ }
values[:max] = info.floorsClimbedGoal;
+ values[:isValid] = true;
} else {
values[:isValid] = false;
}
-
break;
case GOAL_TYPE_ACTIVE_MINUTES:
@@ -374,12 +741,122 @@ class CrystalView extends Ui.WatchFace {
values[:max] = 100;
break;
+ // SG Addition
+ case GOAL_TYPE_BODY_BATTERY:
+ values[:isValid] = false;
+ values[:max] = 100;
+
+ if (Toybox has :Complications && mUseComplications) {
+ var tmpValue = mGoalTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ values[:current] = tmpValue.toFloat();
+ values[:isValid] = true;
+ }
+ }
+ if (values[:isValid] == false && (Toybox has :SensorHistory) && (Toybox.SensorHistory has :getBodyBatteryHistory)) {
+ var bodyBattery = Toybox.SensorHistory.getBodyBatteryHistory({:period=>1});
+ if (bodyBattery != null) {
+ bodyBattery = bodyBattery.next();
+ }
+ if (bodyBattery !=null) {
+ bodyBattery = bodyBattery.data;
+ }
+ if (bodyBattery != null && bodyBattery >= 0 && bodyBattery <= 100) {
+ values[:current] = bodyBattery.toFloat();
+ values[:isValid] = true;
+ }
+ }
+
+ break;
+
+ // SG Addition
+ case GOAL_TYPE_STRESS_LEVEL:
+ values[:isValid] = false;
+ values[:max] = 100;
+
+ if (Toybox has :Complications && mUseComplications) {
+ var tmpValue = mGoalTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ values[:current] = tmpValue.toFloat();
+ values[:isValid] = true;
+ }
+ }
+ if (values[:isValid] == false && (Toybox has :SensorHistory) && (Toybox.SensorHistory has :getStressHistory)) {
+ var stressLevel = Toybox.SensorHistory.getStressHistory({:period=>1});
+ //DEBUG*/ var stressLevelDate = 0;
+
+ if (stressLevel != null) {
+ stressLevel = stressLevel.next();
+ }
+ if (stressLevel !=null) {
+ //DEBUG*/ stressLevelDate = stressLevel.when.value();
+ stressLevel = stressLevel.data;
+ }
+
+ if (stressLevel != null) {
+ if (stressLevel >= 0 && stressLevel <= 100) {
+ values[:current] = stressLevel.toFloat();
+ values[:isValid] = true;
+ gStressLevel = stressLevel;
+ } else if (gStressLevel != null) {
+ values[:current] = gStressLevel.toFloat();
+ values[:isValid] = true;
+ values[:staled] = true;
+ }
+ } else if (gStressLevel != null) {
+ values[:current] = gStressLevel.toFloat();
+ values[:isValid] = true;
+ values[:staled] = true;
+ }
+ //logMessage("stressLeve " + stressLevel + " count " + count + " keptCount " + keptCount + " stressLevelDate " + stressLevelDate);
+ }
+
+ break;
+
+ // SG Addition
+ case GOAL_TYPE_ACTIVE_CALORIES:
case GOAL_TYPE_CALORIES:
- values[:current] = info.calories;
+ var fromComplication = false;
+ var today = Gregorian.info(Time.now(), Time.FORMAT_MEDIUM);
+ var profile = UserProfile.getProfile();
+ var age = today.year - profile.birthYear;
+ var weight = profile.weight / 1000.0;
+ var restCalories = ((profile.gender == UserProfile.GENDER_MALE) ? 5.2 : -197.6) - 6.116 * age + 7.628 * profile.height + 12.2 * weight;
+ restCalories = Math.round((today.hour * 60 + today.min) * restCalories / 1440 ).toNumber();
+
+ values[:isValid] = false;
+ if (Toybox has :Complications && mUseComplications) {
+ var tmpValue = mGoalTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ values[:current] = tmpValue.toFloat();
+ values[:isValid] = true;
+ fromComplication = true;
+ //DEBUG*/ logMessage("From Complications");
+ }
+ }
+
+ if (values[:isValid] == false) {
+ values[:current] = info.calories;
+ values[:isValid] = true;
+ //DEBUG*/ logMessage("From activityInfo");
+ }
+
+ //DEBUG*/ logMessage("calories: " + values[:current] + " rest: " + restCalories + " isValid: " + values[:isValid]);
+ // Now deal with either total calories and active calories (activityInfo returns Total while Complications returns Active)
+ if (type == GOAL_TYPE_CALORIES) {
+ if (fromComplication) {
+ values[:current] += restCalories;
+ }
+ }
+ else {
+ if (!fromComplication) {
+ values[:current] -= restCalories;
+ }
+ }
// #123 Protect against null value returned by getProperty(). Trigger invalid goal handling code below.
// Protect against unexpected type e.g. String.
- values[:max] = App.getApp().getIntProperty("CaloriesGoal", 2000);
+ values[:max] = $.getIntProperty("CaloriesGoal", 2000);
break;
case GOAL_TYPE_OFF:
@@ -389,10 +866,17 @@ class CrystalView extends Ui.WatchFace {
// #16: If user has set goal to zero, or negative (in simulator), show as invalid. Set max to 1 to avoid divide-by-zero
// crash in GoalMeter.getSegmentScale().
- if (values[:max] < 1) {
+ // Sanity check. I've seen weird Invalid Value and "System Error" in DataArea.setGoalValues:48 and :61. Make sure the data is valid
+ if (values[:isValid] && (!(values[:max] instanceof Lang.Number || values[:max] instanceof Lang.Float) || values[:max] < 1)) {
+ //DEBUG*/ logMessage("values[:max] is invalid=" + values[:max]);
values[:max] = 1;
values[:isValid] = false;
}
+ if (values[:isValid] && (!(values[:current] instanceof Lang.Number || values[:current] instanceof Lang.Float))) {
+ //DEBUG*/ logMessage("values[:current] is invalid=" + values[:current]);
+ values[:current] = 0;
+ values[:isValid] = false;
+ }
return values;
}
@@ -409,28 +893,25 @@ class CrystalView extends Ui.WatchFace {
/*
// Called when this View is removed from the screen. Save the
// state of this View here. This includes freeing resources from
- // memory.
+ // memory */
function onHide() {
+ //DEBUG*/ logMessage("View hidding");
}
- */
// The user has just looked at their watch. Timers and animations may be started here.
function onExitSleep() {
mIsSleeping = false;
- //Sys.println("onExitSleep()");
-
// If watch does not support per-second updates, AND HideSeconds property is false,
// show seconds, and make move bar original width.
- if (!PER_SECOND_UPDATES_SUPPORTED && !App.getApp().getProperty("HideSeconds")) {
+ var hideSeconds = $.getIntProperty("HideSeconds", 0);
+ if ((!PER_SECOND_UPDATES_SUPPORTED && hideSeconds == 0) || hideSeconds == 1 ) {
setHideSeconds(false);
}
- // Rather than checking the need for background requests on a timer, or on the hour, easier just to check when exiting
- // sleep.
- if (CrystalApp has :checkPendingWebRequests) { // checkPendingWebRequests() can be excluded to save memory.
- App.getApp().checkPendingWebRequests();
- }
+ ReadWeather(false);
+ //DEBUG*/ logMessage("onExitSleep:Checking pending requests");
+ checkPendingWebRequests();
// If watch requires burn-in protection, set flag to false when entering sleep.
var settings = Sys.getDeviceSettings();
@@ -450,13 +931,15 @@ class CrystalView extends Ui.WatchFace {
// If watch does not support per-second updates, then hide seconds, and make move bar full width.
// onUpdate() is about to be called one final time before entering sleep.
// If HideSeconds property is true, do not wastefully hide seconds again (they should already be hidden).
- if (!PER_SECOND_UPDATES_SUPPORTED && !App.getApp().getProperty("HideSeconds")) {
+ var hideSeconds = $.getIntProperty("HideSeconds", 0);
+ if ((!PER_SECOND_UPDATES_SUPPORTED && hideSeconds == 0) || hideSeconds == 1) {
setHideSeconds(true);
}
// If watch requires burn-in protection, set flag to true when entering sleep.
var settings = Sys.getDeviceSettings();
if (settings has :requiresBurnInProtection && settings.requiresBurnInProtection) {
+ //DEBUG*/ logMessage("onEnterSleep with needing burning proctection");
mIsBurnInProtection = true;
mBurnInProtectionChangedSinceLastDraw = true;
}
@@ -468,6 +951,10 @@ class CrystalView extends Ui.WatchFace {
return mIsSleeping;
}
+ function useComplications() {
+ return mUseComplications;
+ }
+
function setHideSeconds(hideSeconds) {
// #158 Venu 2.80 firmware crash: mIsBurnInProtection fails to be set in onEnterSleep(), hopefully because that function
@@ -482,4 +969,272 @@ class CrystalView extends Ui.WatchFace {
mTime.setHideSeconds(hideSeconds);
mDrawables[:MoveBar].setFullWidth(hideSeconds);
}
+
+ (:noComplications)
+ function onComplicationUpdated(complicationId) {
+ }
+
+ (:hasComplications)
+ function onComplicationUpdated(complicationId) {
+ var complication = Complications.getComplication(complicationId);
+ var complicationType = complication.getType();
+ var complicationShortLabel = complication.shortLabel;
+ var complicationValue = complication.value;
+
+ //DEBUG*/ var complicationLongLabel = complication.longLabel; if (complicationType == Complications.COMPLICATION_TYPE_INVALID) { logMessage("Type: " + complicationType + " short label: " + complicationShortLabel + " long label: " + complicationLongLabel + " Value:" + complicationValue); }
+
+ if (gTeslaComplication == true && complicationType == Complications.COMPLICATION_TYPE_INVALID) {
+ if (complicationShortLabel != null && complicationShortLabel.equals("TeslaLink")) {
+ //DEBUG*/ logMessage("Doing Tesla Complication!");
+ $.doTeslaComplication(complicationValue);
+ }
+ }
+
+ // I've seen this while in low power mode, so skip it
+ if (complicationValue == null) {
+ //DEBUG*/ logMessage("We got a Complication value of null for " + complicationType);
+ return;
+ }
+
+ // Do fields first
+ var fieldCount = $.getIntProperty("FieldCount", 3);
+
+ for (var i = 0; i < fieldCount; i++) {
+ if (mFieldTypes[i].get("ComplicationType") == complicationType) {
+ mFieldTypes[i].put("ComplicationValue", complicationValue);
+ }
+ }
+//DEBUG*/ if (complicationType == Complications.COMPLICATION_TYPE_CALORIES || true) { logMessage("longLabel=" + complication.longLabel + ", unit=" + complication.unit + ", value=" + complication.value); }
+ // Now do goals
+ if (mGoalTypes[0].get("ComplicationType") == complicationType) {
+ mGoalTypes[0].put("ComplicationValue", complicationValue);
+ }
+ if (mGoalTypes[1].get("ComplicationType") == complicationType) {
+ mGoalTypes[1].put("ComplicationValue", complicationValue);
+ }
+
+ // Now do the MoveBar
+ if ($.getIntProperty("MoveBarStyle", 0) == 2) {
+ if (mMoveBarType.get("ComplicationType") == complicationType) {
+ mMoveBarType.put("ComplicationValue", complicationValue);
+ }
+ }
+ }
+
+ function hasField(fieldType) {
+ return ((mFieldTypes[0].get("type") == fieldType) ||
+ (mFieldTypes[1].get("type") == fieldType) ||
+ (mFieldTypes[2].get("type") == fieldType));
+ }
+}
+
+(:noComplications)
+class CrystalDelegate extends Ui.WatchFaceDelegate {
+ public function initialize(view as CrystalView) {
+ WatchFaceDelegate.initialize();
+ }
+}
+
+(:hasComplications)
+class CrystalDelegate extends Ui.WatchFaceDelegate {
+ private var mView as CrystalView;
+
+ //! Constructor
+ //! @param view The analog view
+ public function initialize(view as CrystalView) {
+ WatchFaceDelegate.initialize();
+ mView = view;
+ }
+
+ public function onPress(clickEvent as Ui.ClickEvent) as Lang.Boolean {
+ var co_ords = clickEvent.getCoordinates();
+ /*DEBUG*/ logMessage("onPress called with x:" + co_ords[0] + ", y:" + co_ords[1]);
+
+ // returns the complicationId within the boundingBoxes
+ if (Toybox has :Complications && App.getApp().getView().useComplications()) {
+ if (mView != null && mView.mDrawables != null && mView.mDataFields != null) { // Saw an unexpected error because one of these were null, although it shouldn't have happened
+ var complicationId = checkBoundingBoxes(co_ords);
+ if (complicationId != null && complicationId.getType() != Complications.COMPLICATION_TYPE_BATTERY) {
+ /*DEBUG*/ logMessage("Launching built-in complication");
+ try {
+ Complications.exitTo(complicationId);
+ }
+ catch (e) {}
+ }
+ else {
+ var complicationName = (complicationId != null ? $.getStringProperty("BatteryComplicationName", "") : $.getStringProperty("DefComplicationName", ""));
+ if (complicationName.length() > 0 ) {
+ // See if we should launch our external complications (default hotspot or battery widget)
+ var iter = Complications.getComplications();
+ if (iter == null) {
+ return;
+ }
+ complicationId = iter.next();
+
+ while (complicationId != null) {
+ //DEBUG*/ logMessage(complicationId.longLabel.toString());
+ if ((complicationId.getType() == Complications.COMPLICATION_TYPE_INVALID && complicationId.longLabel != null && complicationId.longLabel.equals(complicationName))) {
+ /*DEBUG*/ logMessage("Found our " + complicationName + " complication");
+ complicationId = complicationId.complicationId;
+ /*DEBUG*/ logMessage("complicationId is '" + complicationId + "'");
+ if (complicationId != null) { // Got a crash caused by a null complicationId (while holding over 'Steps' while in a indoor walk activity)
+ try {
+ /*DEBUG*/ logMessage("Launching " + complicationName + " complication");
+ Complications.exitTo(complicationId);
+ }
+ catch (e) {
+ /*DEBUG*/ logMessage("Failed to launch the " + complicationName + " complication, assertion is " + e);
+ }
+
+ return;
+ }
+ }
+ complicationId = iter.next();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ function checkBoundingBoxes(co_ords) {
+ // First check the indicators
+ var indicatorCount = $.getIntProperty("IndicatorCount", 1);
+ var spacingX;
+ var spacingY;
+ var complicationIndex;
+ var complicationId;
+
+ if (indicatorCount > 0) {
+ var indicators = mView.mDrawables[:Indicators];
+ if (indicators != null) {
+ var locX = indicators[:locX];
+ var locY = indicators[:locY];
+ var batteryWidth = indicators[:mBatteryWidth];
+
+ spacingY = indicators[:mSpacing];
+ spacingX = batteryWidth * 2;
+ locX -= (batteryWidth / 1.5).toNumber();
+ if (indicatorCount == 1) {
+ locY -= spacingY;
+ spacingY *= 2;
+ }
+ else {
+ locY -= spacingY / 2;
+ }
+
+ if (indicatorCount == 3) {
+ complicationIndex = "Complication_I" + isWithin(co_ords[0], co_ords[1], locX, locY - spacingY, spacingX, spacingY, "1") + isWithin(co_ords[0], co_ords[1], locX, locY, spacingX, spacingY, "2") + isWithin(co_ords[0], co_ords[1], locX, locY + spacingY, spacingX, spacingY, "3");
+ } else if (indicatorCount == 2) {
+ complicationIndex = "Complication_I" + isWithin(co_ords[0], co_ords[1], locX, locY - spacingY / 2, spacingX, spacingY, "1") + isWithin(co_ords[0], co_ords[1], locX, locY + spacingY / 2, spacingX, spacingY, "2");
+ } else if (indicatorCount == 1) {
+ complicationIndex = "Complication_I" + isWithin(co_ords[0], co_ords[1], locX, locY, spacingX, spacingY, "1");
+ }
+
+ if (complicationIndex.equals("Complication_I") == false) {
+ complicationId = Storage.getValue(complicationIndex);
+ }
+
+ //DEBUG*/ logMessage(complicationIndex + " = " + complicationId);
+ if (complicationId != null) {
+ return complicationId;
+ }
+ }
+ }
+
+ // Check the fields
+ var fieldCount = $.getIntProperty("FieldCount", 3);
+
+ if (fieldCount > 0) {
+ spacingX = Sys.getDeviceSettings().screenWidth / (2 * fieldCount);
+ spacingY = Sys.getDeviceSettings().screenHeight / 4;
+
+ var left = mView.mDataFields.mLeft;
+ var right = mView.mDataFields.mRight;
+ var top = mView.mDataFields.mTop;
+
+ if (left != null && right != null && top != null) {
+ if (fieldCount == 3) {
+ complicationIndex = "Complication_F" + isWithin(co_ords[0], co_ords[1], left - spacingX / 2, top - spacingY / 2, spacingX, spacingY, "1") + isWithin(co_ords[0], co_ords[1], (right + left) / 2 - spacingX / 2, top - spacingY /2, spacingX, spacingY, "2") + isWithin(co_ords[0], co_ords[1], right - spacingX / 2, top - spacingY / 2, spacingX, spacingY, "3");
+ } else if (fieldCount == 2) {
+ complicationIndex = "Complication_F" + isWithin(co_ords[0], co_ords[1], left + ((right - left) * 0.15) - spacingX / 2, top - spacingY / 2, spacingX, spacingY, "1") + isWithin(co_ords[0], co_ords[1], left + ((right - left) * 0.85) - spacingX / 2, top - spacingY / 2, spacingX, spacingY, "2");
+ } else if (fieldCount == 1) {
+ complicationIndex = "Complication_F" + isWithin(co_ords[0], co_ords[1], (right + left) / 2 - spacingX / 2, top - spacingY / 2, spacingX, spacingY, "1");
+ }
+
+ if (complicationIndex.equals("Complication_F") == false) {
+ complicationId = Storage.getValue(complicationIndex);
+ }
+
+ //DEBUG*/ logMessage(complicationIndex + " = " + complicationId);
+ if (complicationId != null) {
+ return complicationId;
+ }
+ }
+ }
+
+ // Check the goals
+ spacingX = Sys.getDeviceSettings().screenWidth / 11;
+ spacingY = Sys.getDeviceSettings().screenHeight / 6;
+
+ var left = mView.mDrawables[:DataArea].mGoalIconLeftX - spacingX / 8;
+ var right = mView.mDrawables[:DataArea].mGoalIconRightX + spacingX / 8;
+ var y = mView.mDrawables[:DataArea].mGoalIconY - spacingY / 8;
+
+ if (left != null && right != null && y != null) {
+ // spacing * 3 to give it more room so we can press on the text too.
+ complicationIndex = "Complication_G" + isWithin(co_ords[0], co_ords[1], left, y, spacingX * 3, spacingY, "1") + isWithin(co_ords[0], co_ords[1], right - spacingX * 3, y, spacingX * 3, spacingY, "2");
+ if (complicationIndex.equals("Complication_G") == false) {
+ complicationId = Storage.getValue(complicationIndex);
+ }
+
+ //DEBUG*/ logMessage(complicationIndex + " = " + complicationId);
+ if (complicationId != null) {
+ return complicationId;
+ }
+ }
+
+ // Check Movebar
+ if ($.getIntProperty("MoveBarStyle", 0) == 2) { // Only matters if we're showing the recovery time
+ var x = mView.mDrawables[:MoveBar];
+ x = x.mX;
+ y = mView.mDrawables[:MoveBar].mY;
+ var width = mView.mDrawables[:MoveBar].width;
+ var height = mView.mDrawables[:MoveBar].height;
+ y -= height * 2;
+ complicationIndex = "Complication_MB" + isWithin(co_ords[0], co_ords[1], x, y, width, height * 4, "1");
+ if (complicationIndex.equals("Complication_MB") == false) {
+ complicationId = Storage.getValue(complicationIndex);
+ }
+
+ //DEBUG*/ logMessage(complicationIndex + " = " + complicationId);
+ if (complicationId != null) {
+ return complicationId;
+ }
+ }
+ return null;
+ }
+
+ function isWithin(x, y, startX, startY, spacingX, spacingY, field) {
+ if (x > startX && x < startX + spacingX && y > startY and y < startY + spacingY) {
+ //DEBUG*/ logMessage("True: " + x + "/" + y + " is within " + startX + "/" + startY + " and " + (startX + spacingX).toString() + "/" + (startY + spacingY).toString());
+ return field;
+ }
+ else {
+ //DEBUG*/ logMessage("False: " + x + "/" + y + " is NOT within " + startX + "/" + startY + " and " + (startX + spacingX).toString() + "/" + (startY + spacingY).toString());
+ return "";
+ }
+ }
+
+ //! The onPowerBudgetExceeded callback is called by the system if the
+ //! onPartialUpdate method exceeds the allowed power budget. If this occurs,
+ //! the system will stop invoking onPartialUpdate each second, so we notify the
+ //! view here to let the rendering methods know they should not be rendering a
+ //! second hand.
+ //! @param powerInfo Information about the power budget
+ public function onPowerBudgetExceeded(powerInfo as WatchFacePowerInfo) as Void {
+ //DEBUG*/ logMessage("Average execution time: " + powerInfo.executionTimeAverage);
+ //DEBUG*/ logMessage("Allowed execution time: " + powerInfo.executionTimeLimit);
+ //mView.turnPartialUpdatesOff();
+ }
}
diff --git a/source/DataArea.mc b/source/DataArea.mc
index 078f07b5..5f456c8e 100644
--- a/source/DataArea.mc
+++ b/source/DataArea.mc
@@ -4,29 +4,37 @@ using Toybox.Application as App;
using Toybox.System as Sys;
using Toybox.Time;
using Toybox.Time.Gregorian;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
class DataArea extends Ui.Drawable {
+ private var mRowMY;
+ private var mRow0Y;
private var mRow1Y;
private var mRow2Y;
private var mLeftGoalType;
private var mLeftGoalIsValid;
+ private var mLeftGoalstaled;
private var mLeftGoalCurrent;
private var mLeftGoalMax;
private var mRightGoalType;
private var mRightGoalIsValid;
+ private var mRightGoalstaled;
private var mRightGoalCurrent;
private var mRightGoalMax;
- private var mGoalIconY;
- private var mGoalIconLeftX;
- private var mGoalIconRightX;
+ var mGoalIconY;
+ var mGoalIconLeftX;
+ var mGoalIconRightX;
function initialize(params) {
Drawable.initialize(params);
+ mRowMY = params[:rowMY];
+ mRow0Y = params[:row0Y];
mRow1Y = params[:row1Y];
mRow2Y = params[:row2Y];
@@ -38,107 +46,156 @@ class DataArea extends Ui.Drawable {
function setGoalValues(leftType, leftValues, rightType, rightValues) {
mLeftGoalType = leftType;
mLeftGoalIsValid = leftValues[:isValid];
+ mLeftGoalstaled = leftValues[:staled];
- if (leftValues[:isValid]) {
+ if (leftValues[:isValid] && (leftValues[:current] instanceof Lang.Number || leftValues[:current] instanceof Lang.Float) && (leftValues[:max] instanceof Lang.Number || leftValues[:max] instanceof Lang.Float) ) {
mLeftGoalCurrent = leftValues[:current].format(INTEGER_FORMAT);
- mLeftGoalMax = (mLeftGoalType == GOAL_TYPE_BATTERY) ? "%" : leftValues[:max].format(INTEGER_FORMAT);
+ mLeftGoalMax = (mLeftGoalType == GOAL_TYPE_BATTERY || mLeftGoalType == GOAL_TYPE_BODY_BATTERY || mLeftGoalType == GOAL_TYPE_STRESS_LEVEL) ? "%" : leftValues[:max].format(INTEGER_FORMAT);
} else {
+ if (leftValues[:isValid]) {
+ //DEBUG*/ logMessage("Should have been screened, why invalid? " + leftValues[:current] + " - " + leftValues[:max]);
+ }
mLeftGoalCurrent = null;
mLeftGoalMax = null;
}
mRightGoalType = rightType;
mRightGoalIsValid = rightValues[:isValid];
+ mRightGoalstaled = leftValues[:staled];
- if (rightValues[:isValid]) {
+ if (rightValues[:isValid] && (rightValues[:current] instanceof Lang.Number || rightValues[:current] instanceof Lang.Float) && (rightValues[:max] instanceof Lang.Number || rightValues[:max] instanceof Lang.Float) ) {
mRightGoalCurrent = rightValues[:current].format(INTEGER_FORMAT);
- mRightGoalMax = (mRightGoalType == GOAL_TYPE_BATTERY) ? "%" : rightValues[:max].format(INTEGER_FORMAT);
+ mRightGoalMax = (mRightGoalType == GOAL_TYPE_BATTERY || mRightGoalType == GOAL_TYPE_BODY_BATTERY || mRightGoalType == GOAL_TYPE_STRESS_LEVEL) ? "%" : rightValues[:max].format(INTEGER_FORMAT);
} else {
+ if (rightValues[:isValid]) {
+ //DEBUG*/ logMessage("Should have been screened, why invalid? " + rightValues[:current] + " - " + rightValues[:max]);
+ }
mRightGoalCurrent = null;
mRightGoalMax = null;
}
}
function draw(dc) {
- drawGoalIcon(dc, mGoalIconLeftX, mLeftGoalType, mLeftGoalIsValid, Graphics.TEXT_JUSTIFY_LEFT);
- drawGoalIcon(dc, mGoalIconRightX, mRightGoalType, mRightGoalIsValid, Graphics.TEXT_JUSTIFY_RIGHT);
+ drawGoalIcon(dc, mGoalIconLeftX, mLeftGoalType, mLeftGoalIsValid, mLeftGoalstaled, Graphics.TEXT_JUSTIFY_LEFT);
+ drawGoalIcon(dc, mGoalIconRightX, mRightGoalType, mRightGoalIsValid, mRightGoalstaled, Graphics.TEXT_JUSTIFY_RIGHT);
- var city = App.getApp().getProperty("LocalTimeInCity");
+ var view = App.getApp().getView();
+ var city = view.mWeatherStationName;
+ var linePos = [ mRowMY, mRow0Y, mRow1Y, mRow2Y ];
+ var linePosIndex = 0;
+ var moveBarStyle = $.getIntProperty("MoveBarStyle", 0);
- // #78 Setting with value of empty string may cause corresponding property to be null.
- if ((city != null) && (city.length() != 0)) {
- //drawTimeZone();
- var cityLocalTime = App.getApp().getProperty("CityLocalTime");
-
- // If available, use city returned from web request; otherwise, use raw city from settings.
- // N.B. error response will NOT contain city.
- if ((cityLocalTime != null) && (cityLocalTime["city"] != null)) {
- city = cityLocalTime["city"];
- }
+ if (moveBarStyle != 3) {
+ linePosIndex++;
+ }
- // Time zone 1 city.
+ // Weather Station name removed from firmware
+ var showWeatherCityName = false;
+ if (view.mShowWeatherStationName && city != null && city.length() > 0) {
+ showWeatherCityName = true;
dc.setColor(gMonoDarkColour, Gfx.COLOR_TRANSPARENT);
dc.drawText(
locX + (width / 2),
- mRow1Y,
+ linePos[linePosIndex],
gNormalFont,
// Limit string length.
- city.substring(0, 10),
+ city.substring(0, 16),
Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER
);
- // Time zone 1 time.
+ linePosIndex++;
+ }
+
+ // #78 Setting with value of empty string may cause corresponding property to be null.
+ city = view.mLocalCityName;
+ if (city != null && city.length() > 0) {
+ // Get Time based on Lat/Long
var time;
- if (cityLocalTime) {
+ if (view.mLocalCityLat != null && view.mLocalCityLat >= -90.0 && view.mLocalCityLat <= 90.0 && view.mLocalCityLon != null && view.mLocalCityLon >= -180.0 && view.mLocalCityLon <= 180.0) {
+ try {
+ var where = new Position.Location({
+ :latitude => view.mLocalCityLat,
+ :longitude => view.mLocalCityLon,
+ :format => :degrees
+ });
- // Web request responded with server error e.g. unknown city.
- if (cityLocalTime["error"] != null) {
- time = "???";
+ var local = Gregorian.localMoment(where, Time.now());
+ local = Gregorian.info(local, Time.FORMAT_SHORT);
- // Web request responded with time zone data for city.
- } else {
- var timeZoneGmtOffset;
-
- // Use next GMT offset if it's now applicable (new data will be requested shortly).
- if ((cityLocalTime["next"] != null) && (Time.now().value() >= cityLocalTime["next"]["when"])) {
- timeZoneGmtOffset = cityLocalTime["next"]["gmtOffset"];
- } else {
- timeZoneGmtOffset = cityLocalTime["current"]["gmtOffset"];
- }
- timeZoneGmtOffset = new Time.Duration(timeZoneGmtOffset);
-
- var localGmtOffset = Sys.getClockTime().timeZoneOffset;
- localGmtOffset = new Time.Duration(localGmtOffset);
-
- // (Local time) - (Local GMT offset) + (Time zone GMT offset)
- time = Time.now().subtract(localGmtOffset).add(timeZoneGmtOffset);
- time = Gregorian.info(time, Time.FORMAT_SHORT);
- time = App.getApp().getFormattedTime(time.hour, time.min);
+ time = $.getFormattedTime(local.hour, local.min, local.sec);
time = time[:hour] + ":" + time[:min] + time[:amPm];
}
-
- // Awaiting response to web request sent by BackgroundService.
- } else {
- time = "...";
+ catch (e) {
+ time = "???";
+ }
+ }
+ else {
+ time = "INV";
}
- dc.setColor(gMonoLightColour, Gfx.COLOR_TRANSPARENT);
- dc.drawText(
- locX + (width / 2),
- mRow2Y,
- gNormalFont,
- time,
- Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER
- );
+ if (showWeatherCityName && moveBarStyle != 3 || !showWeatherCityName && moveBarStyle == 3) { // Need to do two lines since we'll overflow too much on our goals' value or use two lines if it's only us drawing there
+ dc.setColor(gMonoDarkColour, Gfx.COLOR_TRANSPARENT);
+ dc.drawText(
+ locX + (width / 2),
+ linePos[linePosIndex],
+ gNormalFont,
+ // Limit string length.
+ city.substring(0, 10),
+ Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER
+ );
- } else {
- drawGoalValues(dc, locX, mLeftGoalCurrent, mLeftGoalMax, Graphics.TEXT_JUSTIFY_LEFT);
- drawGoalValues(dc, locX + width, mRightGoalCurrent, mRightGoalMax, Graphics.TEXT_JUSTIFY_RIGHT);
+ dc.setColor(gMonoLightColour, Gfx.COLOR_TRANSPARENT);
+ dc.drawText(
+ locX + (width / 2),
+ linePos[linePosIndex + 1],
+ gNormalFont,
+ time,
+ Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+ }
+ else { // Have both name and time on same line, just below move bar
+ var cityName = city.substring(0, 10) + " ";
+ var line = cityName + time;
+ var sizeFull = dc.getTextWidthInPixels(line, gNormalFont);
+ var sizeName = dc.getTextWidthInPixels(cityName, gNormalFont);
+ var pos1 = locX + (width / 2) - (sizeFull / 2);
+ var pos2 = pos1 + sizeName;
+
+ dc.setColor(gMonoDarkColour, Gfx.COLOR_TRANSPARENT);
+ dc.drawText(
+ pos1,
+ linePos[linePosIndex],
+ gNormalFont,
+ cityName,
+ Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+ dc.setColor(gMonoLightColour, Gfx.COLOR_TRANSPARENT);
+ dc.drawText(
+ pos2,
+ linePos[linePosIndex],
+ gNormalFont,
+ time,
+ Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+ }
}
+
+ drawGoalValues(dc, locX, mLeftGoalCurrent, mLeftGoalMax, Graphics.TEXT_JUSTIFY_LEFT);
+ drawGoalValues(dc, locX + width, mRightGoalCurrent, mRightGoalMax, Graphics.TEXT_JUSTIFY_RIGHT);
+
+ /*var spacingX = Sys.getDeviceSettings().screenWidth / 11;
+ var spacingY = Sys.getDeviceSettings().screenHeight / 6;
+
+ var left = mGoalIconLeftX - spacingX / 8;
+ var right = mGoalIconRightX + spacingX / 8;
+ var y = mGoalIconY - spacingY / 8;
+
+ dc.drawRectangle(left, y, spacingX * 3, spacingY);
+ dc.drawRectangle(right - spacingX * 3, y, spacingX * 3, spacingY);*/
}
- function drawGoalIcon(dc, x, type, isValid, align) {
+ function drawGoalIcon(dc, x, type, isValid, staled, align) {
if (type == GOAL_TYPE_OFF) {
return;
}
@@ -146,12 +203,15 @@ class DataArea extends Ui.Drawable {
var icon = {
GOAL_TYPE_BATTERY => "9",
GOAL_TYPE_CALORIES => "6",
+ GOAL_TYPE_ACTIVE_CALORIES => "H",
GOAL_TYPE_STEPS => "0",
GOAL_TYPE_FLOORS_CLIMBED => "1",
GOAL_TYPE_ACTIVE_MINUTES => "2",
+ GOAL_TYPE_BODY_BATTERY => "E", // SG Addition
+ GOAL_TYPE_STRESS_LEVEL => "G", // SG Addition
}[type];
- dc.setColor(isValid ? gThemeColour : gMeterBackgroundColour, Gfx.COLOR_TRANSPARENT);
+ dc.setColor(isValid && !staled ? gThemeColour : gMeterBackgroundColour, Gfx.COLOR_TRANSPARENT);
dc.drawText(
x,
mGoalIconY,
@@ -162,7 +222,8 @@ class DataArea extends Ui.Drawable {
}
function drawGoalValues(dc, x, currentValue, maxValue, align) {
- var digitStyle = App.getApp().getProperty("GoalMeterDigitsStyle");
+ //DEBUG*/ var myStats = Sys.getSystemStats(); logMessage("Total memory: " + myStats.totalMemory + " Used memory: " + myStats.usedMemory + " Free memory: " + myStats.freeMemory);
+ var digitStyle = App.getApp().getView().mDigitStyle;
// #107 Only draw values if digit style is not Hidden.
if (digitStyle != 2 /* HIDDEN */) {
diff --git a/source/DataFields.mc b/source/DataFields.mc
index 2f2cf216..83147466 100644
--- a/source/DataFields.mc
+++ b/source/DataFields.mc
@@ -5,9 +5,12 @@ using Toybox.Application as App;
using Toybox.Activity as Activity;
using Toybox.ActivityMonitor as ActivityMonitor;
using Toybox.SensorHistory as SensorHistory;
-
+using Toybox.Math;
using Toybox.Time;
using Toybox.Time.Gregorian;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
+using Toybox.Complications;
enum /* FIELD_TYPES */ {
// Pseudo-fields.
@@ -16,26 +19,33 @@ enum /* FIELD_TYPES */ {
// Real fields (used by properties).
FIELD_TYPE_HEART_RATE = 0,
- FIELD_TYPE_BATTERY,
- FIELD_TYPE_NOTIFICATIONS,
- FIELD_TYPE_CALORIES,
- FIELD_TYPE_DISTANCE,
- FIELD_TYPE_ALARMS,
- FIELD_TYPE_ALTITUDE,
- FIELD_TYPE_TEMPERATURE,
- FIELD_TYPE_BATTERY_HIDE_PERCENT,
- FIELD_TYPE_HR_LIVE_5S,
- FIELD_TYPE_SUNRISE_SUNSET,
- FIELD_TYPE_WEATHER,
- FIELD_TYPE_PRESSURE,
- FIELD_TYPE_HUMIDITY
+ FIELD_TYPE_BATTERY, // 1
+ FIELD_TYPE_NOTIFICATIONS, // 2
+ FIELD_TYPE_CALORIES, // 3
+ FIELD_TYPE_DISTANCE, // 4
+ FIELD_TYPE_ALARMS, // 5
+ FIELD_TYPE_ALTITUDE, // 6
+ FIELD_TYPE_TEMPERATURE, // 7
+ FIELD_TYPE_BATTERY_HIDE_PERCENT, // 8
+ FIELD_TYPE_HR_LIVE_5S, // 9
+ FIELD_TYPE_SUNRISE_SUNSET, // 10
+ FIELD_TYPE_WEATHER, // 11
+ FIELD_TYPE_PRESSURE, // 12
+ FIELD_TYPE_HUMIDITY, // 13
+ FIELD_TYPE_PULSE_OX, // 14
+ FIELD_FLOOR_CLIMBED, // 15
+ FIELD_SOLAR_INTENSITY, // 16
+ FIELD_BODY_BATTERY, // 17
+ FIELD_RECOVERY_TIME, // 18
+ FIELD_STRESS_LEVEL, // 19
+ FIELD_TYPE_ACTIVE_CALORIES, // 20
}
class DataFields extends Ui.Drawable {
- private var mLeft;
- private var mRight;
- private var mTop;
+ var mLeft;
+ var mRight;
+ var mTop;
private var mBottom;
private var mWeatherIconsFont;
@@ -46,7 +56,7 @@ class DataFields extends Ui.Drawable {
private var mWasHRAvailable = false; // HR availability at last full draw (in high power mode).
private var mMaxFieldLength; // Maximum number of characters per field.
private var mBatteryWidth; // Width of battery meter.
-
+ private var mWeather;
// private const CM_PER_KM = 100000;
// private const MI_PER_KM = 0.621371;
// private const FT_PER_M = 3.28084;
@@ -66,36 +76,91 @@ class DataFields extends Ui.Drawable {
}
// Cache FieldCount setting, and determine appropriate maximum field length.
+ (:noComplications)
function onSettingsChanged() {
+ var view = App.getApp().getView();
// #123 Protect against null or unexpected type e.g. String.
- mFieldCount = App.getApp().getIntProperty("FieldCount", 3);
+ mFieldCount = $.getIntProperty("FieldCount", 3);
- /* switch (mFieldCount) {
- case 3:
- mMaxFieldLength = 4;
- break;
- case 2:
- mMaxFieldLength = 6;
- break;
- case 1:
- mMaxFieldLength = 8;
- break;
- } */
+ // #116 Handle FieldCount = 0 correctly.
+ mMaxFieldLength = [0, 8, 6, 4][mFieldCount];
+
+ mHasLiveHR = view.hasField(FIELD_TYPE_HR_LIVE_5S);
+
+ if (!view.hasField(FIELD_TYPE_WEATHER)) {
+ mWeatherIconsFont = null;
+ mWeatherIconsSubset = null;
+ }
+ }
+
+ (:hasComplications)
+ function onSettingsChanged() {
+ var view = App.getApp().getView();
+
+ // #123 Protect against null or unexpected type e.g. String.
+ mFieldCount = $.getIntProperty("FieldCount", 3);
// #116 Handle FieldCount = 0 correctly.
mMaxFieldLength = [0, 8, 6, 4][mFieldCount];
- mHasLiveHR = App.getApp().hasField(FIELD_TYPE_HR_LIVE_5S);
+ mHasLiveHR = view.hasField(FIELD_TYPE_HR_LIVE_5S);
- if (!App.getApp().hasField(FIELD_TYPE_WEATHER)) {
+ if (!view.hasField(FIELD_TYPE_WEATHER)) {
mWeatherIconsFont = null;
mWeatherIconsSubset = null;
}
+
+ if (Toybox has :Complications && view.useComplications()) {
+ var complications = [{"type" => FIELD_BODY_BATTERY, "complicationType" => Complications.COMPLICATION_TYPE_BODY_BATTERY},
+ {"type" => FIELD_STRESS_LEVEL, "complicationType" => Complications.COMPLICATION_TYPE_STRESS},
+ {"type" => FIELD_FLOOR_CLIMBED, "complicationType" => Complications.COMPLICATION_TYPE_FLOORS_CLIMBED},
+ {"type" => FIELD_TYPE_PULSE_OX, "complicationType" => Complications.COMPLICATION_TYPE_PULSE_OX},
+ {"type" => FIELD_TYPE_HEART_RATE, "complicationType" => Complications.COMPLICATION_TYPE_HEART_RATE},
+ {"type" => FIELD_TYPE_HR_LIVE_5S, "complicationType" => Complications.COMPLICATION_TYPE_HEART_RATE},
+ {"type" => FIELD_RECOVERY_TIME, "complicationType" => Complications.COMPLICATION_TYPE_RECOVERY_TIME},
+ {"type" => FIELD_TYPE_ALTITUDE, "complicationType" => Complications.COMPLICATION_TYPE_ALTITUDE},
+ {"type" => FIELD_TYPE_WEATHER, "complicationType" => Complications.COMPLICATION_TYPE_CURRENT_WEATHER}, // Only for onPress. We do nothing with what is returned since it's missing the temperature. Adding it would require a too big change and extra space in App class for basically no gain
+ {"type" => FIELD_TYPE_SUNRISE_SUNSET, "complicationType" => Complications.COMPLICATION_TYPE_SUNRISE}, // Only for onPress. We do nothing with what is returned since it's missing the temperature. Adding it would require a too big change and extra space in App class for basically no gain
+ {"type" => FIELD_TYPE_CALORIES, "complicationType" => Complications.COMPLICATION_TYPE_CALORIES},
+ {"type" => FIELD_TYPE_ACTIVE_CALORIES, "complicationType" => Complications.COMPLICATION_TYPE_CALORIES},
+ {"type" => FIELD_TYPE_BATTERY, "complicationType" => Complications.COMPLICATION_TYPE_BATTERY}
+ ];
+
+ var fieldTypes = view.mFieldTypes;
+ var filled = [false, false, false];
+ var i;
+
+ for (i = 0; i < complications.size(); i++) {
+ if (view.hasField(complications[i].get("type"))) {
+ for (var j = 0; j < mFieldCount; j++) {
+ if (fieldTypes[j].get("type") == complications[i].get("type")) {
+ $.updateComplications("", "Complication_F", j + 1, complications[i].get("complicationType"));
+ fieldTypes[j].put("ComplicationType", complications[i].get("complicationType"));
+ filled[j] = true;
+ }
+ }
+ }
+ }
+
+ // Now delete any fields that doesn't have a Complication
+ for (i = 1; i < 4; i++) {
+ if (filled[i - 1] == false) {
+ Storage.deleteValue("Complication_F" + i);
+ }
+ }
+ }
}
function draw(dc) {
- update(dc, /* isPartialUpdate */ false);
+ // I'm getting wierd crashes on AMOLED watchs as if some of the fields of the datafields drawable aren't initialized. Only thing in common is AoD.
+ // Therefore added a check to make sure we aren't drawing will if are or were in burnin protection.
+ if (!App.getApp().getView().burnInProtectionIsOrWasActive()) {
+ update(dc, /* isPartialUpdate */ false);
+ }
+ else {
+ //DEBUG*/ logMessage("datafields draw Skipping because of burning protections");
+ }
}
function update(dc, isPartialUpdate) {
@@ -103,20 +168,33 @@ class DataFields extends Ui.Drawable {
return;
}
- var fieldTypes = App.getApp().mFieldTypes;
+ var fieldTypes = App.getApp().getView().mFieldTypes;
+
+ /*var spacingX = Sys.getDeviceSettings().screenWidth / (2 * mFieldCount);
+ var spacingY = Sys.getDeviceSettings().screenHeight / 4;
+
+ var left = mLeft;
+ var right = mRight;
+ var top = mTop;*/
switch (mFieldCount) {
case 3:
- drawDataField(dc, isPartialUpdate, fieldTypes[0], mLeft);
- drawDataField(dc, isPartialUpdate, fieldTypes[1], (mRight + mLeft) / 2);
- drawDataField(dc, isPartialUpdate, fieldTypes[2], mRight);
+ drawDataField(dc, isPartialUpdate, fieldTypes[0].get("type"), mLeft, 0);
+ drawDataField(dc, isPartialUpdate, fieldTypes[1].get("type"), (mRight + mLeft) / 2, 1);
+ drawDataField(dc, isPartialUpdate, fieldTypes[2].get("type"), mRight, 2);
+ // dc.drawRectangle(left - spacingX / 2, top - spacingY / 2, spacingX, spacingY);
+ // dc.drawRectangle((right + left) / 2 - spacingX / 2, top - spacingY /2, spacingX, spacingY);
+ // dc.drawRectangle(right - spacingX / 2, top - spacingY / 2, spacingX, spacingY);
break;
case 2:
- drawDataField(dc, isPartialUpdate, fieldTypes[0], mLeft + ((mRight - mLeft) * 0.15));
- drawDataField(dc, isPartialUpdate, fieldTypes[1], mLeft + ((mRight - mLeft) * 0.85));
+ drawDataField(dc, isPartialUpdate, fieldTypes[0].get("type"), mLeft + ((mRight - mLeft) * 0.15), 0);
+ drawDataField(dc, isPartialUpdate, fieldTypes[1].get("type"), mLeft + ((mRight - mLeft) * 0.85), 1);
+ // dc.drawRectangle(left + ((right - left) * 0.15) - spacingX / 2, top - spacingY / 2, spacingX, spacingY);
+ // dc.drawRectangle(left + ((right - left) * 0.85) - spacingX / 2, top - spacingY / 2, spacingX, spacingY);
break;
case 1:
- drawDataField(dc, isPartialUpdate, fieldTypes[0], (mRight + mLeft) / 2);
+ drawDataField(dc, isPartialUpdate, fieldTypes[0].get("type"), (mRight + mLeft) / 2, 0);
+ // dc.drawRectangle((right + left) / 2 - spacingX / 2, top - spacingY / 2, spacingX, spacingY);
break;
/*
case 0:
@@ -128,7 +206,7 @@ class DataFields extends Ui.Drawable {
// Both regular and small icon fonts use same spot size for easier optimisation.
//private const LIVE_HR_SPOT_RADIUS = 3;
- private function drawDataField(dc, isPartialUpdate, fieldType, x) {
+ private function drawDataField(dc, isPartialUpdate, fieldType, x, index) {
// Assume we're only drawing live HR spot every 5 seconds; skip all other partial updates.
var isLiveHeartRate = (fieldType == FIELD_TYPE_HR_LIVE_5S);
@@ -161,8 +239,9 @@ class DataFields extends Ui.Drawable {
}
// 1. Value: draw first, as top of text overlaps icon.
- var result = getValueForFieldType(fieldType);
+ var result = getValueForFieldType(fieldType, index);
var value = result["value"];
+ var stale = result["stale"];
// Optimisation: if live HR remains unavailable, skip the rest of this partial update.
var isHRAvailable = isHeartRate && (value.length() != 0);
@@ -196,11 +275,11 @@ class DataFields extends Ui.Drawable {
// Grey out icon if no value was retrieved.
// #37 Do not grey out battery icon (getValueForFieldType() returns empty string).
- var colour = (value.length() == 0) ? gMeterBackgroundColour : gThemeColour;
+ var colour = (value.length() == 0 || stale) ? gMeterBackgroundColour : gThemeColour;
// Battery.
if ((fieldType == FIELD_TYPE_BATTERY) || (fieldType == FIELD_TYPE_BATTERY_HIDE_PERCENT)) {
- drawBatteryMeter(dc, x, mTop, mBatteryWidth, mBatteryWidth / 2);
+ $.drawBatteryMeter(dc, x, mTop, mBatteryWidth, mBatteryWidth / 2);
// #34 Live HR in low power mode.
} else if (isLiveHeartRate && isPartialUpdate) {
@@ -316,6 +395,13 @@ class DataFields extends Ui.Drawable {
FIELD_TYPE_SUNRISE_SUNSET => "?",
FIELD_TYPE_PRESSURE => "@",
FIELD_TYPE_HUMIDITY => "A",
+ FIELD_TYPE_PULSE_OX => "B", // SG Addition
+ FIELD_FLOOR_CLIMBED => "1", // SG Addition
+ FIELD_SOLAR_INTENSITY => "D", // SG Addition
+ FIELD_BODY_BATTERY => "E", // SG Addition
+ FIELD_RECOVERY_TIME => "F", // SG Addition
+ FIELD_STRESS_LEVEL => "G", // SG Addition
+ FIELD_TYPE_ACTIVE_CALORIES => "H" // SG Addition
}[fieldType];
}
@@ -351,9 +437,10 @@ class DataFields extends Ui.Drawable {
// Return empty result["value"] string if value cannot be retrieved (e.g. unavailable, or unsupported).
// result["isSunriseNext"] indicates that sunrise icon should be shown for FIELD_TYPE_SUNRISE_SUNSET, rather than default
// sunset icon.
- private function getValueForFieldType(type) {
+ private function getValueForFieldType(type, index) {
var result = {};
var value = "";
+ var stale = false;
var settings = Sys.getDeviceSettings();
@@ -362,24 +449,128 @@ class DataFields extends Ui.Drawable {
var altitude;
var pressure = null; // May never be initialised if no support for pressure (CIQ 1.x devices).
var temperature;
- var weather;
- var weatherValue;
var sunTimes;
var unit;
+ var info;
+ var view = App.getApp().getView();
+ var fieldTypes = view.mFieldTypes;
switch (type) {
+ // SG Addition
+ case FIELD_RECOVERY_TIME:
+ if (Toybox has :Complications && view.useComplications()) {
+ var tmpValue = fieldTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ value = $.MinutesToTimeString(tmpValue);
+ }
+ }
+ info = ActivityMonitor.getInfo();
+ if (value.length() == 0 && info has :timeToRecovery) {
+ var recoveryTyime = info.timeToRecovery;
+ if (recoveryTyime != null) {
+ value = recoveryTyime.format(INTEGER_FORMAT);
+ }
+ }
+ break;
+ // SG Addition
+ case FIELD_BODY_BATTERY:
+ if (Toybox has :Complications && view.useComplications()) {
+ var tmpValue = fieldTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ value = tmpValue.toString();
+ }
+ }
+ if (value.length() == 0 && (Toybox has :SensorHistory) && (Toybox.SensorHistory has :getBodyBatteryHistory)) {
+ var bodyBattery = Toybox.SensorHistory.getBodyBatteryHistory({:period=>1});
+ if (bodyBattery != null) {
+ bodyBattery = bodyBattery.next();
+ }
+ if (bodyBattery !=null) {
+ bodyBattery = bodyBattery.data;
+ }
+ if (bodyBattery != null && bodyBattery >= 0 && bodyBattery <= 100) {
+ value = bodyBattery.format(INTEGER_FORMAT);
+ }
+ }
+ break;
+ // SG Addition
+ case FIELD_STRESS_LEVEL:
+ if (Toybox has :Complications && view.useComplications()) {
+ var tmpValue = fieldTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ value = tmpValue.toString();
+ }
+ }
+ if (value.length() == 0 && (Toybox has :SensorHistory) && (Toybox.SensorHistory has :getStressHistory)) {
+ var stressLevel = Toybox.SensorHistory.getStressHistory({:period=>1});
+ if (stressLevel != null) {
+ stressLevel = stressLevel.next();
+ }
+ if (stressLevel !=null) {
+ stressLevel = stressLevel.data;
+ }
+ if (stressLevel != null && stressLevel >= 0 && stressLevel <= 100) {
+ value = stressLevel.format(INTEGER_FORMAT);
+ }
+ }
+ break;
+ // SG Addition
+ case FIELD_SOLAR_INTENSITY:
+ var stats = Sys.getSystemStats();
+ if (stats has :solarIntensity) {
+ var solarIntensity = stats.solarIntensity;
+ if (solarIntensity != null) {
+ value = solarIntensity.format(INTEGER_FORMAT);
+ }
+ }
+ break;
+ // SG Addition
+ case FIELD_FLOOR_CLIMBED:
+ info = ActivityMonitor.getInfo();
+ if (info has :floorsClimbed) {
+ var climbed = info.floorsClimbed;
+ var goal = info.floorsClimbedGoal;
+ if (climbed != null && goal != null) {
+ value = climbed.format(INTEGER_FORMAT) + "/" + goal.format(INTEGER_FORMAT);
+ }
+ }
+ break;
+ // SG Addition
+ case FIELD_TYPE_PULSE_OX:
+ if (Toybox has :Complications && view.useComplications()) {
+ var tmpValue = fieldTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ value = tmpValue.toString() + "%";
+ }
+ }
+ if (value.length() == 0) {
+ activityInfo = Activity.getActivityInfo();
+ sample = activityInfo != null and activityInfo has :currentOxygenSaturation ? activityInfo.currentOxygenSaturation : null;
+ if (sample != null) {
+ value = sample.format(INTEGER_FORMAT) + "%";
+ }
+ }
+ break;
case FIELD_TYPE_HEART_RATE:
+ if (Toybox has :Complications && view.useComplications()) {
+ var tmpValue = fieldTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ value = tmpValue.toString();
+ }
+ }
+ // Yes, no break. We flow through in case with don't have Complication. FIELD_TYPE_HEART_RATE and FIELD_TYPE_HR_LIVE_5S were doing the same thing
case FIELD_TYPE_HR_LIVE_5S:
// #34 Try to retrieve live HR from Activity::Info, before falling back to historical HR from ActivityMonitor.
- activityInfo = Activity.getActivityInfo();
- sample = activityInfo.currentHeartRate;
- if (sample != null) {
- value = sample.format(INTEGER_FORMAT);
- } else if (ActivityMonitor has :getHeartRateHistory) {
- sample = ActivityMonitor.getHeartRateHistory(1, /* newestFirst */ true)
- .next();
- if ((sample != null) && (sample.heartRate != ActivityMonitor.INVALID_HR_SAMPLE)) {
- value = sample.heartRate.format(INTEGER_FORMAT);
+ if (value.length() == 0) {
+ activityInfo = Activity.getActivityInfo();
+ sample = activityInfo.currentHeartRate;
+ if (sample != null) {
+ value = sample.format(INTEGER_FORMAT);
+ } else if (ActivityMonitor has :getHeartRateHistory) {
+ sample = ActivityMonitor.getHeartRateHistory(1, true).next();
+ if ((sample != null) && (sample.heartRate != ActivityMonitor.INVALID_HR_SAMPLE)) {
+ value = sample.heartRate.format(INTEGER_FORMAT);
+ }
}
}
break;
@@ -400,9 +591,43 @@ class DataFields extends Ui.Drawable {
}
break;
+ // SG Addition
+ case FIELD_TYPE_ACTIVE_CALORIES:
case FIELD_TYPE_CALORIES:
- activityInfo = ActivityMonitor.getInfo();
- value = activityInfo.calories.format(INTEGER_FORMAT);
+ var fromComplication = false;
+ var today = Gregorian.info(Time.now(), Time.FORMAT_MEDIUM);
+ var profile = UserProfile.getProfile();
+ var age = today.year - profile.birthYear;
+ var weight = profile.weight / 1000.0;
+ var restCalories = ((profile.gender == UserProfile.GENDER_MALE) ? 5.2 : -197.6) - 6.116 * age + 7.628 * profile.height + 12.2 * weight;
+ restCalories = Math.round((today.hour * 60 + today.min) * restCalories / 1440 ).toNumber();
+
+ if (Toybox has :Complications && view.useComplications()) {
+ var tmpValue = fieldTypes[index].get("ComplicationValue");
+ if (tmpValue != null) {
+ value = tmpValue;
+ fromComplication = true;
+ }
+ }
+
+ if (!fromComplication) {
+ activityInfo = ActivityMonitor.getInfo();
+ value = activityInfo.calories;
+ }
+
+ if (type == FIELD_TYPE_CALORIES) {
+ if (fromComplication) {
+ value += restCalories;
+ }
+ }
+ else {
+ if (!fromComplication) {
+ value -= restCalories;
+ }
+ }
+
+ value = value.format(INTEGER_FORMAT);
+
break;
case FIELD_TYPE_DISTANCE:
@@ -435,17 +660,28 @@ class DataFields extends Ui.Drawable {
// #67 Try to retrieve altitude from current activity, before falling back on elevation history.
// Note that Activity::Info.altitude is supported by CIQ 1.x, but elevation history only on select CIQ 2.x
// devices.
- activityInfo = Activity.getActivityInfo();
- altitude = activityInfo.altitude;
+ if (Toybox has :Complications && view.useComplications()) { // Try Complication first
+ altitude = fieldTypes[index].get("ComplicationValue");
+ }
+ if (altitude == null) {
+ activityInfo = Activity.getActivityInfo();
+ altitude = activityInfo.altitude;
+ }
+
if ((altitude == null) && (Toybox has :SensorHistory) && (Toybox.SensorHistory has :getElevationHistory)) {
- sample = SensorHistory.getElevationHistory({ :period => 1, :order => SensorHistory.ORDER_NEWEST_FIRST })
- .next();
+ sample = SensorHistory.getElevationHistory({ :period => 1, :order => SensorHistory.ORDER_NEWEST_FIRST }).next();
if ((sample != null) && (sample.data != null)) {
altitude = sample.data;
}
}
- if (altitude != null) {
+ if (altitude == null) { // If we didn't get an altitude this time, grab the saved one
+ altitude = Storage.getValue("LastAltitude");
+ } else { // We got altitude info, store it in case we lose it
+ Storage.setValue("LastAltitude", altitude);
+ }
+
+ if (altitude != null) { // If we didn't get an altitude this time, grab the saved one
// Metres (no conversion necessary).
if (settings.elevationUnits == System.UNIT_METRIC) {
unit = "m";
@@ -475,69 +711,95 @@ class DataFields extends Ui.Drawable {
temperature = (temperature * (9.0 / 5)) + 32; // Convert to Farenheit: ensure floating point division.
}
- value = temperature.format(INTEGER_FORMAT) + "°";
+ value = temperature.format(INTEGER_FORMAT) + "";
}
}
break;
case FIELD_TYPE_SUNRISE_SUNSET:
-
- if (gLocationLat != null) {
- var nextSunEvent = 0;
- var now = Gregorian.info(Time.now(), Time.FORMAT_SHORT);
-
- // Convert to same format as sunTimes, for easier comparison. Add a minute, so that e.g. if sun rises at
- // 07:38:17, then 07:38 is already consided daytime (seconds not shown to user).
- now = now.hour + ((now.min + 1) / 60.0);
- //Sys.println(now);
-
- // Get today's sunrise/sunset times in current time zone.
- sunTimes = getSunTimes(gLocationLat, gLocationLng, null, /* tomorrow */ false);
- //Sys.println(sunTimes);
-
- // If sunrise/sunset happens today.
- var sunriseSunsetToday = ((sunTimes[0] != null) && (sunTimes[1] != null));
- if (sunriseSunsetToday) {
-
- // Before sunrise today: today's sunrise is next.
- if (now < sunTimes[0]) {
- nextSunEvent = sunTimes[0];
- result["isSunriseNext"] = true;
+ var weather = Weather.getCurrentConditions();
+ if (weather != null) {
+ var now = Time.now();
+ var myLocation = weather.observationLocationPosition;
+ if (Toybox.Weather has :getSunrise) {
+ var sunrise = Weather.getSunrise(myLocation, now);
+ var sunset = Weather.getSunset(myLocation, now);
- // After sunrise today, before sunset today: today's sunset is next.
- } else if (now < sunTimes[1]) {
- nextSunEvent = sunTimes[1];
+ var sunriseTime = Gregorian.info(sunrise, Time.FORMAT_SHORT);
+ var sunsetTime = Gregorian.info(sunset, Time.FORMAT_SHORT);
- // After sunset today: tomorrow's sunrise (if any) is next.
- } else {
- sunTimes = getSunTimes(gLocationLat, gLocationLng, null, /* tomorrow */ true);
- nextSunEvent = sunTimes[0];
+ var sinceSunrise = sunrise.compare(now);
+ var sinceSunset = now.compare(sunset);
+
+ if (sinceSunrise >= 0 || sinceSunset >= 0) {
result["isSunriseNext"] = true;
+ value = $.getFormattedTime(sunriseTime.hour, sunriseTime.min, sunriseTime.sec);
+ }
+ else {
+ value = $.getFormattedTime(sunsetTime.hour, sunsetTime.min, sunsetTime.sec);
}
+ value = value[:hour] + ":" + value[:min] + value[:amPm];
}
+ else {
+ var myLocationArray = myLocation.toDegrees();
+ var nextSunEvent = 0;
+ now = Gregorian.info(Time.now(), Time.FORMAT_SHORT);
+
+ // Convert to same format as sunTimes, for easier comparison. Add a minute, so that e.g. if sun rises at
+ // 07:38:17, then 07:38 is already consided daytime (seconds not shown to user).
+ now = now.hour + ((now.min + 1) / 60.0);
+ //logMessage(now);
+
+ // Get today's sunrise/sunset times in current time zone.
+ sunTimes = getSunTimes(myLocationArray[0], myLocationArray[1], null, /* tomorrow */ false);
+ //logMessage(sunTimes);
+
+ // If sunrise/sunset happens today.
+ var sunriseSunsetToday = ((sunTimes[0] != null) && (sunTimes[1] != null));
+ if (sunriseSunsetToday) {
+
+ // Before sunrise today: today's sunrise is next.
+ if (now < sunTimes[0]) {
+ nextSunEvent = sunTimes[0];
+ result["isSunriseNext"] = true;
+
+ // After sunrise today, before sunset today: today's sunset is next.
+ } else if (now < sunTimes[1]) {
+ nextSunEvent = sunTimes[1];
+
+ // After sunset today: tomorrow's sunrise (if any) is next.
+ } else {
+ sunTimes = getSunTimes(myLocationArray[0], myLocationArray[1], null, /* tomorrow */ true);
+ nextSunEvent = sunTimes[0];
+ result["isSunriseNext"] = true;
+ }
+ }
- // Sun never rises/sets today.
- if (!sunriseSunsetToday) {
- value = "---";
+ // Sun never rises/sets today.
+ if (!sunriseSunsetToday) {
+ value = "---";
- // Sun never rises: sunrise is next, but more than a day from now.
- if (sunTimes[0] == null) {
- result["isSunriseNext"] = true;
- }
+ // Sun never rises: sunrise is next, but more than a day from now.
+ if (sunTimes[0] == null) {
+ result["isSunriseNext"] = true;
+ }
- // We have a sunrise/sunset time.
- } else {
- var hour = Math.floor(nextSunEvent).toLong() % 24;
- var min = Math.floor((nextSunEvent - Math.floor(nextSunEvent)) * 60); // Math.floor(fractional_part * 60)
- value = App.getApp().getFormattedTime(hour, min);
- value = value[:hour] + ":" + value[:min] + value[:amPm];
+ // We have a sunrise/sunset time.
+ } else {
+ var hour = Math.floor(nextSunEvent).toLong() % 24;
+ var min = Math.floor((nextSunEvent - Math.floor(nextSunEvent)) * 60); // Math.floor(fractional_part * 60)
+ value = App.getApp().getFormattedTime(hour, min, 0);
+ value = value[:hour] + ":" + value[:min] + value[:amPm];
+ }
}
-
- // Waiting for location.
- } else {
- value = "gps?";
}
+ else {
+ value = "???";
+ if (!settings.phoneConnected) {
+ stale = true;
+ }
+ }
break;
case FIELD_TYPE_WEATHER:
@@ -548,38 +810,47 @@ class DataFields extends Ui.Drawable {
result["weatherIcon"] = "01d";
}
- weather = App.getApp().getProperty("OpenWeatherMapCurrent");
-
- // Awaiting location.
- if (gLocationLat == null) {
- value = "gps?";
+ // Only read that dictionnary from Storage if it has changed (or we don't have a local copy), otherwise read our stored weather data
+ if (mWeather == null || Storage.getValue("NewWeatherInfo") != null) {
+ mWeather = Storage.getValue("OpenWeatherMapCurrent");
+ Storage.deleteValue("NewWeatherInfo");
+ //DEBUG*/ logMessage("getValueForFieldType:new weather data: " + mWeather);
+ }
// Stored weather data available.
- } else if (weather != null) {
-
+ if (mWeather != null && mWeather instanceof Lang.Dictionary && mWeather["cod"] == 200) {
// FIELD_TYPE_WEATHER.
if (type == FIELD_TYPE_WEATHER) {
- weatherValue = weather["temp"]; // Celcius.
+ value = mWeather["temp"];
+ try {
+ if (settings.temperatureUnits == System.UNIT_STATUTE) {
+ value = (value * (9.0 / 5)) + 32; // Convert to Farenheit: ensure floating point division.
+ }
- if (settings.temperatureUnits == System.UNIT_STATUTE) {
- weatherValue = (weatherValue * (9.0 / 5)) + 32; // Convert to Farenheit: ensure floating point division.
+ value = value.format(INTEGER_FORMAT) + "°";
}
-
- value = weatherValue.format(INTEGER_FORMAT) + "°";
- result["weatherIcon"] = weather["icon"];
+ catch (e) {
+ //DEBUG*/ logMessage("getValueForFieldType: Caught exception " + e);
+ value = "???";
+ }
+ result["weatherIcon"] = mWeather["icon"];
// FIELD_TYPE_HUMIDITY.
} else {
- weatherValue = weather["humidity"];
- value = weatherValue.format(INTEGER_FORMAT) + "%";
+ value = mWeather["humidity"];
+ value = value.format(INTEGER_FORMAT) + "%";
}
+ }
+ // Didn't receive weather from Garmin
+ else {
+ value = "N/A";
- // Awaiting response.
- } else if ((App.getApp().getProperty("PendingWebRequests") != null) &&
- App.getApp().getProperty("PendingWebRequests")["OpenWeatherMapCurrent"]) {
-
- value = "...";
+ if (!settings.phoneConnected) {
+ stale = true;
+ }
}
+
+ //DEBUG*/ logMessage("getValueForFieldType:Weather value is " + value + " stale is " + stale);
break;
case FIELD_TYPE_PRESSURE:
@@ -612,119 +883,8 @@ class DataFields extends Ui.Drawable {
}
result["value"] = value;
+ result["stale"] = stale;
return result;
}
-
- /**
- * With thanks to ruiokada. Adapted, then translated to Monkey C, from:
- * https://gist.github.com/ruiokada/b28076d4911820ddcbbc
- *
- * Calculates sunrise and sunset in local time given latitude, longitude, and tz.
- *
- * Equations taken from:
- * https://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_Day_Number
- * https://en.wikipedia.org/wiki/Sunrise_equation#Complete_calculation_on_Earth
- *
- * @method getSunTimes
- * @param {Float} lat Latitude of location (South is negative)
- * @param {Float} lng Longitude of location (West is negative)
- * @param {Integer || null} tz Timezone hour offset. e.g. Pacific/Los Angeles is -8 (Specify null for system timezone)
- * @param {Boolean} tomorrow Calculate tomorrow's sunrise and sunset, instead of today's.
- * @return {Array} Returns array of length 2 with sunrise and sunset as floats.
- * Returns array with [null, -1] if the sun never rises, and [-1, null] if the sun never sets.
- */
- private function getSunTimes(lat, lng, tz, tomorrow) {
-
- // Use double precision where possible, as floating point errors can affect result by minutes.
- lat = lat.toDouble();
- lng = lng.toDouble();
-
- var now = Time.now();
- if (tomorrow) {
- now = now.add(new Time.Duration(24 * 60 * 60));
- }
- var d = Gregorian.info(Time.now(), Time.FORMAT_SHORT);
- var rad = Math.PI / 180.0d;
- var deg = 180.0d / Math.PI;
-
- // Calculate Julian date from Gregorian.
- var a = Math.floor((14 - d.month) / 12);
- var y = d.year + 4800 - a;
- var m = d.month + (12 * a) - 3;
- var jDate = d.day
- + Math.floor(((153 * m) + 2) / 5)
- + (365 * y)
- + Math.floor(y / 4)
- - Math.floor(y / 100)
- + Math.floor(y / 400)
- - 32045;
-
- // Number of days since Jan 1st, 2000 12:00.
- var n = jDate - 2451545.0d + 0.0008d;
- //Sys.println("n " + n);
-
- // Mean solar noon.
- var jStar = n - (lng / 360.0d);
- //Sys.println("jStar " + jStar);
-
- // Solar mean anomaly.
- var M = 357.5291d + (0.98560028d * jStar);
- var MFloor = Math.floor(M);
- var MFrac = M - MFloor;
- M = MFloor.toLong() % 360;
- M += MFrac;
- //Sys.println("M " + M);
-
- // Equation of the centre.
- var C = 1.9148d * Math.sin(M * rad)
- + 0.02d * Math.sin(2 * M * rad)
- + 0.0003d * Math.sin(3 * M * rad);
- //Sys.println("C " + C);
-
- // Ecliptic longitude.
- var lambda = (M + C + 180 + 102.9372d);
- var lambdaFloor = Math.floor(lambda);
- var lambdaFrac = lambda - lambdaFloor;
- lambda = lambdaFloor.toLong() % 360;
- lambda += lambdaFrac;
- //Sys.println("lambda " + lambda);
-
- // Solar transit.
- var jTransit = 2451545.5d + jStar
- + 0.0053d * Math.sin(M * rad)
- - 0.0069d * Math.sin(2 * lambda * rad);
- //Sys.println("jTransit " + jTransit);
-
- // Declination of the sun.
- var delta = Math.asin(Math.sin(lambda * rad) * Math.sin(23.44d * rad));
- //Sys.println("delta " + delta);
-
- // Hour angle.
- var cosOmega = (Math.sin(-0.83d * rad) - Math.sin(lat * rad) * Math.sin(delta))
- / (Math.cos(lat * rad) * Math.cos(delta));
- //Sys.println("cosOmega " + cosOmega);
-
- // Sun never rises.
- if (cosOmega > 1) {
- return [null, -1];
- }
-
- // Sun never sets.
- if (cosOmega < -1) {
- return [-1, null];
- }
-
- // Calculate times from omega.
- var omega = Math.acos(cosOmega) * deg;
- var jSet = jTransit + (omega / 360.0);
- var jRise = jTransit - (omega / 360.0);
- var deltaJSet = jSet - jDate;
- var deltaJRise = jRise - jDate;
-
- var tzOffset = (tz == null) ? (Sys.getClockTime().timeZoneOffset / 3600) : tz;
- return [
- /* localRise */ (deltaJRise * 24) + tzOffset,
- /* localSet */ (deltaJSet * 24) + tzOffset
- ];
- }
}
+
diff --git a/source/DateLine.mc b/source/DateLine.mc
index 55400b44..afa0ff9f 100644
--- a/source/DateLine.mc
+++ b/source/DateLine.mc
@@ -87,7 +87,8 @@ class DateLine extends Ui.Drawable {
mMonthString = Ui.loadResource(resourceArray[mMonth - 1]).toUpper();
}
- var day = now.day.format(INTEGER_FORMAT);
+ var day = now.day.format($.getBoolProperty("HideDayLeadingZero", true) ? INTEGER_FORMAT : "%02d");
+
if (mYLine2 != null) {
drawDoubleLine(dc, day);
} else {
diff --git a/source/Global.mc b/source/Global.mc
new file mode 100644
index 00000000..88d40b76
--- /dev/null
+++ b/source/Global.mc
@@ -0,0 +1,709 @@
+using Toybox.WatchUi as Ui;
+using Toybox.Graphics as Graphics;
+using Toybox.System as Sys;
+using Toybox.Application as App;
+using Toybox.ActivityMonitor as ActivityMonitor;
+using Toybox.Communications as Comms;
+using Toybox.Time;
+using Toybox.Time.Gregorian;
+using Toybox.Weather;
+using Toybox.Position;
+using Toybox.SensorHistory as SensorHistory;
+using Toybox.Complications as Complications;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
+using Toybox.Complications;
+using Toybox.Math;
+
+import Toybox.Lang;
+
+// x, y are co-ordinates of centre point.
+// width and height are outer dimensions of battery "body".
+function drawBatteryMeter(dc, x, y, width, height) {
+ dc.setColor(gThemeColour, Graphics.COLOR_TRANSPARENT);
+ dc.setPenWidth(/* BATTERY_LINE_WIDTH */ 2);
+
+ // Body.
+ // drawRoundedRectangle's x and y are top-left corner of middle of stroke.
+ // Bottom-right corner of middle of stroke will be (x + width - 1, y + height - 1).
+ dc.drawRoundedRectangle(
+ x - (width / 2) + /* (BATTERY_LINE_WIDTH / 2) */ 1,
+ y - (height / 2) + /* (BATTERY_LINE_WIDTH / 2) */ 1,
+ width - /* BATTERY_LINE_WIDTH + 1 */ 1,
+ height - /* BATTERY_LINE_WIDTH + 1 */ 1,
+ /* BATTERY_CORNER_RADIUS */ 2 * SCREEN_MULTIPLIER);
+
+ // Head.
+ // fillRectangle() works as expected.
+ dc.fillRectangle(
+ x + (width / 2) + BATTERY_MARGIN,
+ y - (BATTERY_HEAD_HEIGHT / 2),
+ /* BATTERY_HEAD_WIDTH */ 2,
+ BATTERY_HEAD_HEIGHT);
+
+ // Fill.
+ // #8: battery returned as float. Use floor() to match native. Must match getValueForFieldType().
+ var batteryLevel = Math.floor(Sys.getSystemStats().battery);
+
+ // Fill colour based on battery level.
+ var fillColour;
+ if (batteryLevel <= /* BATTERY_LEVEL_CRITICAL */ 10) {
+ fillColour = Graphics.COLOR_RED;
+ } else if (batteryLevel <= /* BATTERY_LEVEL_LOW */ 20) {
+ fillColour = Graphics.COLOR_YELLOW;
+ } else {
+ fillColour = gThemeColour;
+ }
+
+ dc.setColor(fillColour, Graphics.COLOR_TRANSPARENT);
+
+ var lineWidthPlusMargin = (/* BATTERY_LINE_WIDTH */ 2 + BATTERY_MARGIN);
+ var fillWidth = width - (2 * lineWidthPlusMargin);
+ dc.fillRectangle(
+ x - (width / 2) + lineWidthPlusMargin,
+ y - (height / 2) + lineWidthPlusMargin,
+ Math.ceil(fillWidth * (batteryLevel / 100)),
+ height - (2 * lineWidthPlusMargin));
+}
+
+var gToggleCounter = 0; // Used to switch between charge and inside temp
+
+function writeBatteryLevel(dc, x, y, width, height, type) {
+ var batteryLevel;
+ var textColour;
+
+ if (type == 0) { // Standard watch battery is being shown
+ batteryLevel = Math.floor(Sys.getSystemStats().battery);
+
+ if (batteryLevel <= /* BATTERY_LEVEL_CRITICAL */ 10) {
+ textColour = Graphics.COLOR_RED;
+ } else if (batteryLevel <= /* BATTERY_LEVEL_LOW */ 20) {
+ textColour = Graphics.COLOR_YELLOW;
+ } else {
+ textColour = gThemeColour;
+ }
+
+ dc.setColor(textColour, Graphics.COLOR_TRANSPARENT);
+ dc.drawText(x - (width / 2), y - height, gNormalFont, batteryLevel.toNumber().format(INTEGER_FORMAT) + "%", Graphics.TEXT_JUSTIFY_LEFT);
+ }
+//****************************************************************
+//******** REMVOVED THIS SECTION IF TESLA CODE NOT WANTED ********
+//****************************************************************
+ else { // Tesla stuff
+ textColour = Graphics.COLOR_LT_GRAY; // Default in case we get nothing
+
+ var value = "???";
+ var showMode;
+
+ gToggleCounter = (gToggleCounter + 1) & 7; // Increase by one, reset to 0 once 8 is reached. Called every second so incremented every second, giving a two second display of each value
+ showMode = gToggleCounter / 2; // 0-1 is battery, 2-3 Sentry, 4-5 preconditionning, 6-7 is inside temp changed to 0 to 3
+ //DEBUG*/ logMessage("gToggleCounter=" + gToggleCounter + " showMode=" + showMode);
+
+ var teslaInfo = Storage.getValue("TeslaInfo");
+ if (teslaInfo != null) {
+ var httpErrorTesla = teslaInfo.get("httpErrorTesla");
+ var vehicleState = teslaInfo.get("VehicleState");
+ var vehicleOnline = (vehicleState != null && vehicleState.equals("online") == true);
+ //DEBUG*/ logMessage("httpErrorTesla=" + httpErrorTesla + " vehicleState=" + vehicleState + " vehicleOnline=" + vehicleOnline);
+ //DEBUG*/ logMessage("TeslaInfo=" + teslaInfo);
+ // Only specific error are handled, the others are displayed 'as is' in pink
+ if (httpErrorTesla != null && (httpErrorTesla == 200 || httpErrorTesla == 401 || httpErrorTesla == 408)) {
+ if (!vehicleOnline) { // If not online, only show battery and preconditionning (0 and 2)
+ showMode &= 2;
+ //DEBUG*/ logMessage("Not online, showing Bat et P");
+ }
+
+ if (httpErrorTesla == 401) { // No access token, only show the battery (in gray, default above)
+ //DEBUG*/ logMessage("401, sticking to Bat");
+ showMode = 0;
+ }
+ else if (!vehicleOnline || httpErrorTesla == 200) { // Vehicle not online (even if we got a 408, we'll add a "?" after the battery level to show this) or we got valid data. If the vehicle is offline, the line will show gray for stale data
+ //DEBUG*/ logMessage("Showing in theme color");
+ textColour = gThemeColour; // Defaults to theme's color
+ }
+
+ switch (showMode) {
+ case 0:
+ var suffix = "";
+
+ batteryLevel = teslaInfo.get("BatteryLevel");
+ if (batteryLevel != null && batteryLevel != 999) {
+ var chargingState = teslaInfo.get("ChargingState");
+ if (httpErrorTesla != 200 && httpErrorTesla != 408) { // ResponseCode other than 200 and 408 will show a "?" beside thr battery level
+ suffix = "?";
+ }
+ else if (!vehicleOnline) {
+ suffix = "s";
+ }
+ else if (chargingState != null && chargingState.equals("Charging") == true) {
+ suffix = "+";
+ }
+
+ value = batteryLevel + "%" + suffix;
+
+ // If we're in theme's color, reset the color based on battery level, similar to the phone's battery
+ if (batteryLevel <= /* BATTERY_LEVEL_CRITICAL */ 10 && textColour == gThemeColour) {
+ textColour = Graphics.COLOR_RED;
+ } else if (batteryLevel <= /* BATTERY_LEVEL_LOW */ 20 && textColour == gThemeColour) {
+ textColour = Graphics.COLOR_YELLOW;
+ }
+ }
+ else {
+ value = "???%";
+ }
+ break;
+
+ case 1:
+ var sentryEnabled = teslaInfo.get("SentryEnabled");
+ if (sentryEnabled != null && sentryEnabled instanceof Lang.Boolean) {
+ value = (sentryEnabled ? "S on" : "S off");
+ }
+ else {
+ value = "S ???";
+ }
+ break;
+
+ case 2:
+ var precondEnabled = teslaInfo.get("PrecondEnabled");
+ if (precondEnabled != null && precondEnabled instanceof Lang.Boolean) {
+ value = (sentryEnabled ? "P on" : "P off");
+ }
+ else {
+ value = "P ???";
+ }
+ break;
+
+ case 3:
+ var insideTemp = teslaInfo.get("InsideTemp");
+ if (insideTemp != null && insideTemp != 999) {
+ value = (Sys.getDeviceSettings().temperatureUnits == Sys.UNIT_METRIC ? insideTemp.toNumber() + "°C" : ((insideTemp.toNumber() * 9) / 5 + 32).format("%d") + "°F");
+ }
+ else {
+ value = (Sys.getDeviceSettings().temperatureUnits == Sys.UNIT_METRIC ? "???°C" : "???°F");
+ }
+ break;
+ }
+ }
+ else {
+ if (httpErrorTesla != null) {
+ value = httpErrorTesla.toString();
+ }
+ textColour = Graphics.COLOR_PINK; // None handled error
+ }
+ }
+
+ //logMessage("value=" + value);
+ dc.setColor(textColour, Graphics.COLOR_TRANSPARENT);
+ dc.drawText(x - (width / 2), y - height, gNormalFont, value, Graphics.TEXT_JUSTIFY_LEFT );
+ }
+//****************************************************************
+//******************** END OF REMVOVED SECTION *******************
+//****************************************************************
+}
+
+(:noComplications)
+function updateComplications(complicationName, storageName, index, complicationType) {
+}
+
+(:hasComplications)
+function updateComplications(complicationName, storageName, index, complicationType) {
+ if (index == null) {
+ return;
+ }
+
+ if (Toybox has :Complications) {
+ var iter = Complications.getComplications();
+ if (iter == null) {
+ return;
+ }
+
+
+ var complicationId = iter.next();
+
+ while (complicationId != null) {
+ //DEBUG*/logMessage(complicationId.longLabel.toString());
+ var type = complicationId.getType();
+
+ // DEBUG */ if (type == Complications.COMPLICATION_TYPE_HIGH_LOW_TEMPERATURE) { logMessage("Last one before us"); }
+
+ if (type == complicationType && type != Complications.COMPLICATION_TYPE_INVALID) {
+ //DEBUG*/logMessage(complicationId.longLabel.toString() + " available");
+ complicationId = new Complications.Id(complicationType);
+ break;
+ }
+ else if (type == Complications.COMPLICATION_TYPE_INVALID && complicationId.longLabel != null && complicationId.longLabel.equals(complicationName)) {
+ //DEBUG*/logMessage(complicationId.longLabel.toString() + " available");
+ complicationId = complicationId.complicationId;
+ break;
+ }
+
+ complicationId = iter.next();
+ }
+
+ if (complicationId != null) {
+ Storage.setValue(storageName + index, complicationId);
+ try {
+ Complications.subscribeToUpdates(complicationId);
+ }
+ catch (e) {
+ //DEBUG*/ logMessage("Error subscribing to complication " + complicationName);
+ }
+ }
+ }
+}
+
+// Return a formatted time dictionary that respects is24Hour and HideHoursLeadingZero settings.
+// - hour: 0-23.
+// - min: 0-59.
+// - sec: 0-59
+function getFormattedTime(hour, min, sec) {
+ var amPm = "";
+
+ if (!Sys.getDeviceSettings().is24Hour) {
+
+ // #6 Ensure noon is shown as PM.
+ var isPm = (hour >= 12);
+ if (isPm) {
+
+ // But ensure noon is shown as 12, not 00.
+ if (hour > 12) {
+ hour = hour - 12;
+ }
+ amPm = "p";
+ } else {
+
+ // #27 Ensure midnight is shown as 12, not 00.
+ if (hour == 0) {
+ hour = 12;
+ }
+ amPm = "a";
+ }
+ }
+
+ // #10 If in 12-hour mode with Hide Hours Leading Zero set, hide leading zero. Otherwise, show leading zero.
+ // #69 Setting now applies to both 12- and 24-hour modes.
+ hour = hour.format($.getBoolProperty("HideHoursLeadingZero", true) ? INTEGER_FORMAT : "%02d");
+
+ return {
+ :hour => hour,
+ :min => min.format("%02d"),
+ :sec => sec.format("%02d"),
+ :amPm => amPm
+ };
+}
+
+function MinutesToTimeString(totalMinutes) {
+ var hours = (totalMinutes / 60).toNumber();
+ var minutes = (totalMinutes - (hours * 60)).toNumber();
+ var timeString = Lang.format("$1$:$2$", [hours.format("%d"), minutes.format("%02d") ]);
+ return timeString;
+}
+
+(:background)
+function getIntProperty(key, defaultValue) {
+ var value;
+ var exception;
+
+ try {
+ exception = false;
+ value = Properties.getValue(key);
+ }
+ catch (e) {
+ exception = true;
+ value = defaultValue;
+ }
+
+ if (exception) {
+ try {
+ Properties.setValue(key, defaultValue);
+ }
+ catch (e) {
+ }
+ }
+ return validateNumber(value, defaultValue);
+}
+
+(:background)
+function validateNumber(value, defaultValue) {
+ if (value == null || !(value has :toNumber)) {
+ value = defaultValue;
+ } else if (!(value instanceof Lang.Number)) {
+ try {
+ value = value.toNumber();
+ }
+ catch (e) {
+ value = defaultValue;
+ }
+ }
+ if (value == null) {
+ value = defaultValue;
+ }
+ return value;
+}
+
+(:background)
+function getFloatProperty(key, defaultValue) {
+ var value;
+ var exception;
+
+ try {
+ exception = false;
+ value = Properties.getValue(key);
+ }
+ catch (e) {
+ exception = true;
+ value = defaultValue;
+ }
+
+ if (exception) {
+ try {
+ Properties.setValue(key, defaultValue);
+ }
+ catch (e) {
+ }
+ }
+ return validateFloat(value, defaultValue);
+}
+
+(:background)
+function validateFloat(value, defaultValue) {
+ if (value == null || !(value has :toFloat)) {
+ value = defaultValue;
+ } else if (!(value instanceof Lang.Float)) {
+ try {
+ value = value.toFloat();
+ }
+ catch (e) {
+ value = defaultValue;
+ }
+ }
+ if (value == null) {
+ value = defaultValue;
+ }
+ return value;
+}
+
+(:background)
+function getStringProperty(key, defaultValue) {
+ var value;
+ var exception;
+
+ try {
+ exception = false;
+ value = Properties.getValue(key);
+ }
+ catch (e) {
+ exception = true;
+ value = defaultValue;
+ }
+
+ if (exception) {
+ try {
+ Properties.setValue(key, defaultValue);
+ }
+ catch (e) {
+ }
+ }
+ return validateString(value, defaultValue);
+}
+
+(:background)
+function validateString(value, defaultValue) {
+ if (value == null || !(value has :toString)) {
+ value = defaultValue;
+ } else if (!(value instanceof Lang.String)) {
+ try {
+ value = value.toString();
+ }
+ catch (e) {
+ value = defaultValue;
+ }
+ }
+ if (value == null) {
+ value = defaultValue;
+ }
+ return value;
+}
+
+(:background)
+function getBoolProperty(key, defaultValue) {
+ var value;
+ var exception;
+
+ try {
+ exception = false;
+ value = Properties.getValue(key);
+ }
+ catch (e) {
+ exception = true;
+ value = defaultValue;
+ }
+
+ if (exception) {
+ try {
+ Properties.setValue(key, defaultValue);
+ }
+ catch (e) {
+ }
+ }
+
+ return validateBoolean(value, defaultValue);
+}
+
+(:background)
+function validateBoolean(value, defaultValue) {
+ if (value == null) {
+ value = defaultValue;
+ } else if ((value instanceof Lang.Boolean) || (value instanceof Lang.Number)) {
+ try {
+ if (value) {
+ value = true;
+ }
+ else {
+ value = false;
+ }
+ }
+ catch (e) {
+ value = defaultValue;
+ }
+ }
+ else if (value instanceof Lang.String) {
+ if (value.equals("true")) {
+ value = true;
+ }
+ else if (value.equals("false")) {
+ value = false;
+ }
+ else {
+ value = defaultValue;
+ }
+ }
+ else {
+ value = defaultValue;
+ }
+
+ if (value == null) {
+ value = defaultValue;
+ }
+ return value;
+}
+
+function to_array(string, splitter) {
+ var array = new [30]; //Use maximum expected length
+ var index = 0;
+ var location;
+
+ do {
+ location = string.find(splitter);
+ if (location != null) {
+ array[index] = string.substring(0, location);
+ string = string.substring(location + 1, string.length());
+ index++;
+ }
+ } while (location != null);
+
+ array[index] = string;
+
+ var result = new [index + 1];
+ for (var i = 0; i <= index; i++) {
+ result[i] = array[i];
+ }
+ return result;
+}
+
+(:noComplications)
+function doTeslaComplication(complicationValue) {
+}
+
+(:hasComplications)
+function doTeslaComplication(complicationValue) {
+ //DEBUG*/ logMessage("Complication read: " + complicationValue);
+ if (complicationValue instanceof Lang.String) { // Only handle the enhance data sent, not just the battery SoC (a Number)
+ var teslaInfo = Storage.getValue("TeslaInfo");
+ if (teslaInfo == null){
+ teslaInfo = {};
+ }
+ var arrayInfo = $.to_array(complicationValue, "|");
+ teslaInfo.put("httpErrorTesla", $.validateNumber(arrayInfo[0], 401)); // Defaults to need token
+ teslaInfo.put("BatteryLevel", $.validateNumber(arrayInfo[1], 999)); // 999 means in writeBatteryLevel that we didn't get any
+ teslaInfo.put("ChargingState", $.validateString(arrayInfo[2], ""));
+ teslaInfo.put("InsideTemp", $.validateNumber(arrayInfo[3], 999)); // 999 means in writeBatteryLevel that we didn't get any
+ teslaInfo.put("SentryEnabled", $.validateBoolean(arrayInfo[4], "")); // Yes, putting an empty string instead of a Boolean. The writeBatteryLevel will know it means I don't have one
+ teslaInfo.put("PrecondEnabled", $.validateBoolean(arrayInfo[5], "")); // Yes, putting an empty string instead of a Boolean. The writeBatteryLevel will know it means I don't have one
+ teslaInfo.put("VehicleState", $.validateString(arrayInfo[6], ""));
+ teslaInfo.put("NewData", true);
+ Storage.setValue("TeslaInfo", teslaInfo);
+ }
+}
+
+/**
+* With thanks to ruiokada. Adapted, then translated to Monkey C, from:
+* https://gist.github.com/ruiokada/b28076d4911820ddcbbc
+*
+* Calculates sunrise and sunset in local time given latitude, longitude, and tz.
+*
+* Equations taken from:
+* https://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_Day_Number
+* https://en.wikipedia.org/wiki/Sunrise_equation#Complete_calculation_on_Earth
+
+*
+* @method getSunTimes
+* @param {Float} lat Latitude of location (South is negative)
+* @param {Float} lng Longitude of location (West is negative)
+* @param {Integer || null} tz Timezone hour offset. e.g. Pacific/Los Angeles is -8 (Specify null for system timezone)
+* @param {Boolean} tomorrow Calculate tomorrow's sunrise and sunset, instead of today's.
+* @return {Array} Returns array of length 2 with sunrise and sunset as floats.
+* Returns array with [null, -1] if the sun never rises, and [-1, null] if the sun never sets.
+*/
+function getSunTimes(lat, lng, tz, tomorrow) {
+
+ // Use double precision where possible, as floating point errors can affect result by minutes.
+ lat = lat.toDouble();
+ lng = lng.toDouble();
+
+ var now = Time.now();
+ if (tomorrow) {
+ now = now.add(new Time.Duration(24 * 60 * 60));
+ }
+ var d = Gregorian.info(now, Time.FORMAT_SHORT);
+ var rad = Math.PI / 180.0d;
+ var deg = 180.0d / Math.PI;
+
+ // Calculate Julian date from Gregorian.
+ var a = Math.floor((14 - d.month) / 12);
+ var y = d.year + 4800 - a;
+ var m = d.month + (12 * a) - 3;
+ var jDate = d.day
+ + Math.floor(((153 * m) + 2) / 5)
+ + (365 * y)
+ + Math.floor(y / 4)
+ - Math.floor(y / 100)
+ + Math.floor(y / 400)
+ - 32045;
+
+ // Number of days since Jan 1st, 2000 12:00.
+ var n = jDate - 2451545.0d + 0.0008d;
+ //Sys.println("n " + n);
+
+ // Mean solar noon.
+ var jStar = n - (lng / 360.0d);
+ //Sys.println("jStar " + jStar);
+
+ // Solar mean anomaly.
+ var M = 357.5291d + (0.98560028d * jStar);
+ var MFloor = Math.floor(M);
+ var MFrac = M - MFloor;
+ M = MFloor.toLong() % 360;
+ M += MFrac;
+ //Sys.println("M " + M);
+
+ // Equation of the centre.
+ var C = 1.9148d * Math.sin(M * rad)
+ + 0.02d * Math.sin(2 * M * rad)
+ + 0.0003d * Math.sin(3 * M * rad);
+ //Sys.println("C " + C);
+
+ // Ecliptic longitude.
+ var lambda = (M + C + 180 + 102.9372d);
+ var lambdaFloor = Math.floor(lambda);
+ var lambdaFrac = lambda - lambdaFloor;
+ lambda = lambdaFloor.toLong() % 360;
+ lambda += lambdaFrac;
+ //Sys.println("lambda " + lambda);
+
+ // Solar transit.
+ var jTransit = 2451545.5d + jStar
+ + 0.0053d * Math.sin(M * rad)
+ - 0.0069d * Math.sin(2 * lambda * rad);
+ //Sys.println("jTransit " + jTransit);
+
+ // Declination of the sun.
+ var delta = Math.asin(Math.sin(lambda * rad) * Math.sin(23.44d * rad));
+ //Sys.println("delta " + delta);
+
+ // Hour angle.
+ var cosOmega = (Math.sin(-0.83d * rad) - Math.sin(lat * rad) * Math.sin(delta))
+ / (Math.cos(lat * rad) * Math.cos(delta));
+ //Sys.println("cosOmega " + cosOmega);
+
+ // Sun never rises.
+ if (cosOmega > 1) {
+ return [null, -1];
+ }
+
+ // Sun never sets.
+ if (cosOmega < -1) {
+ return [-1, null];
+ }
+
+ // Calculate times from omega.
+ var omega = Math.acos(cosOmega) * deg;
+ var jSet = jTransit + (omega / 360.0);
+ var jRise = jTransit - (omega / 360.0);
+ var deltaJSet = jSet - jDate;
+ var deltaJRise = jRise - jDate;
+
+ var tzOffset = (tz == null) ? (Sys.getClockTime().timeZoneOffset / 3600.0) : tz;
+ return [
+ /* localRise */ (deltaJRise * 24) + tzOffset,
+ /* localSet */ (deltaJSet * 24) + tzOffset
+ ];
+}
+
+//DEBUG
+(:debug, :background)
+function logMessage(message) {
+ var clockTime = Gregorian.info(Time.now(), Time.FORMAT_MEDIUM);
+ var dateStr = clockTime.hour + ":" + clockTime.min.format("%02d") + ":" + clockTime.sec.format("%02d");
+ Sys.println(dateStr + " : " + message);
+}
+//DEBUG*/
+
+(:release, :background)
+function logMessage(message) {
+ var clockTime = Gregorian.info(Time.now(), Time.FORMAT_MEDIUM);
+ var dateStr = clockTime.hour + ":" + clockTime.min.format("%02d") + ":" + clockTime.sec.format("%02d");
+ Sys.println(dateStr + " : " + message);
+}
+
+/*
+function type_name(obj) {
+ if (obj instanceof Toybox.Lang.Number) {
+ return "Number";
+ } else if (obj instanceof Toybox.Lang.Long) {
+ return "Long";
+ } else if (obj instanceof Toybox.Lang.Float) {
+ return "Float";
+ } else if (obj instanceof Toybox.Lang.Double) {
+ return "Double";
+ } else if (obj instanceof Toybox.Lang.Boolean) {
+ return "Boolean";
+ } else if (obj instanceof Toybox.Lang.String) {
+ return "String";
+ } else if (obj instanceof Toybox.Lang.Array) {
+ var s = "Array [";
+ for (var i = 0; i < obj.size(); ++i) {
+ s += type_name(obj);
+ s += ", ";
+ }
+ s += "]";
+ return s;
+ } else if (obj instanceof Toybox.Lang.Dictionary) {
+ var s = "Dictionary{";
+ var keys = obj.keys();
+ var vals = obj.values();
+ for (var i = 0; i < keys.size(); ++i) {
+ s += keys;
+ s += ": ";
+ s += vals;
+ s += ", ";
+ }
+ s += "}";
+ return s;
+ } else if (obj instanceof Toybox.Time.Gregorian.Info) {
+ return "Gregorian.Info";
+ } else {
+ return "???";
+ }
+}
+*/
\ No newline at end of file
diff --git a/source/GoalMeter.mc b/source/GoalMeter.mc
index be58e36f..9de246b1 100644
--- a/source/GoalMeter.mc
+++ b/source/GoalMeter.mc
@@ -2,13 +2,19 @@ using Toybox.WatchUi as Ui;
using Toybox.System as Sys;
using Toybox.Application as App;
using Toybox.Graphics;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
+using Toybox.Complications;
// const MIN_WHOLE_SEGMENT_HEIGHT = 5;
enum /* GOAL_TYPES */ {
GOAL_TYPE_BATTERY = -1,
GOAL_TYPE_CALORIES = -2,
- GOAL_TYPE_OFF = -3,
+ GOAL_TYPE_ACTIVE_CALORIES = -3, // SG Addition
+ GOAL_TYPE_BODY_BATTERY = -4, // SG Addition
+ GOAL_TYPE_STRESS_LEVEL = -5, // SG Addition
+ GOAL_TYPE_OFF = -6,
GOAL_TYPE_STEPS = 0, // App.GOAL_TYPE_STEPS
GOAL_TYPE_FLOORS_CLIMBED, // App.GOAL_TYPE_FLOORS_CLIMBED
@@ -60,7 +66,7 @@ class GoalMeter extends Ui.Drawable {
mLayoutSeparator = params[:separator];
// Read meter style setting to determine current separator width.
- onSettingsChanged();
+ onSettingsChanged(mSide == :left ? 0 : 1);
mWidth = getWidth();
}
@@ -105,12 +111,13 @@ class GoalMeter extends Ui.Drawable {
mIsOff = isOff;
}
- function onSettingsChanged() {
+ (:noComplications)
+ function onSettingsChanged(index) {
mBuffersNeedRecreate = true;
// #18 Only read separator width from layout if multi segment style is selected.
// #62 Or if filled segment style is selected.
- var goalMeterStyle = App.getApp().getProperty("GoalMeterStyle");
+ var goalMeterStyle = $.getIntProperty("GoalMeterStyle", 0);
if ((goalMeterStyle == 0 /* ALL_SEGMENTS */) || (goalMeterStyle == 3 /* FILLED_SEGMENTS */)) {
// Force recalculation of mSegments in setValues() if mSeparator is about to change.
@@ -131,6 +138,59 @@ class GoalMeter extends Ui.Drawable {
}
}
+
+ (:hasComplications)
+ function onSettingsChanged(index) {
+ mBuffersNeedRecreate = true;
+
+ // #18 Only read separator width from layout if multi segment style is selected.
+ // #62 Or if filled segment style is selected.
+ var goalMeterStyle = $.getIntProperty("GoalMeterStyle", 0);
+ if ((goalMeterStyle == 0 /* ALL_SEGMENTS */) || (goalMeterStyle == 3 /* FILLED_SEGMENTS */)) {
+
+ // Force recalculation of mSegments in setValues() if mSeparator is about to change.
+ if (mSeparator != mLayoutSeparator) {
+ mMaxValue = null;
+ }
+
+ mSeparator = mLayoutSeparator;
+
+ } else {
+
+ // Force recalculation of mSegments in setValues() if mSeparator is about to change.
+ if (mSeparator != 0) {
+ mMaxValue = null;
+ }
+
+ mSeparator = 0;
+ }
+
+ if (Toybox has :Complications && App.getApp().getView().useComplications()) {
+ var complications = [{"type" => GOAL_TYPE_BODY_BATTERY, "complicationType" => Complications.COMPLICATION_TYPE_BODY_BATTERY},
+ {"type" => GOAL_TYPE_FLOORS_CLIMBED, "complicationType" => Complications.COMPLICATION_TYPE_FLOORS_CLIMBED},
+ {"type" => GOAL_TYPE_STEPS, "complicationType" => Complications.COMPLICATION_TYPE_STEPS},
+ {"type" => GOAL_TYPE_STRESS_LEVEL, "complicationType" => Complications.COMPLICATION_TYPE_STRESS},
+ {"type" => GOAL_TYPE_CALORIES, "complicationType" => Complications.COMPLICATION_TYPE_CALORIES},
+ {"type" => GOAL_TYPE_ACTIVE_CALORIES, "complicationType" => Complications.COMPLICATION_TYPE_CALORIES}
+ ];
+
+ var goalTypes = App.getApp().getView().mGoalTypes;
+ var filled = false;
+
+ for (var i = 0; i < complications.size(); i++) {
+ if (goalTypes[index].get("type") == complications[i].get("type")) {
+ $.updateComplications("", "Complication_G", index + 1, complications[i].get("complicationType"));
+ goalTypes[index].put("ComplicationType", complications[i].get("complicationType"));
+ filled = true;
+ }
+ }
+
+ if (filled == false) {
+ Storage.deleteValue("Complication_G" + (index + 1).toString());
+ }
+ }
+ }
+
// Different draw algorithms have been tried:
// 1. Draw each segment as a circle, clipped to a rectangle of the desired height, direct to screen DC.
// Intuitive, but expensive.
@@ -143,7 +203,7 @@ class GoalMeter extends Ui.Drawable {
function draw(dc) {
// #114 TODO: Any buffers not yet reclaimed if goal meter set to off.
- if ((App.getApp().getProperty("GoalMeterStyle") == 2 /* HIDDEN */) || mIsOff) {
+ if (($.getIntProperty("GoalMeterStyle", 0) == 2 /* HIDDEN */) || mIsOff) {
return;
}
@@ -165,7 +225,7 @@ class GoalMeter extends Ui.Drawable {
// Unfilled segments: fill height --> height.
// #62 ALL_SEGMENTS or ALL_SEGMENTS_MERGED.
- if (App.getApp().getProperty("GoalMeterStyle") <= 1) {
+ if ($.getIntProperty("GoalMeterStyle", 0) <= 1) {
drawSegments(dc, left, top, gMeterBackgroundColour, mSegments, mFillHeight, mHeight);
}
}
@@ -241,7 +301,7 @@ class GoalMeter extends Ui.Drawable {
// Draw unfilled segments.
// #62 ALL_SEGMENTS or ALL_SEGMENTS_MERGED.
- if (App.getApp().getProperty("GoalMeterStyle") <= 1) {
+ if ($.getIntProperty("GoalMeterStyle", 0) <= 1) {
clipBottom = clipTop;
clipTop = top;
clipHeight = clipBottom - clipTop;
diff --git a/source/Indicators.mc b/source/Indicators.mc
index 816bec50..4d0cddfb 100644
--- a/source/Indicators.mc
+++ b/source/Indicators.mc
@@ -2,16 +2,19 @@ using Toybox.WatchUi as Ui;
using Toybox.Graphics as Gfx;
using Toybox.System as Sys;
using Toybox.Application as App;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
+using Toybox.Complications;
class Indicators extends Ui.Drawable {
- private var mSpacing;
- private var mIsHorizontal = false;
- private var mBatteryWidth;
+ var mSpacing;
+ var mIsHorizontal = false;
+ var mBatteryWidth;
- private var mIndicator1Type;
- private var mIndicator2Type;
- private var mIndicator3Type;
+ var mIndicator1Type;
+ var mIndicator2Type;
+ var mIndicator3Type;
// private enum /* INDICATOR_TYPES */ {
// INDICATOR_TYPE_BLUETOOTH,
@@ -19,6 +22,8 @@ class Indicators extends Ui.Drawable {
// INDICATOR_TYPE_NOTIFICATIONS,
// INDICATOR_TYPE_BLUETOOTH_OR_NOTIFICATIONS,
// INDICATOR_TYPE_BATTERY
+ // INDICATOR_TYPE_BATTERY_NUMERIC
+ // INDICATOR_TYPE_TESLA
// }
function initialize(params) {
@@ -36,15 +41,72 @@ class Indicators extends Ui.Drawable {
}
function onSettingsChanged() {
- mIndicator1Type = App.getApp().getProperty("Indicator1Type");
- mIndicator2Type = App.getApp().getProperty("Indicator2Type");
- mIndicator3Type = App.getApp().getProperty("Indicator3Type");
+ mIndicator1Type = $.getIntProperty("Indicator1Type", 5);
+ mIndicator2Type = $.getIntProperty("Indicator2Type", 3);
+ mIndicator3Type = $.getIntProperty("Indicator3Type", 0);
+
+ var indicator;
+ var filled = [false, false, false];
+
+ if (App.getApp().getView().useComplications()) {
+ indicator = findIndicator(4); // INDICATOR_TYPE_BATTERY
+ if (indicator != null) {
+ $.updateComplications("", "Complication_I", indicator, Complications.COMPLICATION_TYPE_BATTERY);
+ filled[indicator - 1] = true;
+ }
+
+ indicator = findIndicator(5); // INDICATOR_TYPE_BATTERY_NUMERIC
+ if (indicator != null) {
+ $.updateComplications("", "Complication_I", indicator, Complications.COMPLICATION_TYPE_BATTERY);
+ filled[indicator - 1] = true;
+ }
+ }
+
+//****************************************************************
+//******** REMVOVED THIS SECTION IF TESLA CODE NOT WANTED ********
+//****************************************************************
+ indicator = findIndicator(6); // INDICATOR_TYPE_TESLA
+ if (indicator != null) {
+ //DEBUG*/ logMessage("onSettingsChanged:Doing Tesla!");
+ Storage.setValue("Tesla", true);
+ if (App.getApp().getView().useComplications()) {
+ $.updateComplications("Tesla-Link", "Complication_I", indicator, Complications.COMPLICATION_TYPE_INVALID);
+ filled[indicator - 1] = true;
+ }
+ } else {
+ Storage.deleteValue("Tesla");
+ }
+//****************************************************************
+//******************** END OF REMVOVED SECTION *******************
+//****************************************************************
+
+ for (var i = 1; i < 4; i++) {
+ if (filled[i - 1] == false) {
+ Storage.deleteValue("Complication_I" + i);
+ }
+ }
+ }
+
+ function findIndicator(complicationType) {
+ var indicator = null;
+
+ if (mIndicator1Type == complicationType) {
+ indicator = 1;
+ }
+ if (mIndicator2Type == complicationType) {
+ indicator = 2;
+ }
+ if (mIndicator3Type == complicationType) {
+ indicator = 3;
+ }
+
+ return indicator;
}
function draw(dc) {
// #123 Protect against null or unexpected type e.g. String.
- var indicatorCount = App.getApp().getIntProperty("IndicatorCount", 1);
+ var indicatorCount = $.getIntProperty("IndicatorCount", 1);
// Horizontal layout for rectangle-148x205.
if (mIsHorizontal) {
@@ -72,15 +134,35 @@ class Indicators extends Ui.Drawable {
(:vertical_indicators)
function drawVertical(dc, indicatorCount) {
+
+ /*var spacingY = mSpacing;
+ var spacingX = mBatteryWidth * 2;
+
+ var xlocX = locX - (mBatteryWidth / 1.5).toNumber();
+ var ylocY;
+ if (indicatorCount == 1) {
+ ylocY = locY - spacingY;
+ spacingY *= 2;
+ }
+ else {
+ ylocY = locY - spacingY / 2;
+ }*/
+
if (indicatorCount == 3) {
drawIndicator(dc, mIndicator1Type, locX, locY - mSpacing);
drawIndicator(dc, mIndicator2Type, locX, locY);
drawIndicator(dc, mIndicator3Type, locX, locY + mSpacing);
+ // dc.drawRectangle(xlocX, ylocY - spacingY, spacingX, spacingY);
+ // dc.drawRectangle(xlocX, ylocY, spacingX, spacingY);
+ // dc.drawRectangle(xlocX, ylocY + spacingY, spacingX, spacingY);
} else if (indicatorCount == 2) {
drawIndicator(dc, mIndicator1Type, locX, locY - (mSpacing / 2));
drawIndicator(dc, mIndicator2Type, locX, locY + (mSpacing / 2));
+ // dc.drawRectangle(xlocX, ylocY - spacingY / 2, spacingX, spacingY);
+ // dc.drawRectangle(xlocX, ylocY + spacingY / 2, spacingX, spacingY);
} else if (indicatorCount == 1) {
drawIndicator(dc, mIndicator1Type, locX, locY);
+ // dc.drawRectangle(xlocX, ylocY, spacingX, spacingY);
}
}
@@ -88,10 +170,27 @@ class Indicators extends Ui.Drawable {
// Battery indicator.
if (indicatorType == 4 /* INDICATOR_TYPE_BATTERY */) {
- drawBatteryMeter(dc, x, y, mBatteryWidth, mBatteryWidth / 2);
+ $.drawBatteryMeter(dc, x, y, mBatteryWidth, mBatteryWidth / 2);
+ return;
+ }
+
+ if (indicatorType == 5 /* INDICATOR_TYPE_BATTERY_NUMERIC */) {
+ $.writeBatteryLevel(dc, x, y, mBatteryWidth, mBatteryWidth / 2, 0);
return;
}
+//****************************************************************
+//******** REMVOVED THIS SECTION IF TESLA CODE NOT WANTED ********
+//****************************************************************
+ if (indicatorType == 6 /* INDICATOR_TYPE_TESLA */) { // We're reusing the watch batterie indicator to show the Tesla's batterie level
+ $.writeBatteryLevel(dc, x, y, mBatteryWidth, mBatteryWidth / 2, 1);
+ return;
+ }
+
+//****************************************************************
+//******************** END OF REMVOVED SECTION *******************
+//****************************************************************
+
// Show notifications icon if connected and there are notifications, bluetoothicon otherwise.
var settings = Sys.getDeviceSettings();
if (indicatorType == 3 /* INDICATOR_TYPE_BLUETOOTH_OR_NOTIFICATIONS */) {
@@ -101,12 +200,16 @@ class Indicators extends Ui.Drawable {
indicatorType = 0; // INDICATOR_TYPE_BLUETOOTH
}
}
+ else if (indicatorType == 7) {
+ indicatorType = 3;
+ }
// Get value for indicator type.
var value = [
/* INDICATOR_TYPE_BLUETOOTH */ settings.phoneConnected,
/* INDICATOR_TYPE_ALARMS */ settings.alarmCount > 0,
- /* INDICATOR_TYPE_NOTIFICATIONS */ settings.notificationCount > 0
+ /* INDICATOR_TYPE_NOTIFICATIONS */ settings.notificationCount > 0,
+ /* Do Not Disturb */ settings has :doNotDisturb && settings.doNotDisturb
][indicatorType];
dc.setColor(value ? gThemeColour : gMeterBackgroundColour, Graphics.COLOR_TRANSPARENT);
@@ -116,7 +219,7 @@ class Indicators extends Ui.Drawable {
x,
y,
gIconsFont,
- ["8", ":", "5"][indicatorType], // Get icon font char for indicator type.
+ ["8", ":", "5", "C"][indicatorType], // Get icon font char for indicator type.
Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER
);
}
diff --git a/source/MoveBar.mc b/source/MoveBar.mc
index 4e73e712..46cb4a2c 100644
--- a/source/MoveBar.mc
+++ b/source/MoveBar.mc
@@ -3,10 +3,12 @@ using Toybox.System as Sys;
using Toybox.Application as App;
using Toybox.ActivityMonitor as ActivityMonitor;
using Toybox.Graphics;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
class MoveBar extends Ui.Drawable {
- private var mX, mY, mBaseWidth, mHeight, mSeparator;
+ /*private*/ var mX, mY, mBaseWidth, mHeight, mSeparator;
private var mTailWidth;
(:buffered) private var mBuffer;
@@ -22,6 +24,8 @@ class MoveBar extends Ui.Drawable {
// Either mBaseWidth, or a calculated full width.
private var mCurrentWidth;
+ private var mMoveBarStyle = $.getIntProperty("MoveBarStyle", 0);
+
// private enum /* MOVE_BAR_STYLE */ {
// ALL_SEGMENTS,
// FILLED_SEGMENTS,
@@ -40,8 +44,30 @@ class MoveBar extends Ui.Drawable {
mTailWidth = mHeight / 2;
}
+ (:noComplications)
+ function onSettingsChanged() {
+ mBufferNeedsRecreate = true;
+ mMoveBarStyle = $.getIntProperty("MoveBarStyle", 0);
+ }
+
+ (:hasComplications)
function onSettingsChanged() {
mBufferNeedsRecreate = true;
+ mMoveBarStyle = $.getIntProperty("MoveBarStyle", 0);
+
+ if (Toybox has :Complications && App.getApp().getView().useComplications()) {
+ if (mMoveBarStyle == 2) {
+ $.updateComplications("", "Complication_MB", 1, Complications.COMPLICATION_TYPE_RECOVERY_TIME);
+ App.getApp().getView().mMoveBarType.put("ComplicationType", Complications.COMPLICATION_TYPE_RECOVERY_TIME);
+ }
+ else {
+ Storage.deleteValue("Complication_MB1");
+ }
+ }
+ else {
+ Storage.deleteValue("Complication_MB1");
+ }
+
}
function setFullWidth(fullWidth) {
@@ -52,26 +78,67 @@ class MoveBar extends Ui.Drawable {
}
function draw(dc) {
- if (App.getApp().getProperty("MoveBarStyle") == 2 /* HIDDEN */) {
+ if (mMoveBarStyle == 3 /* HIDDEN */) {
return;
}
+ var view = App.getApp().getView();
+ var moveBarType = view.mMoveBarType;
+ var currentMoveBarLevel;
var info = ActivityMonitor.getInfo();
- var currentMoveBarLevel = info.moveBarLevel;
+ if (mMoveBarStyle == 2) { /* recovery time */
+ var value = null;
+ if (Toybox has :Complications && view.useComplications()) {
+ value = moveBarType.get("ComplicationValue");
+ if (value != null) {
+ value /= 60; // Complication Time to Recovery is in minutes
+ value = value.toNumber();
+ }
+ }
- // Calculate current width here, now that DC is accessible.
- // Balance head/tail positions in full width mode.
- mCurrentWidth = mIsFullWidth ? (dc.getWidth() - (2 * mX) + mTailWidth) : mBaseWidth;
+ if (value == null && (info has :timeToRecovery)) {
+ value = info.timeToRecovery; // Info time to recovery is in hours
+ }
- // #21 Force unbuffered drawing on fr735xt (CIQ 2.x) to reduce memory usage.
- if ((Graphics has :BufferedBitmap) && (Sys.getDeviceSettings().screenShape != Sys.SCREEN_SHAPE_SEMI_ROUND)) {
- drawBuffered(dc, currentMoveBarLevel);
- } else {
- //drawUnbuffered(dc, currentMoveBarLevel);
+ if (value != null) {
+ //value = 12;
+ currentMoveBarLevel = ((value == null || value < 0) ? 0 : value) / 12; // Each bar (up to 5 bars) is 12 hours
+ if (value > 0) {
+ currentMoveBarLevel++; // So only when the recovery time is zero does it display no move bars.
+ }
+ if (currentMoveBarLevel > 5) {
+ currentMoveBarLevel = 5;
+ }
+ // 0 Move bar : Times up!
+ // 1 Move bar : Between 1 and 11 hours
+ // 2 Move bar : Between 12 and 23 hours
+ // 3 Move bar : Between 24 and 35 hours
+ // 4 Move bar : Between 36 and 47 hours
+ // 5 Move bar : 48 and more hours
+ }
+ else {
+ currentMoveBarLevel = null;
+ }
+ }
+ else {
+ currentMoveBarLevel = info.moveBarLevel;
+ }
- // Draw bars vertically centred on mY.
- drawBars(dc, mX, mY - (mHeight / 2), currentMoveBarLevel);
- }
+ if (currentMoveBarLevel != null) {
+ // Calculate current width here, now that DC is accessible.
+ // Balance head/tail positions in full width mode.
+ mCurrentWidth = mIsFullWidth ? (dc.getWidth() - (2 * mX) + mTailWidth) : mBaseWidth;
+
+ // #21 Force unbuffered drawing on fr735xt (CIQ 2.x) to reduce memory usage.
+ if ((Graphics has :BufferedBitmap) && (Sys.getDeviceSettings().screenShape != Sys.SCREEN_SHAPE_SEMI_ROUND)) {
+ drawBuffered(dc, currentMoveBarLevel);
+ } else {
+ //drawUnbuffered(dc, currentMoveBarLevel);
+
+ // Draw bars vertically centred on mY.
+ drawBars(dc, mX, mY - (mHeight / 2), currentMoveBarLevel);
+ }
+ }
}
(:buffered)
@@ -135,7 +202,6 @@ class MoveBar extends Ui.Drawable {
var thisBarWidth;
var thisBarColour = 0;
var barX = x + mTailWidth;
- var moveBarStyle = App.getApp().getProperty("MoveBarStyle");
// One-based, to correspond with move bar level (zero means no bars).
for (var i = 1; i <= ActivityMonitor.MOVE_BAR_LEVEL_MAX; ++i) {
@@ -148,7 +214,7 @@ class MoveBar extends Ui.Drawable {
thisBarColour = gThemeColour;
// Move bar below this level, so only show if MoveBarStyle setting is ALL_SEGMENTS.
- } else if (moveBarStyle == 0 /* ALL_SEGMENTS */) {
+ } else if (mMoveBarStyle != 1 /* FILLED_SEGMENTS */) {
thisBarColour = gMeterBackgroundColour;
// Otherwise, do not show this, or any higher level.
diff --git a/source/ThickThinTime.mc b/source/ThickThinTime.mc
index c8f3d65f..3f27afcf 100644
--- a/source/ThickThinTime.mc
+++ b/source/ThickThinTime.mc
@@ -1,6 +1,8 @@
using Toybox.WatchUi as Ui;
using Toybox.System as Sys;
using Toybox.Application as App;
+using Toybox.Application.Storage;
+using Toybox.Application.Properties;
class ThickThinTime extends Ui.Drawable {
@@ -60,7 +62,7 @@ class ThickThinTime extends Ui.Drawable {
function drawHoursMinutes(dc) {
var clockTime = Sys.getClockTime();
- var formattedTime = App.getApp().getFormattedTime(clockTime.hour, clockTime.min);
+ var formattedTime = $.getFormattedTime(clockTime.hour, clockTime.min, clockTime.sec);
formattedTime[:amPm] = formattedTime[:amPm].toUpper();
var hours = formattedTime[:hour];
@@ -70,10 +72,15 @@ class ThickThinTime extends Ui.Drawable {
var halfDCWidth = dc.getWidth() / 2;
var halfDCHeight = (dc.getHeight() / 2) + mAdjustY;
+ var addColon = $.getBoolProperty("AddColon", false);
+
// Centre combined hours and minutes text (not the same as right-aligning hours and left-aligning minutes).
// Font has tabular figures (monospaced numbers) even across different weights, so does not matter which of hours or
// minutes font is used to calculate total width.
var totalWidth = dc.getTextWidthInPixels(hours + minutes, mHoursFont);
+ if (addColon) {
+ totalWidth += dc.getTextWidthInPixels(":", mMinutesFont);
+ }
var x = halfDCWidth - (totalWidth / 2);
// Draw hours.
@@ -87,6 +94,17 @@ class ThickThinTime extends Ui.Drawable {
);
x += dc.getTextWidthInPixels(hours, mHoursFont);
+ if (addColon != null && addColon == true) {
+ dc.drawText(
+ x,
+ halfDCHeight,
+ mMinutesFont,
+ ":",
+ Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER
+ );
+ x += dc.getTextWidthInPixels(":", mMinutesFont);
+ }
+
// Draw minutes.
dc.setColor(gMinutesColour, Graphics.COLOR_TRANSPARENT);
dc.drawText(
@@ -118,11 +136,14 @@ class ThickThinTime extends Ui.Drawable {
if (mHideSeconds) {
return;
}
-
+
var clockTime = Sys.getClockTime();
var seconds = clockTime.sec.format("%02d");
if (isPartialUpdate) {
+ if (mSecondsClipRectX == null || mSecondsClipXAdjust == null || mSecondsClipRectY == null || mSecondsClipRectWidth == null || mSecondsClipRectHeight == null) { // Fixes a crash when null value are found. WHy it get there first, I don't kmow.
+ return;
+ }
dc.setClip(
mSecondsClipRectX + mSecondsClipXAdjust,