Version 1.4.4.

This commit is contained in:
GuruSR 2022-06-20 22:22:19 -04:00 committed by GitHub
parent 3af2b8d778
commit f60c09907a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 4719 additions and 718 deletions

View File

@ -1,9 +1,6 @@
#ifndef DEFINES_GSR_H
#define DEFINES_GSR_H
//debug
#define USEDEBUG 0 // !0 is on, will not setup Serial OR print output if zero.
// WiFi
#define WiFi_AP_SSID "Watchy Connect"
#define WiFi_AP_PSWD "Watchy123"
@ -16,7 +13,7 @@
#define WiFi_DEF_PASS ""
// Battery
#define MaxBattery 4.37
#define GSR_MaxBattery 4.37
// functions
#define roller(v,lo,hi) (((v)<(lo))?(hi):((v)>(hi))?(lo):(v))
@ -24,71 +21,72 @@
#define golow(v,hi) ((v)<(hi)?(v):(hi))
// Watch face states.
#define WATCHON 0
#define MENUON 1
#define GSR_WATCHON 0
#define GSR_MENUON 1
// Maximum styles possible.
#define MaxStyles 25
#define GSR_MaxStyles 25
// Nenu size defines.
#define MenuWidth 200
#define MenuHeight 83
#define GSR_MenuWidth 200
#define GSR_MenuHeight 83
// Menu offsets so I don't have to statically entere them everywhere.
#define MENU_STEPS 0
#define MENU_ALARMS 1
#define MENU_TIMERS 2
#define MENU_OPTIONS 3
#define MENU_ALARM1 4
#define MENU_ALARM2 5
#define MENU_ALARM3 6
#define MENU_ALARM4 7
#define MENU_TONES 8
#define MENU_TIMEDN 9
#define MENU_TIMEUP 10
#define MENU_STYL 11
#define MENU_DISP 12
#define MENU_BRDR 13
#define MENU_SIDE 14
#define MENU_SWAP 15
#define MENU_ORNT 16
#define MENU_MODE 17
#define MENU_FEED 18
#define MENU_TRBO 19
#define MENU_DARK 20
#define MENU_SAVE 21
#define MENU_TPWR 22
#define MENU_INFO 23
#define MENU_TRBL 24
#define MENU_SYNC 25
#define MENU_WIFI 26
#define MENU_OTAU 27
#define MENU_OTAM 28
#define MENU_SCRN 29
#define MENU_RSET 30
#define MENU_TOFF 31 // Time Diff offset.
#define MENU_UNVS 32
#define GSR_MENU_STEPS 0
#define GSR_MENU_ALARMS 1
#define GSR_MENU_TIMERS 2
#define GSR_MENU_OPTIONS 3
#define GSR_MENU_ALARM1 4
#define GSR_MENU_ALARM2 5
#define GSR_MENU_ALARM3 6
#define GSR_MENU_ALARM4 7
#define GSR_MENU_TONES 8
#define GSR_MENU_TIMEDN 9
#define GSR_MENU_TIMEUP 10
#define GSR_MENU_STYL 11
#define GSR_MENU_LANG 12
#define GSR_MENU_DISP 13
#define GSR_MENU_BRDR 14
#define GSR_MENU_SIDE 15
#define GSR_MENU_SWAP 16
#define GSR_MENU_ORNT 17
#define GSR_MENU_MODE 18
#define GSR_MENU_FEED 19
#define GSR_MENU_TRBO 20
#define GSR_MENU_DARK 21
#define GSR_MENU_SAVE 22
#define GSR_MENU_TPWR 23
#define GSR_MENU_INFO 24
#define GSR_MENU_TRBL 25
#define GSR_MENU_SYNC 26
#define GSR_MENU_WIFI 27
#define GSR_MENU_OTAU 28
#define GSR_MENU_OTAM 29
#define GSR_MENU_SCRN 30
#define GSR_MENU_RSET 31
#define GSR_MENU_TOFF 32 // Time Diff offset.
#define GSR_MENU_UNVS 33
// Menu segments.
#define MENU_INNORMAL 0
#define MENU_INALARMS 1
#define MENU_INTIMERS 2
#define MENU_INOPTIONS 3
#define MENU_INTROUBLE 4
#define GSR_MENU_INNORMAL 0
#define GSR_MENU_INALARMS 1
#define GSR_MENU_INTIMERS 2
#define GSR_MENU_INOPTIONS 3
#define GSR_MENU_INTROUBLE 4
// Button debounce.
#define KEYPAUSE 728
#define GSR_KEYPAUSE 728
//ALARM flags.
#define ALARM_REPEAT 128
#define ALARM_ACTIVE 256
#define ALARM_NOTRIGGER 511
#define ALARM_TRIGGERED 512
#define ALARM_DAYS 127
#define ALARM_ALL 1023
#define GSR_ALARM_REPEAT 128
#define GSR_ALARM_ACTIVE 256
#define GSR_ALARM_NOTRIGGER 511
#define GSR_ALARM_TRIGGERED 512
#define GSR_ALARM_DAYS 127
#define GSR_ALARM_ALL 1023
// Setup lengths.
#define AlarmSetup 1234567890
#define GSR_AlarmSetup 1234567890
//pins
#define RTC_INT_PIN GPIO_NUM_27
@ -97,16 +95,16 @@
#define EPD_RESET 9
#define EPD_BUSY 19
#define VIB_MOTOR_PIN 13
#define MENU_PIN 26
#define BACK_PIN 25
#define DOWN_PIN 4
#define MENU_MASK GPIO_SEL_26
#define BACK_MASK GPIO_SEL_25
#define DOWN_MASK GPIO_SEL_4
#define GSR_MENU_PIN 26
#define GSR_BACK_PIN 25
#define GSR_DOWN_PIN 4
#define GSR_MENU_MASK GPIO_SEL_26
#define GSR_BACK_MASK GPIO_SEL_25
#define GSR_DOWN_MASK GPIO_SEL_4
#define ACC_INT_MASK GPIO_SEL_14
//SetCPU defines.
#define CPUMAX 65280
#define CPUDEF 65281
#define CPUMID 65282
#define GSR_CPUMAX 65280
#define GSR_CPUDEF 65281
#define GSR_CPUMID 65282
#endif

3425
src/Fonts_GSR.h Normal file

File diff suppressed because it is too large Load Diff

514
src/Locale_GSR.h Normal file
View File

@ -0,0 +1,514 @@
#ifndef Locale_GSR_H
#define Locale_GSR_H
/* This code is designed to allow for multi-lingual setup to happen with Watchy GSR.
*/
class LocaleGSR {
public:
LocaleGSR() {};
/*
* MaxLangID holds the maximum ID for language, done when more are added.
*/
virtual uint8_t MaxLangID() final { return 0; };
/*
* LangString:
*
* Values starting with 0 are encased in {% %} so they look like {%0%} and are replaced
* with the language ID's id, calls for LangString will replace those with the values of
* the stored strings, use the StartID and LastID to minimize the workload on specific
* strings.
*/
virtual String LangString(String Input, bool Web, uint8_t LangID = 0, uint8_t StartID = 0, uint8_t LastID = 0) final{
String S = Input;
S.replace("{%LANG%}",GetWebLang(LangID));
if (LastID < StartID || (LastID + StartID) == 0) LastID = LocaleGSR::MaxLangID();
for (int I = StartID; I <= LastID; I++) S.replace("{%" + String(I) + "%}",(Web ? LocaleGSR::GetWebID(LangID,I) : LocaleGSR::GetID(LangID,I)));
return S;
};
/*
* GetFormatID is used to retrieve format information for specific watch face fields
* by regional changes.
*/
String GetFormatID(uint8_t LangID, uint8_t ID){
switch(LangID){
case 0:{
switch(ID){
case 0:
return "{W}"; // Weekday.
case 1:
return "{M} {D}"; // Month & Date
}
}
}
return "None";
};
/*
* GetID, GetWebID are used by the LangString to retrieve those language changes per entry.
* WebIDs are different from normal IDs as they're used in the OTA Website and are not limited
* to the font limitations in the system.
*/
String GetID(uint8_t LangID, uint8_t ID){
switch(LangID){
case 0:{
switch(ID){
case 0:
return "Classic GSR"; // Watchface 0.
case 1:
return "--"; // Placeholder
case 2:
return "Tomorrow";
case 3:
return "Reset Today";
case 4:
return "Steps";
case 5:
return "Alarms";
case 6:
return "Timers";
case 7:
return "Options";
case 8:
return "Alarm 1 Time";
case 9:
return "A1 Tone Repeats";
case 10:
return "Alarm 1 Options";
case 11:
return "Alarm 1";
case 12:
return "Alarm 2 Time";
case 13:
return "A2 Tone Repeats";
case 14:
return "Alarm 2 Options";
case 15:
return "Alarm 2";
case 16:
return "Alarm 3 Time";
case 17:
return "A3 Tone Repeats";
case 18:
return "Alarm 3 Options";
case 19:
return "Alarm 3";
case 20:
return "Alarm 4 Time";
case 21:
return "A4 Tone Repeats";
case 22:
return "Alarm 4 Options";
case 23:
return "Alarm 4";
case 24:
return "Tone Repeats";
case 25:
return "Countdown Timer";
case 26:
return "Elapsed Timer";
case 27:
return "Watch Style";
case 28:
return "Display Style";
case 29:
return "Language";
case 30:
return "Border Mode";
case 31:
return "Dexterity";
case 32:
return "Menu & Back";
case 33:
return "Orientation";
case 34:
return "Time Mode";
case 35:
return "Feedback";
case 36:
return "Turbo Time";
case 37:
return "Screen Off";
case 38:
return "Screen Blanking";
case 39:
return "Screen Auto-Off";
case 40:
return "Sleeping Begins";
case 41:
return "Sleeping Ends";
case 42:
return "Orientation";
case 43:
return "Performance";
case 44:
return "WiFi Tx Power";
case 45:
return "Information";
case 46:
return "Troubleshoot";
case 47:
return "Sync Watchy";
case 48:
return "Watchy Connect";
case 49:
return "Upload Firmware";
case 50:
return "OTA Update";
case 51:
return "Visit Website";
case 52:
return "OTA Website";
case 53:
return "Reset Screen";
case 54:
return "Watchy Reboot";
case 55:
return "Return to RTC";
case 56:
return "Detect Travel";
case 57:
return "Storage Settings";
case 58:
return "Change Storage";
case 59:
return "Delete and Reboot";
case 60:
return "MENU to Reset";
case 61:
return "MENU to Select";
case 62:
return "MENU to Edit";
case 63:
return "Repeat";
case 64:
return "Active";
case 65:
return "repeats";
case 66:
return "MENU to Select";
case 67:
return "MENU to Change";
case 68:
return "Off";
case 69:
return "On";
case 70:
return "MENU to Enter";
case 71:
return "Light";
case 72:
return "Dark";
case 73:
return "Left-handed";
case 74:
return "Right-handed";
case 75:
return "Swapped";
case 76:
return "Normal";
case 77:
return "Watchy UP";
case 78:
return "Ignore";
case 79:
return "24 Hour";
case 80:
return "AM/PM";
case 81:
return "Enabled";
case 82:
return "Locked";
case 83:
return "Disabled";
case 84:
return "Always";
case 85:
return "Bed Time";
case 86:
return "Double Tap On";
case 87:
return "Double Tap Only";
case 88:
return "to";
case 89:
return "Version";
case 90:
return "Battery";
case 91:
return "Battery Saving";
case 92:
return "Turbo";
case 93:
return "MENU to Start";
case 94:
return "Time";
case 95:
return "TimeZone";
case 96:
return "TimeZone & Time";
case 97:
return "MENU to Begin";
case 98:
return "Starting AP";
case 99:
return "BACK to End";
case 100:
return "MENU to Connect";
case 101:
return "Connecting...";
case 102:
return "MENU to Agree";
case 103:
return "MENU to Reboot";
case 104:
return "Time Sync";
case 105:
return "Calculating";
case 106:
return "Bad RTC";
case 107:
return "No Drift";
case 108:
return "Menu to Disable";
case 109:
return "Menu to Enable";
case 110:
return "MENU to Keep";
case 111:
return "Delete and Reboot";
case 112:
return "seconds";
case 113:
return "second";
case 114:
return "PM";
case 115:
return "AM";
case 116:
return "Full";
}
}
}
return "None";
};
String GetWebID(uint8_t LangID, uint8_t ID){
switch(LangID){
case 0:{
switch(ID){
case 0:
return "Watchy WiFi TX Power"; // Why did I do this?
case 1:
return "Watchy Connect Options"; // 1 to 4 Index page
case 2:
return "Backup & Restore Settings";
case 3:
return "Edit Additional WiFi Access Points";
case 4:
return "Upload New Firmware";
case 5:
return "Watchy Backup & Restore Settings"; // 5 to 6 Settings page
case 6:
return "Store"; // WiFi D
case 7:
return "Watchy settings restored! OTA Website Off"; // 5 to 7 for Settings Done
case 8:
return "Watchy Upload New Firmware"; // 8 to 13 Upgrade
case 9:
return "Upload";
case 10:
return "Waiting";
case 11:
return "You must select a firmware [bin] to upload!";
case 12:
return "Progress";
case 13:
return "Success";
case 14:
return "Watchy Additional WiFi Access Point Settings"; // WiFi A
case 15:
return "PASS"; // WiFi C
case 16:
return "Watchy Additional APs updated! OTA Website Off";
}
}
}
return "None";
};
/*
* GetWebLang retrieves the current language for the OTA website (2 letters usually).
*/
String GetWebLang(uint8_t LangID){
switch(LangID){
case 0:
return "en";
case 1:
return "None";
case 2:
return "None";
}
return "None";
};
/*
* GetLangName retrieves the current language (typically written in that language).
*/
String GetLangName(uint8_t LangID){
switch(LangID){
case 0:
return "English";
case 1:
return "None";
case 2:
return "None";
}
return "None";
};
/*
* GetWeekday retrieves the current day of week in language (0 to 6 input starting from
* Sunday)..
*/
String GetWeekday(uint8_t LangID, uint8_t ID){
switch(LangID){
case 0:{
switch(ID){
case 0:
return "Sunday";
case 1:
return "Monday";
case 2:
return "Tuesday";
case 3:
return "Wednesday";
case 4:
return "Thursday";
case 5:
return "Friday";
case 6:
return "Saturday";
}
}
}
return "None";
};
/*
* GetShortWeekday retrieves the current day of week in language (0 to 6 input starting from
* Sunday)..
*/
String GetShortWeekday(uint8_t LangID, uint8_t ID){
switch(LangID){
case 0:{
switch(ID){
case 0:
return "Sun";
case 1:
return "Mon";
case 2:
return "Tue";
case 3:
return "Wed";
case 4:
return "Thu";
case 5:
return "Fri";
case 6:
return "Sat";
}
}
}
return "Non";
};
/*
* GetMonth retrieves the current month in the language (0 to 11 input starting from the
* first month January).
*/
String GetMonth(uint8_t LangID, uint8_t ID){
switch(LangID){
case 0:{
switch(ID){
case 0:
return "January";
case 1:
return "February";
case 2:
return "March";
case 3:
return "April";
case 4:
return "May";
case 5:
return "June";
case 6:
return "July";
case 7:
return "August";
case 8:
return "September";
case 9:
return "October";
case 10:
return "November";
case 11:
return "December";
}
}
}
return "None";
};
/*
* GetShortMonth retrieves the current month in the language (0 to 11 input starting from the
* first month January).
*/
String GetShortMonth(uint8_t LangID, uint8_t ID){
switch(LangID){
case 0:{
switch(ID){
case 0:
return "Jan";
case 1:
return "Feb";
case 2:
return "Mar";
case 3:
return "Apr";
case 4:
return "May";
case 5:
return "Jun";
case 6:
return "Jul";
case 7:
return "Aug";
case 8:
return "Sep";
case 9:
return "Oct";
case 10:
return "Nov";
case 11:
return "Dec";
}
}
}
return "Non";
};
};
#endif

File diff suppressed because it is too large Load Diff

View File

@ -12,35 +12,27 @@
#include <WiFiClient.h>
#include <ArduinoOTA.h>
#include <Update.h>
#include <WiFiManager.h>
#include <WebServer.h>
#include <esp_wifi.h>
#include <HTTPClient.h>
#include <SmallRTC.h>
#include <SmallNTP.h>
#include <Olson2POSIX.h>
#include "GxEPD2_BW.h"
#include <GxEPD2_BW.h>
#include "Locale_GSR.h"
#include <mbedtls/base64.h>
#include <Wire.h>
#include <StableBMA.h>
#include "Fonts_GSR.h"
#include "Icons_GSR.h"
#include "ArduinoNvs.h"
#include "Bronova_Regular13pt7b.h"
#include "aAntiCorona10pt7b.h"
#include "aAntiCorona11pt7b.h"
#include "aAntiCorona12pt7b.h"
#include "aAntiCorona13pt7b.h"
#include "aAntiCorona14pt7b.h"
#include "aAntiCorona15pt7b.h"
#include "aAntiCorona16pt7b.h"
#include "aAntiCorona36pt7b.h"
class WatchyGSR{
public:
static SmallRTC SRTC;
static SmallNTP SNTP;
static GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display;
static constexpr const char* Build = "1.4.3J";
static constexpr const char* Build = "1.4.4";
enum DesOps {dSTATIC, dLEFT, dRIGHT, dCENTER};
public:
@ -49,20 +41,23 @@ class WatchyGSR{
virtual void StartWeb() final;
virtual void showWatchFace();
virtual void drawWatchFace(); //override this method for different watch faces
virtual void drawTime();
virtual void drawTime(uint8_t Flags = 0); // 32 means no AM/PM, 64 means add padding to <10 hour.
virtual void drawDay();
virtual void drawDate();
virtual void drawDate(bool Short = false); // Short month can be used.
virtual void drawYear();
virtual void handleButtonPress(uint8_t Pressed) final;
virtual void deepSleep() final;
virtual float getBatteryVoltage() final;
virtual float BatteryRead() final;
virtual bool IsDark() final;
virtual bool IsAM() final;
virtual bool IsPM() final;
virtual String GetLangWebID() final;
IRAM_ATTR virtual void handleInterrupt() final;
void drawChargeMe(bool Dark = false);
void drawStatus();
virtual void VibeTo(bool Mode) final;
virtual String MakeTime(int Hour, int Minutes, bool& Alarm) final;
virtual String MakeTime(int Hour, int Minutes, bool& Alarm) final; // For Hour | 32 means no AM/PM, | 64 means add padding to <10 hour.
virtual String MakeHour(uint8_t Hour) final;
virtual String MakeMinutes(uint8_t Minutes) final;
virtual uint16_t ForeColor() final;
@ -78,6 +73,8 @@ class WatchyGSR{
virtual void InsertDrawWatchStyle(uint8_t StyleID);
virtual void InsertInitWatchStyle(uint8_t StyleID);
virtual bool InsertHandlePressed(uint8_t SwitchNumber, bool &Haptic, bool &Refresh);
virtual void OverrideDefaultMenu(bool Override);
virtual void ShowDefaultMenu() final;
virtual uint8_t AddWatchStyle(String StyleName) final;
virtual String InsertNTPServer();
virtual void AllowDefaultWatchStyles(bool Allow = true) final;
@ -223,4 +220,5 @@ struct TimeData final {
extern Designing Design;
extern TimeData WatchTime;
extern StableBMA SBMA;
extern LocaleGSR LGSR;
#endif

View File

@ -1,6 +1,7 @@
//0x3e, 0x3f, 0x3f, 0x3c (separator for settings)
static const char basicIndex[] = {
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x6C, 0x61, 0x6E, 0x67, 0x3D, 0x22, 0x7B, 0x25, 0x4C, 0x41,
0x4E, 0x47, 0x25, 0x7D, 0x22, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x66, 0x67, 0x63,
0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x3E, 0x3C,
0x73, 0x74, 0x79, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61,
@ -29,28 +30,24 @@ static const char basicIndex[] = {
0x27, 0x32, 0x30, 0x25, 0x27, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x63, 0x65, 0x6E,
0x74, 0x65, 0x72, 0x27, 0x3E, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x63, 0x65,
0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D,
0x34, 0x3E, 0x3C, 0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x57, 0x61, 0x74, 0x63, 0x68, 0x79, 0x20, 0x43,
0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x20, 0x4F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F,
0x75, 0x3E, 0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63,
0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C,
0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x66, 0x6F, 0x6E,
0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x61,
0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3D, 0x27, 0x2F, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73,
0x27, 0x3E, 0x3C, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27,
0x73, 0x75, 0x62, 0x6D, 0x69, 0x74, 0x27, 0x3E, 0x42, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x26,
0x20, 0x52, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67,
0x73, 0x3C, 0x2F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x72, 0x6D,
0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74,
0x72, 0x3E, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20,
0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x61, 0x63, 0x74,
0x69, 0x6F, 0x6E, 0x20, 0x3D, 0x27, 0x2F, 0x77, 0x69, 0x66, 0x69, 0x27, 0x3E, 0x3C, 0x62, 0x75,
0x74, 0x74, 0x6F, 0x6E, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x73, 0x75, 0x62, 0x6D, 0x69,
0x74, 0x27, 0x3E, 0x45, 0x64, 0x69, 0x74, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E,
0x61, 0x6C, 0x20, 0x57, 0x69, 0x46, 0x69, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x50,
0x6F, 0x69, 0x6E, 0x74, 0x73, 0x3C, 0x2F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x3E, 0x3C, 0x2F,
0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64,
0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x5E, 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x3C,
0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x3C, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x00
0x34, 0x3E, 0x3C, 0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x7B, 0x25, 0x31, 0x25, 0x7D, 0x3C, 0x2F, 0x75,
0x3E, 0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65,
0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F,
0x74, 0x72, 0x3E, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74,
0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x61, 0x63,
0x74, 0x69, 0x6F, 0x6E, 0x3D, 0x27, 0x2F, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x27,
0x3E, 0x3C, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x73,
0x75, 0x62, 0x6D, 0x69, 0x74, 0x27, 0x3E, 0x7B, 0x25, 0x32, 0x25, 0x7D, 0x3C, 0x2F, 0x62, 0x75,
0x74, 0x74, 0x6F, 0x6E, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x66, 0x6F,
0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x72,
0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D,
0x32, 0x3E, 0x3C, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x3D,
0x27, 0x2F, 0x77, 0x69, 0x66, 0x69, 0x27, 0x3E, 0x3C, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x20,
0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74, 0x27, 0x3E, 0x7B, 0x25,
0x33, 0x25, 0x7D, 0x3C, 0x2F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x3E, 0x3C, 0x2F, 0x66, 0x6F,
0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C,
0x2F, 0x74, 0x72, 0x3E, 0x7B, 0x25, 0x5E, 0x25, 0x7D, 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65,
0x3E, 0x3C, 0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x3C, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x00
};
static const char basicOTA[] = {
@ -58,14 +55,14 @@ static const char basicOTA[] = {
0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6F,
0x6E, 0x3D, 0x27, 0x2F, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x27, 0x3E, 0x3C, 0x62, 0x75, 0x74,
0x74, 0x6F, 0x6E, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74,
0x27, 0x3E, 0x55, 0x70, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x4E, 0x65, 0x77, 0x20, 0x46, 0x69, 0x72,
0x6D, 0x77, 0x61, 0x72, 0x65, 0x3C, 0x2F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x3E, 0x3C, 0x2F,
0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64,
0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x00
0x27, 0x3E, 0x7B, 0x25, 0x34, 0x25, 0x7D, 0x3C, 0x2F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x3E,
0x3C, 0x2F, 0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F,
0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x00
};
static const char settingsA[] = {
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
static const char settingsIndex[] = {
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x6C, 0x61, 0x6E, 0x67, 0x3D, 0x22, 0x7B, 0x25, 0x4C, 0x41,
0x4E, 0x47, 0x25, 0x7D, 0x22, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x66, 0x67, 0x63,
0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x3E, 0x3C,
0x73, 0x74, 0x79, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61,
@ -104,35 +101,32 @@ static const char settingsA[] = {
0x27, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x27,
0x3E, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x63, 0x6F, 0x6C, 0x73, 0x70, 0x61, 0x6E,
0x3D, 0x32, 0x3E, 0x3C, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74,
0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x34, 0x3E, 0x3C, 0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x57, 0x61,
0x74, 0x63, 0x68, 0x79, 0x20, 0x42, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x26, 0x20, 0x52, 0x65,
0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x3C, 0x2F,
0x75, 0x3E, 0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63,
0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C,
0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x6C,
0x65, 0x66, 0x74, 0x27, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x62, 0x6F, 0x74,
0x74, 0x6F, 0x6D, 0x27, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D,
0x32, 0x3E, 0x3C, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x20, 0x69, 0x64, 0x3D, 0x27,
0x73, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x27, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x3D, 0x27,
0x73, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x27, 0x20, 0x72, 0x6F, 0x77, 0x73, 0x3D, 0x27,
0x35, 0x32, 0x27, 0x20, 0x63, 0x6F, 0x6C, 0x73, 0x3D, 0x27, 0x34, 0x30, 0x27, 0x3E, 0x00
};
static const char settingsB[] = {
0x3C, 0x2F, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E,
0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E,
0x3D, 0x27, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D,
0x27, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x27, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73,
0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70,
0x65, 0x3D, 0x27, 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74, 0x27, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65,
0x3D, 0x27, 0x53, 0x74, 0x6F, 0x72, 0x65, 0x27, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x66,
0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x2F,
0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x62,
0x6F, 0x64, 0x79, 0x3E, 0x3C, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x00
0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x34, 0x3E, 0x3C, 0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x7B, 0x25,
0x35, 0x25, 0x7D, 0x3C, 0x2F, 0x75, 0x3E, 0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E,
0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C,
0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x61, 0x6C, 0x69,
0x67, 0x6E, 0x3D, 0x27, 0x6C, 0x65, 0x66, 0x74, 0x27, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E,
0x3D, 0x27, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x27, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20,
0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,
0x20, 0x69, 0x64, 0x3D, 0x27, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x27, 0x20, 0x6E,
0x61, 0x6D, 0x65, 0x3D, 0x27, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x27, 0x20, 0x72,
0x6F, 0x77, 0x73, 0x3D, 0x27, 0x35, 0x32, 0x27, 0x20, 0x63, 0x6F, 0x6C, 0x73, 0x3D, 0x27, 0x34,
0x30, 0x27, 0x3E, 0x7B, 0x3F, 0x3F, 0x7D, 0x3C, 0x2F, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65,
0x61, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x74,
0x64, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, 0x20,
0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x27, 0x3E,
0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C, 0x69, 0x6E,
0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74,
0x27, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x3D, 0x27, 0x7B, 0x25, 0x36, 0x25, 0x7D, 0x27, 0x3E,
0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E,
0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x3C, 0x2F, 0x66,
0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x3C, 0x2F, 0x68, 0x74, 0x6D,
0x6C, 0x3E, 0x00
};
static const char settingsDone[] = {
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x6C, 0x61, 0x6E, 0x67, 0x3D, 0x22, 0x7B, 0x25, 0x4C, 0x41,
0x4E, 0x47, 0x25, 0x7D, 0x22, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x66, 0x67, 0x63,
0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x3E, 0x3C,
0x73, 0x74, 0x79, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61,
@ -169,22 +163,19 @@ static const char settingsDone[] = {
0x25, 0x27, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72,
0x27, 0x3E, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x63, 0x65, 0x6E, 0x74, 0x65,
0x72, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x34, 0x3E, 0x3C,
0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x57, 0x61, 0x74, 0x63, 0x68, 0x79, 0x20, 0x42, 0x61, 0x63, 0x6B,
0x75, 0x70, 0x20, 0x26, 0x20, 0x52, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x53, 0x65, 0x74,
0x74, 0x69, 0x6E, 0x67, 0x73, 0x3C, 0x2F, 0x75, 0x3E, 0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66,
0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72,
0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C,
0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x33, 0x3E, 0x57, 0x61, 0x74, 0x63,
0x68, 0x79, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x20, 0x72, 0x65, 0x73, 0x74,
0x6F, 0x72, 0x65, 0x64, 0x21, 0x20, 0x20, 0x4F, 0x54, 0x41, 0x20, 0x57, 0x65, 0x62, 0x73, 0x69,
0x74, 0x65, 0x20, 0x4F, 0x66, 0x66, 0x2E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E,
0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x7B, 0x25, 0x35, 0x25, 0x7D, 0x3C, 0x2F, 0x75, 0x3E, 0x3C, 0x2F,
0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74, 0x65,
0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E,
0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x33,
0x3E, 0x7B, 0x25, 0x37, 0x25, 0x7D, 0x2E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E,
0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x61,
0x62, 0x6C, 0x65, 0x3E, 0x3C, 0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x3C, 0x2F, 0x68, 0x74, 0x6D,
0x6C, 0x3E, 0x00
};
static const char updateIndex[] = {
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x6C, 0x61, 0x6E, 0x67, 0x3D, 0x22, 0x7B, 0x25, 0x4C, 0x41,
0x4E, 0x47, 0x25, 0x7D, 0x22, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x66, 0x67, 0x63,
0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x3E, 0x3C,
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3D, 0x27, 0x68, 0x74, 0x74, 0x70,
@ -224,78 +215,75 @@ static const char updateIndex[] = {
0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x27, 0x3E,
0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x63, 0x6F, 0x6C, 0x73, 0x70, 0x61, 0x6E, 0x3D,
0x32, 0x3E, 0x0D, 0x0A, 0x3C, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x66, 0x6F, 0x6E,
0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x34, 0x3E, 0x3C, 0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x57,
0x61, 0x74, 0x63, 0x68, 0x79, 0x20, 0x55, 0x70, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x4E, 0x65, 0x77,
0x20, 0x46, 0x69, 0x72, 0x6D, 0x77, 0x61, 0x72, 0x65, 0x3C, 0x2F, 0x75, 0x3E, 0x3C, 0x2F, 0x62,
0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72,
0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x0D,
0x0A, 0x3C, 0x74, 0x64, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x6C, 0x65, 0x66, 0x74,
0x27, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x32,
0x3E, 0x3C, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x66, 0x69,
0x6C, 0x65, 0x27, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x3D, 0x27, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
0x27, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3D, 0x27, 0x2E, 0x62, 0x69, 0x6E, 0x27, 0x3E,
0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x74, 0x64, 0x20,
0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x66,
0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x32, 0x3E, 0x3C, 0x69, 0x6E, 0x70,
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74, 0x27,
0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x3D, 0x27, 0x55, 0x70, 0x6C, 0x6F, 0x61, 0x64, 0x27, 0x3E,
0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E,
0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x0D, 0x0A, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x63,
0x6F, 0x6C, 0x73, 0x70, 0x61, 0x6E, 0x3D, 0x32, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x63, 0x65,
0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3D, 0x27, 0x70, 0x72,
0x67, 0x27, 0x3E, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6E, 0x67, 0x2E, 0x2E, 0x2E, 0x3C, 0x2F, 0x64,
0x69, 0x76, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64,
0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x3C, 0x2F,
0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x0D, 0x0A, 0x3C, 0x73,
0x63, 0x72, 0x69, 0x70, 0x74, 0x3E, 0x0D, 0x0A, 0x24, 0x28, 0x27, 0x66, 0x6F, 0x72, 0x6D, 0x27,
0x29, 0x2E, 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74, 0x28, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F,
0x6E, 0x28, 0x65, 0x29, 0x7B, 0x0D, 0x0A, 0x65, 0x2E, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6E, 0x74,
0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x28, 0x29, 0x3B, 0x0D, 0x0A, 0x69, 0x66, 0x28, 0x21,
0x24, 0x28, 0x27, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5B, 0x74, 0x79,
0x70, 0x65, 0x3D, 0x66, 0x69, 0x6C, 0x65, 0x5D, 0x27, 0x29, 0x2E, 0x76, 0x61, 0x6C, 0x28, 0x29,
0x29, 0x20, 0x7B, 0x20, 0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x27, 0x59, 0x6F, 0x75, 0x20, 0x6D,
0x75, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20, 0x61, 0x20, 0x66, 0x69, 0x72,
0x6D, 0x77, 0x61, 0x72, 0x65, 0x20, 0x5B, 0x62, 0x69, 0x6E, 0x5D, 0x20, 0x74, 0x6F, 0x20, 0x75,
0x70, 0x6C, 0x6F, 0x61, 0x64, 0x21, 0x27, 0x29, 0x3B, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E,
0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x3B, 0x20, 0x7D, 0x0D, 0x0A, 0x76, 0x61, 0x72, 0x20, 0x66,
0x6F, 0x72, 0x6D, 0x20, 0x3D, 0x20, 0x24, 0x28, 0x27, 0x23, 0x75, 0x70, 0x6C, 0x6F, 0x61, 0x64,
0x5F, 0x66, 0x6F, 0x72, 0x6D, 0x27, 0x29, 0x5B, 0x30, 0x5D, 0x3B, 0x0D, 0x0A, 0x76, 0x61, 0x72,
0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3D, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x6D,
0x44, 0x61, 0x74, 0x61, 0x28, 0x66, 0x6F, 0x72, 0x6D, 0x29, 0x3B, 0x0D, 0x0A, 0x24, 0x2E, 0x61,
0x6A, 0x61, 0x78, 0x28, 0x7B, 0x0D, 0x0A, 0x75, 0x72, 0x6C, 0x3A, 0x20, 0x27, 0x2F, 0x75, 0x70,
0x64, 0x61, 0x74, 0x65, 0x27, 0x2C, 0x0D, 0x0A, 0x74, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x27, 0x50,
0x4F, 0x53, 0x54, 0x27, 0x2C, 0x0D, 0x0A, 0x64, 0x61, 0x74, 0x61, 0x3A, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2C, 0x0D, 0x0A, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x3A,
0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x2C, 0x0D, 0x0A, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73,
0x44, 0x61, 0x74, 0x61, 0x3A, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x2C, 0x0D, 0x0A, 0x78, 0x68, 0x72,
0x3A, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x29, 0x20, 0x7B, 0x0D, 0x0A,
0x76, 0x61, 0x72, 0x20, 0x78, 0x68, 0x72, 0x20, 0x3D, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x77, 0x69,
0x6E, 0x64, 0x6F, 0x77, 0x2E, 0x58, 0x4D, 0x4C, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x28, 0x29, 0x3B, 0x0D, 0x0A, 0x78, 0x68, 0x72, 0x2E, 0x75, 0x70, 0x6C, 0x6F,
0x61, 0x64, 0x2E, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x65,
0x6E, 0x65, 0x72, 0x28, 0x27, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x65, 0x73, 0x73, 0x27, 0x2C, 0x20,
0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x65, 0x76, 0x74, 0x29, 0x20, 0x7B, 0x0D,
0x0A, 0x69, 0x66, 0x20, 0x28, 0x65, 0x76, 0x74, 0x2E, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x43,
0x6F, 0x6D, 0x70, 0x75, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x76, 0x61,
0x72, 0x20, 0x70, 0x65, 0x72, 0x20, 0x3D, 0x20, 0x65, 0x76, 0x74, 0x2E, 0x6C, 0x6F, 0x61, 0x64,
0x65, 0x64, 0x20, 0x2F, 0x20, 0x65, 0x76, 0x74, 0x2E, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x3B, 0x0D,
0x0A, 0x24, 0x28, 0x27, 0x23, 0x70, 0x72, 0x67, 0x27, 0x29, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x28,
0x27, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x65, 0x73, 0x73, 0x3A, 0x20, 0x27, 0x20, 0x2B, 0x20, 0x4D,
0x61, 0x74, 0x68, 0x2E, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x28, 0x70, 0x65, 0x72, 0x2A, 0x31, 0x30,
0x30, 0x29, 0x20, 0x2B, 0x20, 0x27, 0x25, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x7D,
0x2C, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x29, 0x3B, 0x0D, 0x0A, 0x72, 0x65, 0x74, 0x75, 0x72,
0x6E, 0x20, 0x78, 0x68, 0x72, 0x3B, 0x0D, 0x0A, 0x7D, 0x2C, 0x0D, 0x0A, 0x73, 0x75, 0x63, 0x63,
0x65, 0x73, 0x73, 0x3A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x64, 0x2C, 0x20,
0x73, 0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x2E, 0x6C, 0x6F,
0x67, 0x28, 0x27, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x21, 0x27, 0x29, 0x0D, 0x0A, 0x7D,
0x2C, 0x0D, 0x0A, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x3A, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69,
0x6F, 0x6E, 0x20, 0x28, 0x61, 0x2C, 0x20, 0x62, 0x2C, 0x20, 0x63, 0x29, 0x20, 0x7B, 0x0D, 0x0A,
0x7D, 0x0D, 0x0A, 0x7D, 0x29, 0x3B, 0x0D, 0x0A, 0x7D, 0x29, 0x3B, 0x0D, 0x0A, 0x3C, 0x2F, 0x73,
0x63, 0x72, 0x69, 0x70, 0x74, 0x3E, 0x3C, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x00
0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x34, 0x3E, 0x3C, 0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x7B,
0x25, 0x38, 0x25, 0x7D, 0x3C, 0x2F, 0x75, 0x3E, 0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F,
0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E,
0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x0D, 0x0A, 0x3C, 0x74, 0x64, 0x20,
0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x6C, 0x65, 0x66, 0x74, 0x27, 0x3E, 0x3C, 0x66, 0x6F,
0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x32, 0x3E, 0x3C, 0x69, 0x6E, 0x70,
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x66, 0x69, 0x6C, 0x65, 0x27, 0x20, 0x6E,
0x61, 0x6D, 0x65, 0x3D, 0x27, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x27, 0x20, 0x61, 0x63, 0x63,
0x65, 0x70, 0x74, 0x3D, 0x27, 0x2E, 0x62, 0x69, 0x6E, 0x27, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E,
0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E,
0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73,
0x69, 0x7A, 0x65, 0x20, 0x3D, 0x32, 0x3E, 0x3C, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79,
0x70, 0x65, 0x3D, 0x27, 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74, 0x27, 0x20, 0x76, 0x61, 0x6C, 0x75,
0x65, 0x3D, 0x27, 0x7B, 0x25, 0x39, 0x25, 0x7D, 0x27, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F,
0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x0D,
0x0A, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x63, 0x6F, 0x6C, 0x73, 0x70, 0x61, 0x6E,
0x3D, 0x32, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C,
0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3D, 0x27, 0x70, 0x72, 0x67, 0x27, 0x3E, 0x7B, 0x25, 0x31,
0x30, 0x25, 0x7D, 0x2E, 0x2E, 0x2E, 0x3C, 0x2F, 0x64, 0x69, 0x76, 0x3E, 0x3C, 0x2F, 0x63, 0x65,
0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C,
0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F,
0x62, 0x6F, 0x64, 0x79, 0x3E, 0x0D, 0x0A, 0x3C, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3E, 0x0D,
0x0A, 0x24, 0x28, 0x27, 0x66, 0x6F, 0x72, 0x6D, 0x27, 0x29, 0x2E, 0x73, 0x75, 0x62, 0x6D, 0x69,
0x74, 0x28, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x65, 0x29, 0x7B, 0x0D, 0x0A,
0x65, 0x2E, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6E, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74,
0x28, 0x29, 0x3B, 0x0D, 0x0A, 0x69, 0x66, 0x28, 0x21, 0x24, 0x28, 0x27, 0x66, 0x6F, 0x72, 0x6D,
0x20, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5B, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x66, 0x69, 0x6C, 0x65,
0x5D, 0x27, 0x29, 0x2E, 0x76, 0x61, 0x6C, 0x28, 0x29, 0x29, 0x20, 0x7B, 0x20, 0x61, 0x6C, 0x65,
0x72, 0x74, 0x28, 0x27, 0x7B, 0x25, 0x31, 0x31, 0x25, 0x7D, 0x27, 0x29, 0x3B, 0x20, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6E, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x3B, 0x20, 0x7D, 0x0D, 0x0A, 0x76,
0x61, 0x72, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x3D, 0x20, 0x24, 0x28, 0x27, 0x23, 0x75, 0x70,
0x6C, 0x6F, 0x61, 0x64, 0x5F, 0x66, 0x6F, 0x72, 0x6D, 0x27, 0x29, 0x5B, 0x30, 0x5D, 0x3B, 0x0D,
0x0A, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3D, 0x20, 0x6E, 0x65, 0x77, 0x20,
0x46, 0x6F, 0x72, 0x6D, 0x44, 0x61, 0x74, 0x61, 0x28, 0x66, 0x6F, 0x72, 0x6D, 0x29, 0x3B, 0x0D,
0x0A, 0x24, 0x2E, 0x61, 0x6A, 0x61, 0x78, 0x28, 0x7B, 0x0D, 0x0A, 0x75, 0x72, 0x6C, 0x3A, 0x20,
0x27, 0x2F, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x27, 0x2C, 0x0D, 0x0A, 0x74, 0x79, 0x70, 0x65,
0x3A, 0x20, 0x27, 0x50, 0x4F, 0x53, 0x54, 0x27, 0x2C, 0x0D, 0x0A, 0x64, 0x61, 0x74, 0x61, 0x3A,
0x20, 0x64, 0x61, 0x74, 0x61, 0x2C, 0x0D, 0x0A, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x54,
0x79, 0x70, 0x65, 0x3A, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x2C, 0x0D, 0x0A, 0x70, 0x72, 0x6F,
0x63, 0x65, 0x73, 0x73, 0x44, 0x61, 0x74, 0x61, 0x3A, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x2C, 0x0D,
0x0A, 0x78, 0x68, 0x72, 0x3A, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x29,
0x20, 0x7B, 0x0D, 0x0A, 0x76, 0x61, 0x72, 0x20, 0x78, 0x68, 0x72, 0x20, 0x3D, 0x20, 0x6E, 0x65,
0x77, 0x20, 0x77, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x2E, 0x58, 0x4D, 0x4C, 0x48, 0x74, 0x74, 0x70,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x29, 0x3B, 0x0D, 0x0A, 0x78, 0x68, 0x72, 0x2E,
0x75, 0x70, 0x6C, 0x6F, 0x61, 0x64, 0x2E, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x4C,
0x69, 0x73, 0x74, 0x65, 0x6E, 0x65, 0x72, 0x28, 0x27, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x65, 0x73,
0x73, 0x27, 0x2C, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x65, 0x76, 0x74,
0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x69, 0x66, 0x20, 0x28, 0x65, 0x76, 0x74, 0x2E, 0x6C, 0x65, 0x6E,
0x67, 0x74, 0x68, 0x43, 0x6F, 0x6D, 0x70, 0x75, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x29, 0x20, 0x7B,
0x0D, 0x0A, 0x76, 0x61, 0x72, 0x20, 0x70, 0x65, 0x72, 0x20, 0x3D, 0x20, 0x65, 0x76, 0x74, 0x2E,
0x6C, 0x6F, 0x61, 0x64, 0x65, 0x64, 0x20, 0x2F, 0x20, 0x65, 0x76, 0x74, 0x2E, 0x74, 0x6F, 0x74,
0x61, 0x6C, 0x3B, 0x0D, 0x0A, 0x24, 0x28, 0x27, 0x23, 0x70, 0x72, 0x67, 0x27, 0x29, 0x2E, 0x68,
0x74, 0x6D, 0x6C, 0x28, 0x27, 0x7B, 0x25, 0x31, 0x32, 0x25, 0x7D, 0x3A, 0x20, 0x27, 0x20, 0x2B,
0x20, 0x4D, 0x61, 0x74, 0x68, 0x2E, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x28, 0x70, 0x65, 0x72, 0x2A,
0x31, 0x30, 0x30, 0x29, 0x20, 0x2B, 0x20, 0x27, 0x25, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D,
0x0A, 0x7D, 0x2C, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x29, 0x3B, 0x0D, 0x0A, 0x72, 0x65, 0x74,
0x75, 0x72, 0x6E, 0x20, 0x78, 0x68, 0x72, 0x3B, 0x0D, 0x0A, 0x7D, 0x2C, 0x0D, 0x0A, 0x73, 0x75,
0x63, 0x63, 0x65, 0x73, 0x73, 0x3A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x64,
0x2C, 0x20, 0x73, 0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x2E,
0x6C, 0x6F, 0x67, 0x28, 0x27, 0x7B, 0x25, 0x31, 0x33, 0x25, 0x7D, 0x21, 0x27, 0x29, 0x0D, 0x0A,
0x7D, 0x2C, 0x0D, 0x0A, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x3A, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74,
0x69, 0x6F, 0x6E, 0x20, 0x28, 0x61, 0x2C, 0x20, 0x62, 0x2C, 0x20, 0x63, 0x29, 0x20, 0x7B, 0x0D,
0x0A, 0x7D, 0x0D, 0x0A, 0x7D, 0x29, 0x3B, 0x0D, 0x0A, 0x7D, 0x29, 0x3B, 0x0D, 0x0A, 0x3C, 0x2F,
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3E, 0x3C, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x00
};
static const char wifiIndexA[] = {
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x6C, 0x61, 0x6E, 0x67, 0x3D, 0x22, 0x7B, 0x25, 0x4C, 0x41,
0x4E, 0x47, 0x25, 0x7D, 0x22, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x66, 0x67, 0x63,
0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x3E, 0x3C,
0x73, 0x74, 0x79, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61,
@ -348,12 +336,10 @@ static const char wifiIndexA[] = {
0x3D, 0x27, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x27, 0x3E, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74,
0x64, 0x20, 0x63, 0x6F, 0x6C, 0x73, 0x70, 0x61, 0x6E, 0x3D, 0x35, 0x3E, 0x3C, 0x63, 0x65, 0x6E,
0x74, 0x65, 0x72, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x34,
0x3E, 0x3C, 0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x57, 0x61, 0x74, 0x63, 0x68, 0x79, 0x20, 0x41, 0x64,
0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x57, 0x69, 0x46, 0x69, 0x20, 0x41, 0x63,
0x63, 0x65, 0x73, 0x73, 0x20, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x20, 0x53, 0x65, 0x74, 0x74, 0x69,
0x6E, 0x67, 0x73, 0x3C, 0x2F, 0x75, 0x3E, 0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E,
0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C,
0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x00
0x3E, 0x3C, 0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x7B, 0x25, 0x31, 0x34, 0x25, 0x7D, 0x3C, 0x2F, 0x75,
0x3E, 0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65,
0x6E, 0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F,
0x74, 0x72, 0x3E, 0x00
};
static const char wifiIndexB[] = {
@ -369,23 +355,23 @@ static const char wifiIndexB[] = {
static const char wifiIndexC[] = {
0x3C, 0x74, 0x64, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x6C, 0x65, 0x66, 0x74, 0x27,
0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x50, 0x41,
0x53, 0x53, 0x3A, 0x3C, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27,
0x70, 0x61, 0x73, 0x73, 0x77, 0x6F, 0x72, 0x64, 0x27, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x3D, 0x27,
0x50, 0x41, 0x23, 0x27, 0x20, 0x69, 0x64, 0x3D, 0x27, 0x50, 0x41, 0x23, 0x27, 0x20, 0x73, 0x69,
0x7A, 0x65, 0x3D, 0x36, 0x33, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3D,
0x36, 0x33, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x3D, 0x27, 0x24, 0x27, 0x3E, 0x3C, 0x2F, 0x69,
0x6E, 0x70, 0x75, 0x74, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64,
0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x7B, 0x25,
0x31, 0x35, 0x25, 0x7D, 0x3A, 0x3C, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
0x3D, 0x27, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6F, 0x72, 0x64, 0x27, 0x20, 0x6E, 0x61, 0x6D, 0x65,
0x3D, 0x27, 0x50, 0x41, 0x23, 0x27, 0x20, 0x69, 0x64, 0x3D, 0x27, 0x50, 0x41, 0x23, 0x27, 0x20,
0x73, 0x69, 0x7A, 0x65, 0x3D, 0x36, 0x33, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74,
0x68, 0x3D, 0x36, 0x33, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x3D, 0x27, 0x24, 0x27, 0x3E, 0x3C,
0x2F, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F,
0x74, 0x64, 0x3E, 0x3C, 0x74, 0x64, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x62,
0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x27, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x6C, 0x65,
0x66, 0x74, 0x27, 0x3E, 0x3C, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x20, 0x6F, 0x6E, 0x63, 0x6C, 0x69,
0x63, 0x6B, 0x3D, 0x22, 0x74, 0x6F, 0x67, 0x67, 0x6C, 0x65, 0x28, 0x27, 0x50, 0x41, 0x23, 0x27,
0x29, 0x22, 0x3E, 0x3F, 0x3C, 0x2F, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x3E, 0x3C, 0x2F, 0x74, 0x64,
0x3E, 0x3C, 0x74, 0x64, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x62, 0x6F, 0x74,
0x74, 0x6F, 0x6D, 0x27, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x6C, 0x65, 0x66, 0x74,
0x27, 0x3E, 0x3C, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x20, 0x6F, 0x6E, 0x63, 0x6C, 0x69, 0x63, 0x6B,
0x3D, 0x22, 0x74, 0x6F, 0x67, 0x67, 0x6C, 0x65, 0x28, 0x27, 0x50, 0x41, 0x23, 0x27, 0x29, 0x22,
0x3E, 0x3F, 0x3C, 0x2F, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C,
0x74, 0x64, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x62, 0x6F, 0x74, 0x74, 0x6F,
0x6D, 0x27, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x6C, 0x65, 0x66, 0x74, 0x27, 0x3E,
0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C, 0x73, 0x65,
0x6C, 0x65, 0x63, 0x74, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x3D, 0x22, 0x54, 0x58, 0x23, 0x22, 0x20,
0x69, 0x64, 0x3D, 0x22, 0x54, 0x58, 0x23, 0x22, 0x3E, 0x00
0x27, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C,
0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x3D, 0x22, 0x54, 0x58, 0x23,
0x22, 0x20, 0x69, 0x64, 0x3D, 0x22, 0x54, 0x58, 0x23, 0x22, 0x3E, 0x00
};
static const char wifiIndexC1[] = {
@ -403,7 +389,7 @@ static const char wifiIndexD[] = {
0x27, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D,
0x27, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x32, 0x3E, 0x3C,
0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x27, 0x73, 0x75, 0x62, 0x6D,
0x69, 0x74, 0x27, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x3D, 0x27, 0x53, 0x74, 0x6F, 0x72, 0x65,
0x69, 0x74, 0x27, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x3D, 0x27, 0x7B, 0x25, 0x36, 0x25, 0x7D,
0x27, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74,
0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x3C,
0x2F, 0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x3C, 0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x3C, 0x2F, 0x68,
@ -411,7 +397,8 @@ static const char wifiIndexD[] = {
};
static const char wifiDone[] = {
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x6C, 0x61, 0x6E, 0x67, 0x3D, 0x22, 0x7B, 0x25, 0x4C, 0x41,
0x4E, 0x47, 0x25, 0x7D, 0x22, 0x3E, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6F,
0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x66, 0x67, 0x63,
0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x3E, 0x3C,
0x73, 0x74, 0x79, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61,
@ -448,16 +435,12 @@ static const char wifiDone[] = {
0x25, 0x27, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x27, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72,
0x27, 0x3E, 0x3C, 0x74, 0x72, 0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x63, 0x65, 0x6E, 0x74, 0x65,
0x72, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D, 0x34, 0x3E, 0x3C,
0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x57, 0x61, 0x74, 0x63, 0x68, 0x79, 0x20, 0x41, 0x64, 0x64, 0x69,
0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x50, 0x6F,
0x69, 0x6E, 0x74, 0x20, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x3C, 0x2F, 0x75, 0x3E,
0x3C, 0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E,
0x74, 0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74,
0x72, 0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65,
0x3D, 0x33, 0x3E, 0x57, 0x61, 0x74, 0x63, 0x68, 0x79, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69,
0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x41, 0x50, 0x73, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
0x21, 0x20, 0x20, 0x4F, 0x54, 0x41, 0x20, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x20, 0x4F,
0x66, 0x66, 0x2E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F,
0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E,
0x3C, 0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x3C, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x00
0x62, 0x3E, 0x3C, 0x75, 0x3E, 0x7B, 0x25, 0x31, 0x34, 0x25, 0x7D, 0x3C, 0x2F, 0x75, 0x3E, 0x3C,
0x2F, 0x62, 0x3E, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74,
0x65, 0x72, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72,
0x3E, 0x3C, 0x74, 0x64, 0x3E, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x3D,
0x33, 0x3E, 0x7B, 0x25, 0x31, 0x36, 0x25, 0x7D, 0x2E, 0x3C, 0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x66,
0x6F, 0x6E, 0x74, 0x3E, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x3C, 0x2F,
0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x3C, 0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x3C, 0x2F, 0x68,
0x74, 0x6D, 0x6C, 0x3E, 0x00
};