This commit is contained in:
anonymous 2025-07-11 21:28:24 +02:00
commit 08fddcd73e
364 changed files with 111462 additions and 0 deletions

View file

@ -0,0 +1,29 @@
*.suo
*.user
*.ncb
[Dd]ebug/
[Dd]ebug-Tools/
[Dd]ebug-Xenium/
[Dd]ebug-Xtremium/
[Dd]ebug-Xecuter/
[Dd]ebug-Xchanger/
[Dd]ebug-Smartxx/
[Dd]ebug-Modxo/
[Dd]ebug-Aladdin1mb/
[Dd]ebug-Aladdin2mb/
[Dd]ebug-Dummy/
[Dd]ebugPublic/
[Rr]elease/
[Rr]elease-Tools/
[Rr]elease-Xenium/
[Rr]elease-Xtremium/
[Rr]elease-Xecuter/
[Rr]elease-Xchanger/
[Rr]elease-Smartxx/
[Rr]elease-Modxo/
[Rr]elease-Aladdin1mb/
[Rr]elease-Aladdin2mb/
[Rr]elease-Dummy/
[Rr]eleases/

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -0,0 +1 @@
bundler titleimage.rdf

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View file

@ -0,0 +1,5 @@
// Automatically generated by the bundler tool from titleimage.rdf
#define titleimage_NUM_RESOURCES 1UL
#define titleimage_titleimage_OFFSET 0UL

View file

@ -0,0 +1,7 @@
Texture titleimage
{
Source titleimage.bmp
Format D3DFMT_DXT1
Width 128
Height 128
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="1000" width="1000" xmlns:xlink="http://www.w3.org/1999/xlink">
<metadata>IcoFont Icons</metadata>
<title>file-fill</title>
<glyph glyph-name="file-fill" unicode="&#xef27;" horiz-adv-x="1000" />
<path d="M777.8 191.9c-15.899999999999977-19.099999999999994-31.899999999999977-38.30000000000001-47.89999999999998-57.400000000000006-12.600000000000023-15.099999999999994-25.399999999999977-30.099999999999994-38.10000000000002-45.2-12.5-14.799999999999997-38.09999999999991-26.799999999999997-57.09999999999991-26.799999999999997h-400.70000000000005c-19 0-34.5 15.900000000000006-34.5 35.5v804c0 19.600000000000023 15.5 35.39999999999998 34.5 35.39999999999998h531.9c19 0 34.39999999999998-15.799999999999955 34.39999999999998-35.39999999999998v-647.7c-0.09999999999990905-19.599999999999966-10.099999999999909-47.49999999999994-22.5-62.39999999999995z"/>
</svg>

After

Width:  |  Height:  |  Size: 944 B

View file

@ -0,0 +1,7 @@
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="1000" width="1000" xmlns:xlink="http://www.w3.org/1999/xlink">
<metadata>IcoFont Icons</metadata>
<title>folder</title>
<glyph glyph-name="folder" unicode="&#xef36;" horiz-adv-x="1000" />
<path d="M885.6 246.2h-327.70000000000005l-16.299999999999955-34.599999999999994c-13.399999999999977-28.400000000000006-40.10000000000002-46.29999999999998-69.10000000000002-46.29999999999998h-358c-28.700000000000003 0-52 25.69999999999999-52 57.29999999999998v555c0 31.600000000000023 23.299999999999997 57.299999999999955 52 57.299999999999955h771c28.700000000000045 0 52-25.699999999999932 52-57.299999999999955v-474.1c0.10000000000002274-31.600000000000023-23.200000000000045-57.30000000000001-51.89999999999998-57.30000000000001z"/>
</svg>

After

Width:  |  Height:  |  Size: 818 B

View file

@ -0,0 +1,72 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PrometheOSXbe", "PrometheOSXbe\PrometheOSXbe.vcproj", "{03813F8D-2AD5-44E4-B724-44240DB90B0B}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug-Aladdin1mb = Debug-Aladdin1mb
Debug-Aladdin2mb = Debug-Aladdin2mb
Debug-Dummy = Debug-Dummy
Debug-Modxo = Debug-Modxo
Debug-Tools = Debug-Tools
Debug-Xchanger = Debug-Xchanger
Debug-Xecuter = Debug-Xecuter
Debug-Xenium = Debug-Xenium
Profile = Profile
Profile_FastCap = Profile_FastCap
Release_LTCG = Release_LTCG
Release-Aladdin1mb = Release-Aladdin1mb
Release-Aladdin2mb = Release-Aladdin2mb
Release-Dummy = Release-Dummy
Release-Modxo = Release-Modxo
Release-Tools = Release-Tools
Release-Xchanger = Release-Xchanger
Release-Xecuter = Release-Xecuter
Release-Xenium = Release-Xenium
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Aladdin1mb.ActiveCfg = Debug-Aladdin1mb|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Aladdin1mb.Build.0 = Debug-Aladdin1mb|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Aladdin2mb.ActiveCfg = Debug-Aladdin2mb|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Aladdin2mb.Build.0 = Debug-Aladdin2mb|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Dummy.ActiveCfg = Debug-Dummy|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Dummy.Build.0 = Debug-Dummy|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Modxo.ActiveCfg = Debug-Modxo|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Modxo.Build.0 = Debug-Modxo|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Tools.ActiveCfg = Debug-Tools|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Tools.Build.0 = Debug-Tools|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Xchanger.ActiveCfg = Debug-Xchanger|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Xchanger.Build.0 = Debug-Xchanger|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Xecuter.ActiveCfg = Debug-Xecuter|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Xecuter.Build.0 = Debug-Xecuter|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Xenium.ActiveCfg = Debug-Xenium|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Debug-Xenium.Build.0 = Debug-Xenium|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Profile.ActiveCfg = Profile|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Profile.Build.0 = Profile|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Profile_FastCap.ActiveCfg = Profile_FastCap|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Profile_FastCap.Build.0 = Profile_FastCap|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release_LTCG.ActiveCfg = Release_LTCG|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release_LTCG.Build.0 = Release_LTCG|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Aladdin1mb.ActiveCfg = Release-Aladdin1mb|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Aladdin1mb.Build.0 = Release-Aladdin1mb|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Aladdin2mb.ActiveCfg = Release-Aladdin2mb|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Aladdin2mb.Build.0 = Release-Aladdin2mb|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Dummy.ActiveCfg = Release-Dummy|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Dummy.Build.0 = Release-Dummy|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Modxo.ActiveCfg = Release-Modxo|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Modxo.Build.0 = Release-Modxo|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Tools.ActiveCfg = Release-Tools|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Tools.Build.0 = Release-Tools|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Xchanger.ActiveCfg = Release-Xchanger|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Xchanger.Build.0 = Release-Xchanger|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Xecuter.ActiveCfg = Release-Xecuter|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Xecuter.Build.0 = Release-Xecuter|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Xenium.ActiveCfg = Release-Xenium|Xbox
{03813F8D-2AD5-44E4-B724-44240DB90B0B}.Release-Xenium.Build.0 = Release-Xenium|Xbox
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,801 @@
#pragma once
const uint8_t font_sfn[] = {
0x53, 0x46, 0x4E, 0x32, 0x53, 0x25, 0x00, 0x00, 0x10, 0x00, 0xDF, 0xFF,
0xD4, 0xF5, 0x79, 0x00, 0x07, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xAC, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x72, 0x69, 0x61,
0x6C, 0x20, 0x42, 0x6F, 0x6C, 0x64, 0x00, 0x41, 0x72, 0x69, 0x61, 0x6C,
0x00, 0x42, 0x6F, 0x6C, 0x64, 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F,
0x6E, 0x20, 0x32, 0x2E, 0x39, 0x30, 0x00, 0x4D, 0x6F, 0x6E, 0x6F, 0x74,
0x79, 0x70, 0x65, 0x20, 0x54, 0x79, 0x70, 0x6F, 0x67, 0x72, 0x61, 0x70,
0x68, 0x79, 0x00, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54,
0x49, 0x4F, 0x4E, 0x20, 0x4F, 0x46, 0x20, 0x4C, 0x49, 0x43, 0x45, 0x4E,
0x53, 0x45, 0x20, 0x41, 0x47, 0x52, 0x45, 0x45, 0x4D, 0x45, 0x4E, 0x54,
0x00, 0x04, 0x54, 0x01, 0x00, 0x1D, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x1D,
0x00, 0x1D, 0x08, 0xFC, 0xFF, 0x03, 0x6F, 0x00, 0x20, 0x21, 0x50, 0x00,
0x35, 0x0D, 0x00, 0x6F, 0x0C, 0x35, 0x00, 0x51, 0x20, 0xBE, 0x00, 0x8E,
0x0C, 0xAA, 0x6F, 0xDE, 0x35, 0xD2, 0x50, 0xDE, 0xBD, 0xBE, 0x8D, 0xDE,
0xA9, 0xD2, 0xDE, 0x6F, 0xD1, 0xAA, 0xDE, 0x8E, 0xBD, 0x21, 0xDE, 0x51,
0xD1, 0x35, 0x6F, 0x00, 0xA9, 0x0D, 0x8D, 0x00, 0x08, 0xFC, 0xFF, 0x03,
0xAB, 0x1D, 0xC8, 0x63, 0xBD, 0x2F, 0xC8, 0x48, 0xAB, 0xAA, 0xC8, 0x7F,
0xBD, 0x98, 0x64, 0xC7, 0x99, 0xBC, 0x80, 0xC7, 0x1D, 0xAA, 0x48, 0xC7,
0x2F, 0xBC, 0x00, 0x63, 0x0B, 0x98, 0x00, 0x7F, 0x1D, 0x1D, 0x00, 0x48,
0x0B, 0x2F, 0x64, 0x00, 0x2F, 0x0B, 0x48, 0x00, 0xAB, 0x1D, 0x80, 0x00,
0x99, 0x0B, 0x04, 0x54, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x1D, 0x00, 0x1D,
0x1A, 0x00, 0x1A, 0x06, 0x54, 0x15, 0x05, 0x35, 0x00, 0x19, 0x00, 0x00,
0x1F, 0x00, 0x1F, 0x19, 0x1B, 0x35, 0x05, 0x35, 0x09, 0xF4, 0xFF, 0x05,
0x00, 0x00, 0x0E, 0x00, 0x24, 0x01, 0x1A, 0x00, 0x21, 0x00, 0x2D, 0x05,
0x28, 0x01, 0x2B, 0x03, 0x31, 0x0F, 0x2F, 0x08, 0x31, 0x0B, 0x2D, 0x18,
0x31, 0x13, 0x2F, 0x16, 0x23, 0x1D, 0x2A, 0x1B, 0x27, 0x1C, 0x10, 0x1D,
0x20, 0x1D, 0x1A, 0x1D, 0x00, 0x1D, 0x00, 0x00, 0x09, 0xF4, 0xFF, 0x05,
0x00, 0x00, 0x14, 0x00, 0x2A, 0x02, 0x1F, 0x00, 0x27, 0x01, 0x32, 0x08,
0x2E, 0x03, 0x31, 0x05, 0x35, 0x11, 0x34, 0x0B, 0x35, 0x0E, 0x32, 0x1C,
0x35, 0x16, 0x34, 0x1A, 0x28, 0x21, 0x2F, 0x1F, 0x2C, 0x20, 0x17, 0x22,
0x26, 0x22, 0x20, 0x22, 0x00, 0x22, 0x00, 0x00, 0x0A, 0x94, 0x9A, 0x16,
0x02, 0x00, 0x1F, 0x00, 0x1F, 0x15, 0x1D, 0x28, 0x1F, 0x21, 0x15, 0x35,
0x1B, 0x2F, 0x06, 0x3E, 0x0F, 0x3B, 0x00, 0x32, 0x0C, 0x2A, 0x09, 0x2F,
0x10, 0x1D, 0x10, 0x25, 0x02, 0x1D, 0x02, 0x00, 0x0F, 0xD4, 0xFF, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x7E, 0x2B, 0x7E, 0x49, 0x7D, 0x3B, 0x7E, 0x45,
0x7E, 0x5A, 0x77, 0x50, 0x7D, 0x56, 0x7B, 0x65, 0x6A, 0x5F, 0x74, 0x63,
0x70, 0x69, 0x5A, 0x68, 0x65, 0x69, 0x5F, 0x63, 0x47, 0x69, 0x52, 0x67,
0x4C, 0x52, 0x3B, 0x5F, 0x41, 0x59, 0x3E, 0x5F, 0x30, 0x57, 0x39, 0x5B,
0x35, 0x63, 0x20, 0x62, 0x2B, 0x63, 0x26, 0x5F, 0x11, 0x63, 0x1B, 0x62,
0x16, 0x56, 0x07, 0x5D, 0x0D, 0x5A, 0x0A, 0x48, 0x02, 0x52, 0x04, 0x4D,
0x02, 0x32, 0x00, 0x44, 0x01, 0x3C, 0x00, 0x00, 0x00, 0x03, 0x54, 0x23,
0x2E, 0x00, 0x2E, 0x12, 0x00, 0x23, 0x2E, 0x03, 0x54, 0x29, 0x37, 0x14,
0x00, 0x00, 0x37, 0x29, 0x37, 0x03, 0x54, 0x22, 0x33, 0x22, 0x00, 0x00,
0x33, 0x22, 0x33, 0x04, 0x54, 0x01, 0x00, 0x96, 0x00, 0x00, 0x2B, 0x00,
0x2B, 0x96, 0x00, 0x96, 0x04, 0x54, 0x01, 0x00, 0x96, 0x00, 0x00, 0x1E,
0x00, 0x1E, 0x96, 0x00, 0x96, 0x04, 0x54, 0x01, 0x06, 0x00, 0x00, 0x1E,
0x16, 0x1E, 0x1C, 0x00, 0x06, 0x00, 0x04, 0x54, 0x01, 0x16, 0x9E, 0x00,
0x9E, 0x50, 0x00, 0x65, 0x00, 0x16, 0x9E, 0x04, 0x54, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x54, 0x01, 0x2E,
0x1F, 0x1C, 0x1F, 0x00, 0x00, 0x20, 0x00, 0x2E, 0x1F, 0x04, 0x54, 0x01,
0x00, 0x12, 0x00, 0x00, 0x78, 0x00, 0x78, 0x12, 0x00, 0x12, 0x04, 0x54,
0x01, 0x00, 0x1B, 0x00, 0x00, 0x69, 0x00, 0x69, 0x1B, 0x00, 0x1B, 0x04,
0x54, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x69, 0x00, 0x69, 0x1A, 0x00, 0x1A,
0x04, 0x54, 0x01, 0x00, 0x96, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x96, 0x00,
0x96, 0x04, 0x54, 0x01, 0x00, 0x6D, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x6D,
0x00, 0x6D, 0x04, 0x54, 0x01, 0x00, 0x00, 0x15, 0x00, 0x3B, 0x9B, 0x25,
0x9B, 0x00, 0x00, 0x04, 0x54, 0x01, 0x00, 0x1D, 0x00, 0x00, 0x38, 0x00,
0x38, 0x1D, 0x00, 0x1D, 0x04, 0x54, 0x01, 0x00, 0xC3, 0x00, 0x00, 0x17,
0x00, 0x17, 0xC3, 0x00, 0xC3, 0x04, 0x54, 0x01, 0x00, 0x9B, 0x25, 0x00,
0x3B, 0x00, 0x15, 0x9B, 0x00, 0x9B, 0x05, 0xA8, 0x06, 0x0D, 0x00, 0x03,
0x07, 0x07, 0x02, 0x00, 0x12, 0x00, 0x0C, 0x03, 0x1C, 0x00, 0x17, 0x0D,
0x23, 0x06, 0x21, 0x0D, 0x00, 0x05, 0xA8, 0x06, 0x00, 0x28, 0x0C, 0x21,
0x07, 0x27, 0x11, 0x13, 0x11, 0x1B, 0x0D, 0x08, 0x11, 0x0D, 0x00, 0x00,
0x09, 0x03, 0x00, 0x28, 0x05, 0xA8, 0x06, 0x2B, 0x19, 0x25, 0x06, 0x2B,
0x0D, 0x16, 0x00, 0x1E, 0x00, 0x06, 0x06, 0x0C, 0x00, 0x00, 0x19, 0x00,
0x0D, 0x2B, 0x19, 0x06, 0x54, 0x15, 0x00, 0x53, 0x3B, 0x53, 0x3B, 0x45,
0x11, 0x45, 0x11, 0x00, 0x00, 0x00, 0x00, 0x53, 0x06, 0x54, 0x15, 0x06,
0x35, 0x00, 0x19, 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x19, 0x1B, 0x35, 0x06,
0x35, 0x06, 0x54, 0x15, 0x00, 0x95, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x7B,
0x6A, 0x7B, 0x6A, 0x95, 0x00, 0x95, 0x06, 0x54, 0x15, 0x07, 0x6F, 0x00,
0x23, 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x23, 0x18, 0x6F, 0x07, 0x6F, 0x07,
0x54, 0x55, 0x00, 0x52, 0x26, 0x00, 0x3D, 0x00, 0x63, 0x52, 0x46, 0x52,
0x31, 0x20, 0x1D, 0x52, 0x00, 0x52, 0x07, 0xFC, 0x7F, 0x00, 0xC7, 0x07,
0x40, 0x00, 0x92, 0x02, 0x64, 0x19, 0x00, 0x0B, 0x1F, 0x11, 0x08, 0x1C,
0x00, 0x1A, 0x00, 0x1B, 0x00, 0x9D, 0x39, 0x65, 0x00, 0x8A, 0x15, 0xAD,
0xA0, 0xAA, 0x54, 0xAD, 0x78, 0xAD, 0xC7, 0xAD, 0xAD, 0xAD, 0xBA, 0x00,
0xC7, 0x07, 0x54, 0x55, 0x00, 0x72, 0x00, 0x55, 0x48, 0x39, 0x00, 0x1D,
0x00, 0x00, 0x67, 0x2C, 0x67, 0x45, 0x00, 0x72, 0x07, 0xA8, 0x6A, 0x14,
0x00, 0x05, 0x0C, 0x0A, 0x05, 0x00, 0x1B, 0x00, 0x13, 0x07, 0x2A, 0x00,
0x24, 0x17, 0x30, 0x0D, 0x30, 0x24, 0x2D, 0x1E, 0x30, 0x31, 0x24, 0x2A,
0x2A, 0x14, 0x00, 0x07, 0xFC, 0x7F, 0x01, 0xC7, 0x00, 0xA0, 0x00, 0xBA,
0x00, 0xAD, 0x11, 0x39, 0x00, 0x78, 0x03, 0x54, 0x91, 0x00, 0x23, 0x15,
0x48, 0x00, 0x94, 0x00, 0x92, 0x00, 0x93, 0x00, 0xA7, 0x40, 0x9D, 0x08,
0xA3, 0x1F, 0xAD, 0xC7, 0xAB, 0x64, 0xAD, 0x92, 0x01, 0xC7, 0x07, 0x54,
0x55, 0x36, 0x96, 0x00, 0x00, 0x21, 0x00, 0x47, 0x6F, 0x6C, 0x00, 0x8C,
0x00, 0x56, 0x96, 0x36, 0x96, 0x07, 0x54, 0x55, 0x67, 0x72, 0x00, 0x45,
0x00, 0x2C, 0x67, 0x00, 0x67, 0x1D, 0x1F, 0x38, 0x67, 0x55, 0x67, 0x72,
0x08, 0x54, 0x55, 0x01, 0x2D, 0x96, 0x2D, 0x19, 0x00, 0x19, 0x00, 0x00,
0x77, 0x00, 0x77, 0x19, 0x4B, 0x19, 0x4B, 0x96, 0x2D, 0x96, 0x08, 0xA8,
0xAA, 0x02, 0x00, 0x12, 0x05, 0x1F, 0x00, 0x1A, 0x12, 0x24, 0x0A, 0x24,
0x1F, 0x1F, 0x1A, 0x24, 0x24, 0x12, 0x24, 0x1A, 0x1F, 0x05, 0x24, 0x0A,
0x12, 0x00, 0x1A, 0x00, 0x05, 0x05, 0x0A, 0x00, 0x00, 0x12, 0x00, 0x0A,
0x08, 0xA8, 0xAA, 0x02, 0x00, 0x17, 0x06, 0x2A, 0x00, 0x23, 0x16, 0x30,
0x0D, 0x30, 0x24, 0x2A, 0x1F, 0x30, 0x2A, 0x17, 0x2A, 0x23, 0x24, 0x07,
0x2A, 0x0D, 0x15, 0x00, 0x1E, 0x00, 0x05, 0x07, 0x0B, 0x00, 0x00, 0x17,
0x00, 0x0F, 0x08, 0xA8, 0xAA, 0x02, 0x31, 0x21, 0x2A, 0x08, 0x31, 0x10,
0x19, 0x00, 0x23, 0x00, 0x07, 0x08, 0x0E, 0x00, 0x00, 0x23, 0x00, 0x11,
0x07, 0x3D, 0x00, 0x35, 0x18, 0x44, 0x0E, 0x44, 0x29, 0x3C, 0x22, 0x44,
0x31, 0x21, 0x31, 0x33, 0x08, 0xA8, 0xAA, 0x02, 0x00, 0x21, 0x08, 0x3C,
0x00, 0x33, 0x19, 0x44, 0x0F, 0x44, 0x2A, 0x3C, 0x23, 0x44, 0x31, 0x22,
0x31, 0x34, 0x2A, 0x09, 0x31, 0x11, 0x19, 0x00, 0x23, 0x00, 0x07, 0x08,
0x0E, 0x00, 0x00, 0x21, 0x00, 0x11, 0x08, 0xA8, 0xAA, 0x02, 0x28, 0x1D,
0x21, 0x08, 0x28, 0x0F, 0x13, 0x00, 0x1B, 0x00, 0x05, 0x06, 0x0B, 0x00,
0x00, 0x1B, 0x00, 0x0D, 0x06, 0x30, 0x00, 0x29, 0x14, 0x37, 0x0C, 0x37,
0x22, 0x30, 0x1D, 0x37, 0x28, 0x1D, 0x28, 0x2A, 0x08, 0x54, 0x55, 0x01,
0x2E, 0x8F, 0x2E, 0x21, 0x00, 0x21, 0x00, 0x00, 0x7D, 0x00, 0x7D, 0x21,
0x4F, 0x21, 0x4F, 0x8F, 0x2E, 0x8F, 0x08, 0x54, 0x55, 0x01, 0x18, 0x53,
0x29, 0x53, 0x29, 0x0E, 0x42, 0x0E, 0x42, 0x00, 0x00, 0x00, 0x00, 0x0E,
0x18, 0x0E, 0x18, 0x53, 0x08, 0x54, 0x55, 0x01, 0x00, 0xC0, 0x00, 0x00,
0x33, 0x00, 0x33, 0x16, 0x1B, 0x16, 0x1B, 0xA9, 0x33, 0xA9, 0x33, 0xC0,
0x00, 0xC0, 0x08, 0xA8, 0xAA, 0x02, 0x00, 0x34, 0x0C, 0x5A, 0x00, 0x4D,
0x2A, 0x67, 0x18, 0x67, 0x48, 0x5A, 0x3C, 0x67, 0x53, 0x33, 0x53, 0x4D,
0x48, 0x0D, 0x53, 0x19, 0x2A, 0x00, 0x3D, 0x00, 0x0C, 0x0D, 0x17, 0x00,
0x00, 0x34, 0x00, 0x1A, 0x08, 0xA8, 0xAA, 0x02, 0x00, 0x1A, 0x07, 0x30,
0x00, 0x28, 0x15, 0x37, 0x0D, 0x37, 0x23, 0x31, 0x1D, 0x37, 0x28, 0x1D,
0x28, 0x2B, 0x22, 0x07, 0x28, 0x0E, 0x14, 0x00, 0x1D, 0x00, 0x06, 0x07,
0x0C, 0x00, 0x00, 0x1A, 0x00, 0x0D, 0x08, 0xA8, 0xAA, 0x02, 0x00, 0x21,
0x08, 0x3A, 0x00, 0x32, 0x1B, 0x43, 0x10, 0x43, 0x2E, 0x3A, 0x26, 0x43,
0x36, 0x21, 0x36, 0x32, 0x2E, 0x09, 0x36, 0x11, 0x1B, 0x00, 0x26, 0x00,
0x08, 0x09, 0x10, 0x00, 0x00, 0x21, 0x00, 0x11, 0x08, 0x54, 0x55, 0x01,
0x19, 0x53, 0x2A, 0x53, 0x2A, 0x0E, 0x43, 0x0E, 0x43, 0x00, 0x00, 0x00,
0x00, 0x0E, 0x19, 0x0E, 0x19, 0x53, 0x08, 0x54, 0x55, 0x01, 0x33, 0x00,
0x33, 0xC0, 0x00, 0xC0, 0x00, 0xA9, 0x18, 0xA9, 0x18, 0x16, 0x00, 0x16,
0x00, 0x00, 0x33, 0x00, 0x08, 0xA8, 0xAA, 0x02, 0x00, 0x28, 0x09, 0x0A,
0x00, 0x14, 0x21, 0x00, 0x12, 0x00, 0x3A, 0x0A, 0x31, 0x00, 0x42, 0x28,
0x42, 0x14, 0x3A, 0x46, 0x42, 0x3C, 0x22, 0x50, 0x31, 0x50, 0x09, 0x46,
0x12, 0x50, 0x00, 0x28, 0x00, 0x3C, 0x08, 0x54, 0x55, 0x01, 0x97, 0x96,
0x76, 0x96, 0x68, 0x74, 0x2D, 0x74, 0x20, 0x96, 0x00, 0x96, 0x3A, 0x00,
0x5A, 0x00, 0x97, 0x96, 0x08, 0x94, 0x69, 0x01, 0x42, 0x97, 0x25, 0x97,
0x25, 0x2A, 0x00, 0x40, 0x15, 0x39, 0x00, 0x26, 0x18, 0x18, 0x0B, 0x22,
0x2B, 0x00, 0x26, 0x0E, 0x42, 0x00, 0x42, 0x97, 0x08, 0xA8, 0xAA, 0x02,
0x00, 0x20, 0x07, 0x3A, 0x00, 0x31, 0x18, 0x41, 0x0E, 0x41, 0x2A, 0x39,
0x22, 0x41, 0x31, 0x21, 0x31, 0x31, 0x2A, 0x08, 0x31, 0x10, 0x18, 0x00,
0x23, 0x00, 0x07, 0x08, 0x0E, 0x00, 0x00, 0x20, 0x00, 0x10, 0x08, 0xA8,
0xAA, 0x02, 0x00, 0x17, 0x03, 0x2A, 0x00, 0x26, 0x0A, 0x2E, 0x06, 0x2E,
0x11, 0x2B, 0x0F, 0x2E, 0x14, 0x17, 0x14, 0x26, 0x11, 0x03, 0x14, 0x08,
0x0A, 0x00, 0x0F, 0x00, 0x03, 0x03, 0x05, 0x00, 0x00, 0x17, 0x00, 0x08,
0x08, 0xA8, 0xAA, 0x02, 0x00, 0x18, 0x04, 0x2B, 0x00, 0x26, 0x0B, 0x2F,
0x06, 0x2F, 0x12, 0x2B, 0x0F, 0x2F, 0x15, 0x18, 0x15, 0x26, 0x12, 0x04,
0x15, 0x09, 0x0B, 0x00, 0x0F, 0x00, 0x04, 0x04, 0x06, 0x00, 0x00, 0x18,
0x00, 0x09, 0x08, 0x54, 0x55, 0x01, 0x7F, 0x7E, 0x4C, 0x00, 0x31, 0x00,
0x00, 0x7E, 0x1B, 0x7E, 0x26, 0x62, 0x58, 0x62, 0x63, 0x7E, 0x7F, 0x7E,
0x08, 0xA8, 0xAA, 0x02, 0x31, 0x00, 0x53, 0x10, 0x47, 0x00, 0x61, 0x4D,
0x61, 0x22, 0x53, 0x8A, 0x61, 0x77, 0x31, 0x99, 0x47, 0x99, 0x0D, 0x88,
0x1B, 0x99, 0x00, 0x4C, 0x00, 0x78, 0x0F, 0x0F, 0x00, 0x22, 0x31, 0x00,
0x1B, 0x00, 0x08, 0xA8, 0xAA, 0x02, 0x00, 0x20, 0x05, 0x39, 0x00, 0x31,
0x19, 0x44, 0x0C, 0x44, 0x2A, 0x3C, 0x23, 0x44, 0x30, 0x23, 0x30, 0x34,
0x2A, 0x08, 0x30, 0x10, 0x18, 0x00, 0x23, 0x00, 0x07, 0x08, 0x0E, 0x00,
0x00, 0x20, 0x00, 0x10, 0x08, 0xA4, 0xAA, 0x01, 0x0D, 0x21, 0x15, 0x1B,
0x1E, 0x0E, 0x1E, 0x14, 0x1A, 0x04, 0x1E, 0x08, 0x0E, 0x00, 0x16, 0x00,
0x04, 0x04, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x07, 0x06, 0x19, 0x00, 0x11,
0x0D, 0x21, 0x08, 0xA8, 0xAA, 0x02, 0x00, 0x20, 0x05, 0x39, 0x00, 0x31,
0x19, 0x44, 0x0C, 0x44, 0x29, 0x3C, 0x22, 0x44, 0x30, 0x23, 0x30, 0x34,
0x29, 0x08, 0x30, 0x10, 0x18, 0x00, 0x22, 0x00, 0x06, 0x08, 0x0D, 0x00,
0x00, 0x20, 0x00, 0x10, 0x08, 0xA8, 0xAA, 0x02, 0x00, 0x28, 0x09, 0x0A,
0x00, 0x14, 0x21, 0x00, 0x12, 0x00, 0x39, 0x0A, 0x31, 0x00, 0x42, 0x28,
0x42, 0x13, 0x39, 0x46, 0x42, 0x3C, 0x21, 0x4F, 0x31, 0x4F, 0x09, 0x46,
0x12, 0x4F, 0x00, 0x28, 0x00, 0x3C, 0x09, 0x54, 0x55, 0x05, 0x2E, 0x7E,
0x48, 0x7E, 0x48, 0x49, 0x76, 0x00, 0x58, 0x00, 0x3C, 0x32, 0x1E, 0x00,
0x00, 0x00, 0x2E, 0x49, 0x2E, 0x7E, 0x09, 0x94, 0xAA, 0x06, 0x00, 0x00,
0x00, 0x28, 0x1C, 0x28, 0x31, 0x28, 0x2D, 0x28, 0x3C, 0x22, 0x38, 0x26,
0x40, 0x15, 0x40, 0x1D, 0x3D, 0x09, 0x40, 0x0E, 0x34, 0x02, 0x3A, 0x05,
0x19, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x09, 0xA8, 0xAA, 0x06, 0x27, 0x00,
0x15, 0x04, 0x21, 0x01, 0x05, 0x09, 0x09, 0x06, 0x00, 0x13, 0x00, 0x0D,
0x04, 0x1E, 0x00, 0x19, 0x10, 0x22, 0x09, 0x22, 0x1F, 0x1D, 0x17, 0x22,
0x25, 0x13, 0x24, 0x19, 0x27, 0x05, 0x27, 0x10, 0x27, 0x00, 0x09, 0x94,
0xAA, 0x06, 0x00, 0x00, 0x00, 0x22, 0x14, 0x22, 0x2A, 0x22, 0x26, 0x22,
0x36, 0x1D, 0x32, 0x21, 0x3B, 0x11, 0x3B, 0x18, 0x37, 0x06, 0x3B, 0x0A,
0x2C, 0x00, 0x33, 0x01, 0x12, 0x00, 0x27, 0x00, 0x00, 0x00, 0x09, 0xA8,
0xAA, 0x0A, 0x00, 0x11, 0x05, 0x1C, 0x00, 0x18, 0x10, 0x21, 0x0A, 0x21,
0x1C, 0x1C, 0x17, 0x21, 0x20, 0x11, 0x20, 0x18, 0x1E, 0x08, 0x20, 0x0C,
0x18, 0x03, 0x1C, 0x05, 0x10, 0x00, 0x14, 0x00, 0x05, 0x05, 0x0A, 0x00,
0x00, 0x11, 0x00, 0x0A, 0x09, 0xD4, 0xFF, 0x07, 0x00, 0x15, 0x00, 0x00,
0x0D, 0x00, 0x1A, 0x00, 0x14, 0x00, 0x18, 0x00, 0x20, 0x03, 0x1C, 0x00,
0x1E, 0x02, 0x22, 0x0A, 0x21, 0x05, 0x22, 0x07, 0x20, 0x10, 0x22, 0x0D,
0x22, 0x0F, 0x1C, 0x14, 0x1F, 0x12, 0x1E, 0x13, 0x0D, 0x15, 0x1A, 0x15,
0x15, 0x15, 0x00, 0x15, 0x09, 0x54, 0x55, 0x05, 0x37, 0x96, 0x37, 0x57,
0x00, 0x00, 0x24, 0x00, 0x47, 0x3B, 0x69, 0x00, 0x8C, 0x00, 0x55, 0x57,
0x55, 0x96, 0x37, 0x96, 0x09, 0x94, 0xAA, 0x06, 0x00, 0x00, 0x00, 0x2B,
0x11, 0x2B, 0x29, 0x28, 0x23, 0x2B, 0x32, 0x21, 0x2F, 0x26, 0x36, 0x15,
0x36, 0x1C, 0x31, 0x08, 0x36, 0x0D, 0x25, 0x01, 0x2C, 0x02, 0x0F, 0x00,
0x1F, 0x00, 0x00, 0x00, 0x09, 0xA4, 0xAA, 0x05, 0x00, 0x26, 0x17, 0x26,
0x32, 0x24, 0x2C, 0x26, 0x3A, 0x1E, 0x37, 0x22, 0x3D, 0x13, 0x3D, 0x19,
0x39, 0x07, 0x3D, 0x0B, 0x2E, 0x01, 0x35, 0x02, 0x18, 0x00, 0x2A, 0x00,
0x00, 0x00, 0x00, 0x26, 0x0A, 0x54, 0x6A, 0x1A, 0x00, 0x1A, 0x00, 0x00,
0x62, 0x00, 0x62, 0x15, 0x4A, 0x37, 0x56, 0x21, 0x36, 0x67, 0x3D, 0x4D,
0x30, 0x94, 0x30, 0x80, 0x14, 0x94, 0x21, 0x54, 0x15, 0x75, 0x41, 0x1A,
0x2D, 0x34, 0x00, 0x1A, 0x0A, 0x54, 0x55, 0x15, 0x00, 0x96, 0x00, 0x00,
0x1D, 0x00, 0x5B, 0x64, 0x5B, 0x00, 0x77, 0x00, 0x77, 0x96, 0x59, 0x96,
0x1C, 0x34, 0x1C, 0x96, 0x00, 0x96, 0x0A, 0x54, 0x55, 0x15, 0x00, 0x96,
0x00, 0x7A, 0x4F, 0x19, 0x09, 0x19, 0x09, 0x00, 0x77, 0x00, 0x77, 0x17,
0x25, 0x7C, 0x7A, 0x7C, 0x7A, 0x96, 0x00, 0x96, 0x0A, 0xFC, 0xFF, 0x1F,
0xBE, 0xDE, 0xC3, 0xD9, 0xC1, 0xDE, 0xC3, 0xDC, 0xBD, 0x4B, 0xC3, 0xAB,
0xC2, 0x79, 0xA5, 0x02, 0xB8, 0x25, 0xB0, 0x0B, 0xA1, 0x00, 0xA4, 0x01,
0xA2, 0x00, 0x9D, 0x00, 0xA0, 0x00, 0x9E, 0x00, 0x12, 0x40, 0x4E, 0x00,
0x26, 0x19, 0x00, 0xAE, 0x03, 0x5E, 0x00, 0x84, 0x01, 0xD9, 0x00, 0xBC,
0x00, 0xCA, 0x06, 0xDE, 0x01, 0xDC, 0x03, 0xDE, 0xBE, 0xDE, 0x0A, 0xA8,
0xAA, 0x2A, 0x00, 0x37, 0x07, 0x1B, 0x00, 0x29, 0x1B, 0x07, 0x0E, 0x0E,
0x38, 0x00, 0x28, 0x00, 0x60, 0x10, 0x51, 0x00, 0x70, 0x38, 0x70, 0x20,
0x60, 0x61, 0x70, 0x51, 0x38, 0x71, 0x50, 0x71, 0x1C, 0x6A, 0x29, 0x71,
0x07, 0x57, 0x0E, 0x64, 0x00, 0x37, 0x00, 0x4A, 0x0A, 0xA8, 0xAA, 0x2A,
0x00, 0x4F, 0x07, 0x28, 0x00, 0x38, 0x15, 0x14, 0x0C, 0x1D, 0x28, 0x06,
0x1E, 0x0A, 0x49, 0x00, 0x36, 0x00, 0x7E, 0x15, 0x6A, 0x00, 0x92, 0x4E,
0x92, 0x29, 0x7E, 0x87, 0x92, 0x72, 0x49, 0x9B, 0x6A, 0x9B, 0x14, 0x87,
0x27, 0x9B, 0x00, 0x4F, 0x00, 0x72, 0x0A, 0xF4, 0xAF, 0x3F, 0x06, 0xDE,
0xBD, 0xDE, 0xC3, 0xD9, 0xC0, 0xDE, 0xC2, 0xDC, 0xC3, 0xAE, 0xC3, 0xCA,
0xC3, 0xBC, 0xB1, 0x40, 0xC3, 0x84, 0xC0, 0x5E, 0x26, 0x00, 0x9D, 0x19,
0x75, 0x00, 0x23, 0x00, 0x25, 0x00, 0x1F, 0x02, 0x21, 0x00, 0x07, 0x4B,
0x13, 0x0B, 0x0B, 0x25, 0x00, 0xD9, 0x01, 0x79, 0x00, 0xAB, 0x06, 0xDE,
0x00, 0xDC, 0x02, 0xDE, 0x0A, 0x54, 0x55, 0x15, 0x00, 0x96, 0x00, 0x00,
0x67, 0x00, 0x67, 0x19, 0x1E, 0x19, 0x1E, 0x3D, 0x5D, 0x3D, 0x5D, 0x56,
0x1E, 0x56, 0x1E, 0x96, 0x00, 0x96, 0x0A, 0x54, 0x69, 0x15, 0x2C, 0x6D,
0x00, 0x00, 0x1E, 0x00, 0x33, 0x38, 0x39, 0x4A, 0x3C, 0x41, 0x3B, 0x43,
0x3F, 0x38, 0x3D, 0x3C, 0x53, 0x00, 0x71, 0x00, 0x46, 0x6D, 0x2C, 0x6D,
0x0B, 0xA4, 0xAA, 0x5A, 0x00, 0x00, 0x37, 0x00, 0x54, 0x03, 0x4A, 0x00,
0x6B, 0x10, 0x61, 0x06, 0x79, 0x29, 0x74, 0x1A, 0x7E, 0x4C, 0x7E, 0x37,
0x79, 0x6C, 0x7E, 0x5F, 0x69, 0x87, 0x74, 0x7C, 0x54, 0x93, 0x61, 0x8E,
0x39, 0x96, 0x4A, 0x96, 0x00, 0x96, 0x00, 0x00, 0x0B, 0x54, 0x55, 0x55,
0x3D, 0x97, 0x3D, 0x79, 0x00, 0x79, 0x00, 0x5F, 0x41, 0x00, 0x59, 0x00,
0x59, 0x5F, 0x6C, 0x5F, 0x6C, 0x79, 0x59, 0x79, 0x59, 0x97, 0x3D, 0x97,
0x0B, 0xA4, 0x9A, 0xAA, 0x34, 0xC3, 0x20, 0xC3, 0x08, 0x94, 0x10, 0xAD,
0x00, 0x62, 0x00, 0x7A, 0x0A, 0x2A, 0x00, 0x45, 0x20, 0x00, 0x13, 0x13,
0x34, 0x00, 0x21, 0x35, 0x26, 0x1F, 0x1C, 0x63, 0x1C, 0x4B, 0x1F, 0x85,
0x1C, 0x74, 0x27, 0xA7, 0x22, 0x97, 0x34, 0xC3, 0x2B, 0xB1, 0x0B, 0xA8,
0xAA, 0xAA, 0x00, 0x31, 0x05, 0x44, 0x00, 0x3E, 0x12, 0x4A, 0x0B, 0x4A,
0x1D, 0x47, 0x18, 0x4A, 0x25, 0x41, 0x21, 0x45, 0x2E, 0x2E, 0x2A, 0x3A,
0x32, 0x18, 0x32, 0x22, 0x2D, 0x06, 0x32, 0x0D, 0x1F, 0x00, 0x27, 0x00,
0x0F, 0x07, 0x16, 0x00, 0x04, 0x1A, 0x08, 0x0E, 0x00, 0x31, 0x00, 0x27,
0x0B, 0x94, 0xAA, 0x6A, 0x00, 0x00, 0x00, 0x63, 0x17, 0x63, 0x29, 0x62,
0x24, 0x63, 0x35, 0x5C, 0x31, 0x60, 0x3D, 0x4D, 0x3A, 0x57, 0x40, 0x32,
0x40, 0x43, 0x3D, 0x17, 0x40, 0x20, 0x35, 0x09, 0x3A, 0x0E, 0x27, 0x02,
0x2F, 0x03, 0x0E, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0C, 0xA8, 0xAA, 0x6A,
0x02, 0x48, 0x5B, 0x50, 0x4A, 0x4D, 0x54, 0x53, 0x34, 0x53, 0x40, 0x48,
0x0D, 0x53, 0x1A, 0x2A, 0x00, 0x3C, 0x00, 0x0C, 0x0D, 0x17, 0x00, 0x00,
0x34, 0x00, 0x1A, 0x0C, 0x5B, 0x00, 0x4E, 0x29, 0x68, 0x17, 0x68, 0x35,
0x66, 0x2F, 0x68, 0x22, 0x5D, 0x2C, 0x60, 0x2B, 0x4B, 0x48, 0x5B, 0x3A,
0x50, 0x0C, 0x54, 0x55, 0x55, 0x01, 0x27, 0x69, 0x27, 0x42, 0x00, 0x42,
0x00, 0x27, 0x27, 0x27, 0x27, 0x00, 0x41, 0x00, 0x41, 0x27, 0x69, 0x27,
0x69, 0x42, 0x41, 0x42, 0x41, 0x69, 0x27, 0x69, 0x0C, 0x94, 0xAA, 0x5A,
0x01, 0x00, 0x96, 0x00, 0x00, 0x31, 0x00, 0x55, 0x02, 0x4C, 0x00, 0x6A,
0x11, 0x62, 0x05, 0x73, 0x2E, 0x73, 0x1C, 0x6E, 0x45, 0x73, 0x3C, 0x61,
0x54, 0x69, 0x4E, 0x51, 0x5B, 0x59, 0x59, 0x32, 0x5D, 0x47, 0x5D, 0x1E,
0x5D, 0x1E, 0x96, 0x00, 0x96, 0x0C, 0x54, 0x55, 0x55, 0x01, 0x00, 0x7E,
0x1F, 0x7E, 0x3B, 0x54, 0x57, 0x7E, 0x75, 0x7E, 0x4A, 0x3D, 0x71, 0x00,
0x54, 0x00, 0x3B, 0x26, 0x22, 0x00, 0x05, 0x00, 0x2C, 0x3D, 0x00, 0x7E,
0x0C, 0xA4, 0x69, 0x9A, 0x02, 0x5A, 0x3F, 0x5A, 0x0F, 0x56, 0x04, 0x5A,
0x08, 0x4C, 0x00, 0x52, 0x00, 0x0F, 0x00, 0x04, 0x04, 0x09, 0x00, 0x00,
0x0F, 0x00, 0x08, 0x00, 0x3F, 0x04, 0x49, 0x00, 0x45, 0x0F, 0x4D, 0x09,
0x4D, 0x4C, 0x4D, 0x56, 0x49, 0x52, 0x4D, 0x5A, 0x3F, 0x5A, 0x45, 0x0C,
0x54, 0x55, 0x55, 0x01, 0x00, 0x96, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x4F,
0x3E, 0x29, 0x62, 0x29, 0x3D, 0x51, 0x64, 0x96, 0x45, 0x96, 0x2A, 0x65,
0x1D, 0x73, 0x1D, 0x96, 0x00, 0x96, 0x0C, 0x54, 0x55, 0x55, 0x01, 0x00,
0x96, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x42, 0x5B, 0x00, 0x84, 0x00, 0x4C,
0x3A, 0x87, 0x96, 0x60, 0x96, 0x37, 0x4F, 0x1E, 0x68, 0x1E, 0x96, 0x00,
0x96, 0x0C, 0xA8, 0xAA, 0xAA, 0x02, 0x13, 0x00, 0x09, 0x03, 0x0D, 0x00,
0x03, 0x0F, 0x05, 0x07, 0x00, 0x35, 0x00, 0x1A, 0x03, 0x59, 0x00, 0x4F,
0x09, 0x66, 0x05, 0x63, 0x13, 0x69, 0x0D, 0x69, 0x1C, 0x66, 0x18, 0x69,
0x22, 0x5A, 0x20, 0x63, 0x25, 0x35, 0x25, 0x4F, 0x23, 0x11, 0x25, 0x1A,
0x1C, 0x03, 0x20, 0x07, 0x13, 0x00, 0x18, 0x00, 0x0C, 0xA8, 0xAA, 0xAA,
0x02, 0x00, 0x23, 0x03, 0x15, 0x00, 0x1C, 0x0A, 0x0A, 0x06, 0x0F, 0x15,
0x03, 0x0F, 0x06, 0x22, 0x00, 0x1B, 0x00, 0x33, 0x05, 0x2B, 0x00, 0x40,
0x12, 0x3B, 0x0A, 0x44, 0x23, 0x44, 0x19, 0x40, 0x34, 0x44, 0x2C, 0x33,
0x40, 0x3B, 0x3C, 0x22, 0x45, 0x2C, 0x45, 0x0A, 0x3B, 0x14, 0x45, 0x00,
0x23, 0x00, 0x31, 0x0C, 0x54, 0x55, 0x55, 0x01, 0x6D, 0x8F, 0x6D, 0x57,
0x21, 0x57, 0x21, 0x8F, 0x00, 0x8F, 0x00, 0x00, 0x21, 0x00, 0x21, 0x36,
0x6D, 0x36, 0x6D, 0x00, 0x8F, 0x00, 0x8F, 0x8F, 0x6D, 0x8F, 0x0C, 0x54,
0xAA, 0x6A, 0x01, 0x00, 0x96, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x36, 0x3C,
0x27, 0x2A, 0x27, 0x5D, 0x35, 0x50, 0x27, 0x6A, 0x5E, 0x6A, 0x43, 0x5D,
0x89, 0x6A, 0x7A, 0x3D, 0x98, 0x50, 0x98, 0x2A, 0x94, 0x33, 0x98, 0x1B,
0x86, 0x21, 0x8F, 0x1B, 0x96, 0x00, 0x96, 0x0C, 0x54, 0x55, 0x55, 0x01,
0x00, 0x96, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x3B, 0x5A, 0x3B, 0x5A, 0x00,
0x78, 0x00, 0x78, 0x96, 0x5A, 0x96, 0x5A, 0x54, 0x1E, 0x54, 0x1E, 0x96,
0x00, 0x96, 0x0C, 0x54, 0x55, 0x55, 0x01, 0x00, 0x96, 0x00, 0x00, 0x6F,
0x00, 0x6F, 0x19, 0x1E, 0x19, 0x1E, 0x3A, 0x6A, 0x3A, 0x6A, 0x54, 0x1E,
0x54, 0x1E, 0x7C, 0x72, 0x7C, 0x72, 0x96, 0x00, 0x96, 0x0C, 0x94, 0xAA,
0x5A, 0x01, 0x6A, 0x96, 0x4F, 0x96, 0x4F, 0x86, 0x40, 0x94, 0x49, 0x8F,
0x2D, 0x98, 0x37, 0x98, 0x0D, 0x89, 0x1B, 0x98, 0x00, 0x5F, 0x00, 0x7A,
0x0D, 0x35, 0x00, 0x43, 0x2E, 0x27, 0x1A, 0x27, 0x4D, 0x36, 0x40, 0x27,
0x4D, 0x00, 0x6A, 0x00, 0x6A, 0x96, 0x0C, 0x54, 0x55, 0x55, 0x01, 0x00,
0x96, 0x33, 0x47, 0x05, 0x00, 0x28, 0x00, 0x46, 0x30, 0x64, 0x00, 0x87,
0x00, 0x58, 0x49, 0x8B, 0x96, 0x67, 0x96, 0x46, 0x62, 0x24, 0x96, 0x00,
0x96, 0x0C, 0x54, 0x55, 0x55, 0x01, 0x00, 0x6D, 0x27, 0x35, 0x02, 0x00,
0x25, 0x00, 0x38, 0x1E, 0x4C, 0x00, 0x6E, 0x00, 0x49, 0x34, 0x71, 0x6D,
0x4E, 0x6D, 0x38, 0x4B, 0x22, 0x6D, 0x00, 0x6D, 0x0C, 0xA8, 0x6A, 0xAA,
0x01, 0x00, 0xC3, 0x0C, 0xA9, 0x09, 0xB3, 0x13, 0x92, 0x10, 0x9F, 0x17,
0x7A, 0x16, 0x86, 0x18, 0x63, 0x18, 0x6F, 0x13, 0x35, 0x18, 0x4B, 0x00,
0x00, 0x0E, 0x1F, 0x14, 0x00, 0x2B, 0x2F, 0x23, 0x16, 0x34, 0x61, 0x34,
0x47, 0x2D, 0x8F, 0x34, 0x76, 0x14, 0xC3, 0x26, 0xAA, 0x00, 0xC3, 0x0D,
0x54, 0xA9, 0xA9, 0x06, 0x1D, 0x6F, 0x00, 0x6F, 0x00, 0x02, 0x1B, 0x02,
0x1B, 0x11, 0x27, 0x03, 0x22, 0x07, 0x33, 0x00, 0x2D, 0x00, 0x46, 0x05,
0x3D, 0x00, 0x3D, 0x1E, 0x30, 0x19, 0x36, 0x19, 0x26, 0x1D, 0x2A, 0x19,
0x1F, 0x29, 0x22, 0x20, 0x1D, 0x4D, 0x1D, 0x31, 0x1D, 0x6F, 0x0D, 0x94,
0xAA, 0xA9, 0x06, 0x42, 0x00, 0x60, 0x00, 0x60, 0x5F, 0x5D, 0x7B, 0x60,
0x71, 0x4D, 0x90, 0x58, 0x88, 0x2E, 0x98, 0x41, 0x98, 0x0C, 0x8C, 0x18,
0x98, 0x00, 0x67, 0x00, 0x7F, 0x1D, 0x64, 0x20, 0x76, 0x1D, 0x71, 0x2F,
0x7E, 0x25, 0x7E, 0x3E, 0x79, 0x39, 0x7E, 0x42, 0x61, 0x42, 0x73, 0x42,
0x00, 0x0D, 0xA4, 0xAA, 0x5A, 0x05, 0x4D, 0x98, 0x4D, 0x61, 0x3F, 0x6D,
0x47, 0x69, 0x2D, 0x71, 0x36, 0x71, 0x0E, 0x63, 0x1A, 0x71, 0x00, 0x37,
0x00, 0x53, 0x0D, 0x0E, 0x00, 0x1D, 0x2E, 0x00, 0x1B, 0x00, 0x41, 0x04,
0x39, 0x00, 0x4F, 0x12, 0x49, 0x09, 0x4F, 0x02, 0x69, 0x02, 0x69, 0x98,
0x4D, 0x98, 0x0D, 0x54, 0x55, 0x55, 0x05, 0x00, 0x96, 0x00, 0x00, 0x2D,
0x00, 0x49, 0x66, 0x63, 0x00, 0x91, 0x00, 0x91, 0x96, 0x75, 0x96, 0x75,
0x20, 0x57, 0x96, 0x3A, 0x96, 0x1C, 0x20, 0x1C, 0x96, 0x00, 0x96, 0x0D,
0x94, 0xAA, 0x6A, 0x05, 0x00, 0x02, 0x1B, 0x02, 0x1B, 0x12, 0x29, 0x05,
0x20, 0x0A, 0x3D, 0x00, 0x32, 0x00, 0x5D, 0x0E, 0x50, 0x00, 0x6A, 0x38,
0x6A, 0x1D, 0x5D, 0x62, 0x6A, 0x53, 0x3C, 0x71, 0x4F, 0x71, 0x2C, 0x6E,
0x33, 0x71, 0x1D, 0x61, 0x25, 0x6A, 0x1D, 0x98, 0x00, 0x98, 0x00, 0x02,
0x0D, 0x98, 0xAA, 0xAA, 0x0A, 0x7F, 0x86, 0x97, 0x92, 0x8A, 0x8E, 0x8C,
0xA8, 0x7F, 0xA2, 0x85, 0xA6, 0x6A, 0x95, 0x7D, 0xA1, 0x4A, 0x9B, 0x5C,
0x9B, 0x14, 0x87, 0x27, 0x9B, 0x00, 0x4E, 0x00, 0x73, 0x14, 0x15, 0x00,
0x29, 0x49, 0x00, 0x27, 0x00, 0x7E, 0x15, 0x6A, 0x00, 0x91, 0x4E, 0x91,
0x29, 0x8C, 0x70, 0x91, 0x61, 0x7F, 0x86, 0x88, 0x7B, 0x0D, 0x54, 0x55,
0x55, 0x05, 0x24, 0x96, 0x00, 0x00, 0x1F, 0x00, 0x36, 0x67, 0x51, 0x00,
0x75, 0x00, 0x8F, 0x68, 0xA6, 0x00, 0xC5, 0x00, 0xA0, 0x96, 0x80, 0x96,
0x62, 0x26, 0x45, 0x96, 0x24, 0x96, 0x0D, 0x54, 0x55, 0x55, 0x05, 0x22,
0x6D, 0x00, 0x00, 0x1C, 0x00, 0x30, 0x47, 0x43, 0x00, 0x5F, 0x00, 0x71,
0x47, 0x86, 0x00, 0xA2, 0x00, 0x7F, 0x6D, 0x63, 0x6D, 0x51, 0x27, 0x3E,
0x6D, 0x22, 0x6D, 0x0D, 0x54, 0x55, 0x55, 0x05, 0x00, 0x00, 0x17, 0x00,
0x21, 0x56, 0x2D, 0x00, 0x49, 0x00, 0x55, 0x56, 0x5E, 0x00, 0x73, 0x00,
0x61, 0x7F, 0x47, 0x7F, 0x3B, 0x24, 0x2E, 0x7F, 0x14, 0x7F, 0x00, 0x00,
0x0E, 0xA4, 0xAA, 0x9A, 0x2A, 0x47, 0x4C, 0x64, 0x51, 0x52, 0x69, 0x5E,
0x61, 0x35, 0x71, 0x47, 0x71, 0x0B, 0x5F, 0x18, 0x71, 0x00, 0x39, 0x00,
0x50, 0x0E, 0x0F, 0x00, 0x1E, 0x32, 0x00, 0x1C, 0x00, 0x58, 0x10, 0x4A,
0x00, 0x66, 0x41, 0x66, 0x20, 0x1D, 0x41, 0x24, 0x55, 0x1E, 0x4D, 0x35,
0x5C, 0x2B, 0x5C, 0x40, 0x58, 0x3C, 0x5C, 0x47, 0x4C, 0x45, 0x54, 0x0E,
0xA4, 0x6A, 0xAA, 0x16, 0x35, 0x00, 0x35, 0x69, 0x32, 0x87, 0x35, 0x7E,
0x28, 0x94, 0x2F, 0x8F, 0x14, 0x97, 0x20, 0x97, 0x0B, 0x97, 0x10, 0x97,
0x00, 0x96, 0x06, 0x97, 0x05, 0x7D, 0x09, 0x7E, 0x07, 0x7E, 0x0C, 0x7E,
0x0B, 0x7E, 0x13, 0x7C, 0x11, 0x7E, 0x17, 0x78, 0x16, 0x7A, 0x18, 0x68,
0x18, 0x75, 0x18, 0x00, 0x35, 0x00, 0x0E, 0xA8, 0x56, 0xAA, 0x15, 0x21,
0x52, 0x22, 0x5E, 0x21, 0x59, 0x26, 0x66, 0x23, 0x63, 0x2E, 0x6C, 0x29,
0x6A, 0x3B, 0x6E, 0x33, 0x6E, 0x72, 0x6E, 0x72, 0x8F, 0x3B, 0x8F, 0x21,
0x8B, 0x2C, 0x8F, 0x0F, 0x7F, 0x16, 0x86, 0x04, 0x6B, 0x08, 0x76, 0x00,
0x51, 0x00, 0x60, 0x00, 0x00, 0x21, 0x00, 0x21, 0x52, 0x0E, 0xA4, 0xAA,
0xA9, 0x2A, 0x00, 0x2A, 0x00, 0x0F, 0x1E, 0x01, 0x0D, 0x01, 0x2A, 0x02,
0x25, 0x01, 0x3E, 0x09, 0x30, 0x04, 0x51, 0x0F, 0x4C, 0x0F, 0x5E, 0x0B,
0x56, 0x0F, 0x6D, 0x00, 0x66, 0x08, 0x6D, 0x1C, 0x5F, 0x25, 0x68, 0x21,
0x4E, 0x29, 0x57, 0x29, 0x44, 0x28, 0x49, 0x29, 0x35, 0x22, 0x3F, 0x27,
0x1C, 0x1B, 0x25, 0x1B, 0x00, 0x2A, 0x0E, 0x1B, 0x0E, 0x94, 0x56, 0x95,
0x15, 0x00, 0x6D, 0x00, 0x56, 0x29, 0x28, 0x38, 0x17, 0x33, 0x1C, 0x2A,
0x18, 0x33, 0x18, 0x04, 0x18, 0x04, 0x00, 0x5E, 0x00, 0x5E, 0x14, 0x34,
0x44, 0x26, 0x54, 0x34, 0x53, 0x32, 0x53, 0x61, 0x53, 0x61, 0x6D, 0x00,
0x6D, 0x0F, 0xA4, 0xAA, 0xAA, 0x5A, 0x00, 0x00, 0x3C, 0x00, 0x56, 0x01,
0x4E, 0x00, 0x66, 0x07, 0x5F, 0x03, 0x72, 0x14, 0x6D, 0x0C, 0x76, 0x25,
0x76, 0x1C, 0x71, 0x39, 0x76, 0x30, 0x61, 0x46, 0x6B, 0x42, 0x76, 0x54,
0x6F, 0x4A, 0x7E, 0x6A, 0x7E, 0x5D, 0x79, 0x7E, 0x7E, 0x74, 0x6C, 0x8E,
0x74, 0x88, 0x58, 0x95, 0x64, 0x93, 0x33, 0x96, 0x50, 0x96, 0x00, 0x96,
0x00, 0x00, 0x10, 0xA4, 0xAA, 0xAA, 0xAA, 0x02, 0x61, 0x25, 0x46, 0x29,
0x40, 0x1C, 0x45, 0x20, 0x35, 0x18, 0x3C, 0x18, 0x26, 0x20, 0x2C, 0x18,
0x1E, 0x42, 0x1F, 0x28, 0x38, 0x35, 0x29, 0x35, 0x57, 0x43, 0x4A, 0x35,
0x64, 0x66, 0x64, 0x51, 0x57, 0x8B, 0x64, 0x7D, 0x34, 0x99, 0x49, 0x99,
0x0F, 0x88, 0x1D, 0x99, 0x00, 0x4E, 0x00, 0x76, 0x0F, 0x12, 0x00, 0x25,
0x37, 0x00, 0x1E, 0x00, 0x53, 0x0A, 0x48, 0x00, 0x61, 0x25, 0x5E, 0x13,
0x10, 0xA8, 0xAA, 0xAA, 0xAA, 0x02, 0x19, 0x46, 0x09, 0x39, 0x0E, 0x41,
0x04, 0x27, 0x04, 0x31, 0x0F, 0x0B, 0x04, 0x16, 0x31, 0x00, 0x1B, 0x00,
0x52, 0x0B, 0x46, 0x00, 0x5E, 0x27, 0x5E, 0x16, 0x58, 0x39, 0x5E, 0x31,
0x49, 0x46, 0x53, 0x41, 0x5C, 0x54, 0x56, 0x4B, 0x63, 0x6B, 0x63, 0x5E,
0x55, 0x8C, 0x63, 0x7F, 0x32, 0x99, 0x48, 0x99, 0x10, 0x8F, 0x1E, 0x99,
0x00, 0x6C, 0x00, 0x82, 0x06, 0x56, 0x00, 0x60, 0x19, 0x46, 0x0C, 0x4B,
0x10, 0x54, 0x95, 0xAA, 0xA9, 0x01, 0x00, 0x00, 0x1F, 0x00, 0x39, 0x4D,
0x52, 0x00, 0x70, 0x00, 0x49, 0x69, 0x43, 0x7C, 0x3B, 0x8A, 0x3F, 0x85,
0x33, 0x92, 0x38, 0x8F, 0x28, 0x97, 0x2F, 0x95, 0x1A, 0x97, 0x22, 0x97,
0x0A, 0x97, 0x11, 0x97, 0x07, 0x81, 0x13, 0x82, 0x0E, 0x82, 0x22, 0x7C,
0x1D, 0x82, 0x29, 0x6D, 0x27, 0x76, 0x00, 0x00, 0x10, 0x94, 0xA6, 0x69,
0x9A, 0x02, 0xA2, 0x10, 0x61, 0x10, 0x5E, 0x09, 0x59, 0x02, 0x5C, 0x05,
0x51, 0x00, 0x55, 0x00, 0x0A, 0x00, 0x03, 0x03, 0x06, 0x00, 0x00, 0x0B,
0x00, 0x06, 0x00, 0x78, 0x03, 0x80, 0x00, 0x7D, 0x0A, 0x83, 0x06, 0x83,
0xA2, 0x83, 0xA9, 0x80, 0xA6, 0x83, 0xAC, 0x78, 0xAC, 0x7D, 0xAC, 0x1B,
0xA9, 0x13, 0xAC, 0x16, 0xA2, 0x10, 0xA6, 0x10, 0x10, 0xA8, 0xA6, 0x69,
0x9A, 0x02, 0x7D, 0x1B, 0x73, 0x0F, 0x76, 0x13, 0x6B, 0x06, 0x70, 0x0C,
0x65, 0x02, 0x69, 0x04, 0x5E, 0x00, 0x61, 0x00, 0x07, 0x00, 0x02, 0x03,
0x04, 0x00, 0x00, 0x07, 0x00, 0x05, 0x00, 0xAA, 0x02, 0xAF, 0x00, 0xAD,
0x07, 0xB1, 0x04, 0xB1, 0x7B, 0xB1, 0x80, 0xAF, 0x7E, 0xB1, 0x82, 0xAA,
0x82, 0xAD, 0x82, 0x27, 0x81, 0x20, 0x82, 0x24, 0x7D, 0x1B, 0x7F, 0x1D,
0x10, 0xA4, 0xAA, 0xAA, 0xAA, 0x02, 0x03, 0x74, 0x1F, 0x71, 0x24, 0x7E,
0x20, 0x79, 0x2F, 0x82, 0x28, 0x82, 0x3F, 0x79, 0x38, 0x82, 0x47, 0x57,
0x45, 0x71, 0x2B, 0x64, 0x3C, 0x64, 0x0D, 0x56, 0x1A, 0x64, 0x00, 0x33,
0x00, 0x49, 0x0E, 0x0E, 0x00, 0x1C, 0x30, 0x00, 0x1B, 0x00, 0x56, 0x12,
0x47, 0x00, 0x64, 0x4C, 0x64, 0x23, 0x55, 0x87, 0x64, 0x75, 0x2D, 0x99,
0x46, 0x99, 0x11, 0x90, 0x1C, 0x99, 0x03, 0x74, 0x06, 0x87, 0x12, 0xA4,
0xAA, 0x9A, 0xAA, 0x2A, 0x65, 0x62, 0x83, 0x6B, 0x6C, 0x8F, 0x7C, 0x83,
0x44, 0x9B, 0x5D, 0x9B, 0x13, 0x87, 0x26, 0x9B, 0x00, 0x4F, 0x00, 0x72,
0x13, 0x15, 0x00, 0x2A, 0x46, 0x00, 0x27, 0x00, 0x73, 0x10, 0x62, 0x00,
0x82, 0x2C, 0x7D, 0x1A, 0x64, 0x33, 0x59, 0x21, 0x62, 0x28, 0x45, 0x1A,
0x51, 0x1A, 0x2A, 0x26, 0x34, 0x1A, 0x1F, 0x4D, 0x1F, 0x32, 0x29, 0x75,
0x1F, 0x69, 0x44, 0x81, 0x34, 0x81, 0x59, 0x7A, 0x50, 0x81, 0x65, 0x62,
0x62, 0x72, 0x12, 0x54, 0x7F, 0xF5, 0xFF, 0x17, 0x00, 0x53, 0x11, 0x53,
0x11, 0x30, 0x14, 0x30, 0x1D, 0x31, 0x18, 0x30, 0x1B, 0x31, 0x22, 0x35,
0x1F, 0x32, 0x21, 0x33, 0x2B, 0x41, 0x24, 0x36, 0x27, 0x3B, 0x37, 0x53,
0x4B, 0x53, 0x41, 0x43, 0x37, 0x35, 0x3D, 0x3C, 0x3A, 0x38, 0x2E, 0x2E,
0x35, 0x33, 0x32, 0x31, 0x3F, 0x27, 0x36, 0x2D, 0x3B, 0x2B, 0x45, 0x17,
0x43, 0x23, 0x45, 0x1D, 0x41, 0x0A, 0x45, 0x12, 0x43, 0x0D, 0x37, 0x02,
0x3F, 0x06, 0x3B, 0x03, 0x24, 0x00, 0x33, 0x00, 0x2D, 0x00, 0x00, 0x00,
0x00, 0x53, 0x12, 0x94, 0xAA, 0x5A, 0xA9, 0x15, 0x00, 0x96, 0x00, 0x00,
0x40, 0x00, 0x63, 0x04, 0x58, 0x00, 0x74, 0x12, 0x6E, 0x08, 0x7B, 0x2A,
0x7B, 0x1C, 0x71, 0x46, 0x7B, 0x3B, 0x53, 0x54, 0x67, 0x51, 0x63, 0x60,
0x5D, 0x59, 0x75, 0x78, 0x6A, 0x67, 0x87, 0x96, 0x63, 0x96, 0x4D, 0x75,
0x3D, 0x5F, 0x41, 0x64, 0x34, 0x59, 0x38, 0x5A, 0x24, 0x57, 0x2F, 0x57,
0x1E, 0x57, 0x1E, 0x96, 0x00, 0x96, 0x12, 0xA4, 0xAA, 0x9A, 0xAA, 0x2A,
0x65, 0x22, 0x49, 0x27, 0x42, 0x1B, 0x47, 0x1F, 0x35, 0x16, 0x3D, 0x16,
0x24, 0x1E, 0x2A, 0x16, 0x1E, 0x36, 0x1E, 0x25, 0x24, 0x52, 0x1E, 0x4A,
0x36, 0x5A, 0x2B, 0x5A, 0x43, 0x55, 0x3E, 0x5A, 0x4A, 0x45, 0x48, 0x50,
0x67, 0x4A, 0x56, 0x67, 0x62, 0x5D, 0x34, 0x71, 0x49, 0x71, 0x0E, 0x62,
0x1C, 0x71, 0x00, 0x38, 0x00, 0x53, 0x0E, 0x0F, 0x00, 0x1E, 0x35, 0x00,
0x1C, 0x00, 0x54, 0x08, 0x49, 0x00, 0x65, 0x22, 0x60, 0x11, 0x13, 0xA4,
0xAA, 0x6A, 0xAA, 0xAA, 0x42, 0x71, 0x28, 0x71, 0x28, 0x6A, 0x28, 0x6B,
0x2C, 0x55, 0x28, 0x5D, 0x3D, 0x43, 0x30, 0x4D, 0x4C, 0x35, 0x49, 0x39,
0x50, 0x2A, 0x50, 0x30, 0x49, 0x1C, 0x50, 0x22, 0x37, 0x16, 0x42, 0x16,
0x25, 0x1C, 0x2C, 0x16, 0x1A, 0x2F, 0x1D, 0x23, 0x00, 0x2C, 0x10, 0x0D,
0x01, 0x1A, 0x36, 0x00, 0x1E, 0x00, 0x5D, 0x0D, 0x4E, 0x00, 0x6C, 0x2B,
0x6C, 0x1A, 0x66, 0x3D, 0x6C, 0x35, 0x4F, 0x54, 0x61, 0x46, 0x44, 0x61,
0x46, 0x5C, 0x42, 0x71, 0x42, 0x65, 0x13, 0xA4, 0x9A, 0xA6, 0x66, 0x96,
0x16, 0x48, 0x07, 0x3C, 0x16, 0x2C, 0x0E, 0x33, 0x1A, 0x28, 0x19, 0x29,
0x0B, 0x25, 0x18, 0x28, 0x00, 0x21, 0x03, 0x22, 0x06, 0x0F, 0x1E, 0x1B,
0x13, 0x15, 0x1C, 0x00, 0x1C, 0x0B, 0x2E, 0x00, 0x2B, 0x1C, 0x2E, 0x08,
0x34, 0x18, 0x2D, 0x1B, 0x45, 0x10, 0x3D, 0x13, 0x4A, 0x23, 0x30, 0x28,
0x3F, 0x25, 0x3C, 0x36, 0x42, 0x3D, 0x40, 0x3A, 0x32, 0x47, 0x25, 0x30,
0x16, 0x48, 0x1E, 0x3B, 0x13, 0x94, 0x6A, 0x6A, 0x55, 0x55, 0x00, 0x2C,
0x10, 0x2C, 0x10, 0x24, 0x13, 0x0F, 0x10, 0x16, 0x1E, 0x04, 0x16, 0x09,
0x31, 0x00, 0x25, 0x00, 0x49, 0x04, 0x3E, 0x00, 0x46, 0x18, 0x38, 0x16,
0x3F, 0x16, 0x2F, 0x19, 0x32, 0x16, 0x2D, 0x24, 0x2D, 0x1C, 0x2D, 0x2C,
0x42, 0x2C, 0x42, 0x43, 0x2D, 0x43, 0x2D, 0x99, 0x10, 0x99, 0x10, 0x43,
0x00, 0x43, 0x00, 0x2C, 0x13, 0xA4, 0x6A, 0xA5, 0xAA, 0x55, 0x48, 0x6D,
0x48, 0x5C, 0x38, 0x6A, 0x42, 0x65, 0x24, 0x6F, 0x2F, 0x6F, 0x10, 0x6A,
0x19, 0x6F, 0x04, 0x5D, 0x08, 0x66, 0x00, 0x45, 0x00, 0x54, 0x00, 0x00,
0x1D, 0x00, 0x1D, 0x32, 0x1E, 0x4E, 0x1D, 0x49, 0x24, 0x56, 0x20, 0x53,
0x2F, 0x59, 0x28, 0x59, 0x3C, 0x55, 0x36, 0x59, 0x44, 0x4B, 0x42, 0x51,
0x46, 0x2E, 0x46, 0x45, 0x46, 0x00, 0x63, 0x00, 0x63, 0x6D, 0x48, 0x6D,
0x13, 0x94, 0xAA, 0x56, 0xA5, 0x6A, 0x63, 0x6F, 0x46, 0x6F, 0x46, 0x37,
0x44, 0x21, 0x46, 0x26, 0x3E, 0x18, 0x43, 0x1B, 0x34, 0x16, 0x3A, 0x16,
0x27, 0x1A, 0x2D, 0x16, 0x1F, 0x25, 0x21, 0x1E, 0x1D, 0x3D, 0x1D, 0x2B,
0x1D, 0x6F, 0x00, 0x6F, 0x00, 0x02, 0x1B, 0x02, 0x1B, 0x12, 0x3F, 0x00,
0x29, 0x00, 0x50, 0x03, 0x48, 0x00, 0x5C, 0x0C, 0x58, 0x06, 0x61, 0x18,
0x60, 0x11, 0x63, 0x2B, 0x63, 0x1F, 0x63, 0x6F, 0x13, 0xA4, 0x6A, 0xA5,
0xAA, 0x55, 0x1D, 0x00, 0x1D, 0x37, 0x3E, 0x27, 0x2B, 0x27, 0x50, 0x2A,
0x48, 0x27, 0x5C, 0x34, 0x58, 0x2E, 0x61, 0x40, 0x60, 0x39, 0x63, 0x56,
0x63, 0x47, 0x63, 0x96, 0x46, 0x96, 0x46, 0x5C, 0x45, 0x47, 0x46, 0x4B,
0x3F, 0x3F, 0x43, 0x42, 0x34, 0x3D, 0x3B, 0x3D, 0x28, 0x40, 0x2D, 0x3D,
0x1F, 0x4B, 0x22, 0x44, 0x1D, 0x5F, 0x1D, 0x52, 0x1D, 0x96, 0x00, 0x96,
0x00, 0x00, 0x1D, 0x00, 0x14, 0xA4, 0x9A, 0x6A, 0xAA, 0xA9, 0x02, 0x00,
0x60, 0x00, 0x30, 0x04, 0x1D, 0x00, 0x25, 0x0E, 0x0D, 0x08, 0x14, 0x1D,
0x03, 0x14, 0x07, 0x30, 0x00, 0x26, 0x00, 0x6D, 0x00, 0x80, 0x03, 0x77,
0x00, 0x8E, 0x0D, 0x88, 0x07, 0x98, 0x1D, 0x95, 0x14, 0x9C, 0x30, 0x9C,
0x25, 0x9C, 0x60, 0x98, 0x72, 0x9C, 0x6A, 0x8E, 0x81, 0x95, 0x7B, 0x80,
0x8B, 0x88, 0x88, 0x6D, 0x8F, 0x77, 0x8F, 0x30, 0x8F, 0x1D, 0x8B, 0x26,
0x8F, 0x0E, 0x81, 0x14, 0x88, 0x04, 0x72, 0x08, 0x7B, 0x00, 0x60, 0x00,
0x6A, 0x14, 0x54, 0xA5, 0x5A, 0xAA, 0x55, 0x01, 0x4B, 0x77, 0x21, 0x31,
0x21, 0x8F, 0x00, 0x8F, 0x00, 0x00, 0x18, 0x00, 0x20, 0x01, 0x1C, 0x00,
0x29, 0x06, 0x25, 0x03, 0x30, 0x0C, 0x2D, 0x09, 0x36, 0x14, 0x34, 0x10,
0x4B, 0x37, 0x5F, 0x14, 0x65, 0x0C, 0x62, 0x10, 0x6D, 0x06, 0x69, 0x08,
0x75, 0x01, 0x71, 0x03, 0x7D, 0x00, 0x79, 0x00, 0x96, 0x00, 0x96, 0x8F,
0x75, 0x8F, 0x75, 0x31, 0x4B, 0x77, 0x14, 0x94, 0xAA, 0x56, 0xAA, 0xAA,
0x01, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x51, 0x1F, 0x6A, 0x1E, 0x64, 0x29,
0x79, 0x21, 0x73, 0x3D, 0x7E, 0x30, 0x7E, 0x50, 0x79, 0x4A, 0x7E, 0x58,
0x6C, 0x57, 0x74, 0x59, 0x53, 0x59, 0x64, 0x59, 0x00, 0x78, 0x00, 0x78,
0x4E, 0x75, 0x75, 0x78, 0x6A, 0x6C, 0x87, 0x73, 0x80, 0x5A, 0x94, 0x66,
0x8F, 0x3E, 0x98, 0x4F, 0x98, 0x1D, 0x93, 0x28, 0x98, 0x0B, 0x86, 0x12,
0x8E, 0x03, 0x76, 0x05, 0x7E, 0x00, 0x50, 0x00, 0x69, 0x00, 0x00, 0x15,
0xA4, 0xAA, 0x56, 0x95, 0xAA, 0x0A, 0x00, 0x6D, 0x1D, 0x6A, 0x24, 0x7A,
0x1E, 0x74, 0x32, 0x7F, 0x2A, 0x7F, 0x41, 0x78, 0x3B, 0x7F, 0x47, 0x62,
0x47, 0x71, 0x41, 0x4D, 0x47, 0x54, 0x31, 0x46, 0x3B, 0x46, 0x1B, 0x51,
0x25, 0x46, 0x03, 0x4E, 0x12, 0x00, 0x5E, 0x00, 0x5E, 0x1B, 0x28, 0x1B,
0x24, 0x34, 0x37, 0x2F, 0x2D, 0x2F, 0x58, 0x3D, 0x4A, 0x2F, 0x65, 0x61,
0x65, 0x4B, 0x5A, 0x82, 0x65, 0x74, 0x32, 0x96, 0x4C, 0x96, 0x10, 0x8B,
0x1D, 0x96, 0x00, 0x6D, 0x03, 0x80, 0x15, 0x94, 0xAA, 0x6A, 0xAA, 0xAA,
0x06, 0x65, 0x7C, 0x65, 0x97, 0x00, 0x97, 0x0A, 0x7A, 0x02, 0x88, 0x2A,
0x56, 0x12, 0x6C, 0x42, 0x3D, 0x3E, 0x44, 0x48, 0x2C, 0x48, 0x35, 0x43,
0x1D, 0x48, 0x22, 0x34, 0x18, 0x3E, 0x18, 0x26, 0x1D, 0x2B, 0x18, 0x20,
0x2F, 0x21, 0x23, 0x03, 0x2C, 0x13, 0x0A, 0x06, 0x15, 0x35, 0x00, 0x21,
0x00, 0x58, 0x0C, 0x4B, 0x00, 0x65, 0x2A, 0x65, 0x18, 0x61, 0x3D, 0x65,
0x34, 0x56, 0x50, 0x5E, 0x46, 0x43, 0x63, 0x50, 0x57, 0x32, 0x74, 0x35,
0x70, 0x2C, 0x7C, 0x2E, 0x78, 0x65, 0x7C, 0x15, 0x94, 0xAA, 0x56, 0xAA,
0x6A, 0x05, 0x00, 0x8F, 0x00, 0x38, 0x61, 0x38, 0x67, 0x37, 0x65, 0x38,
0x6B, 0x34, 0x6A, 0x36, 0x6D, 0x30, 0x6D, 0x32, 0x6E, 0x2C, 0x6E, 0x2E,
0x6B, 0x25, 0x6E, 0x28, 0x61, 0x21, 0x69, 0x21, 0x00, 0x21, 0x00, 0x00,
0x61, 0x00, 0x74, 0x03, 0x6B, 0x00, 0x83, 0x0D, 0x7D, 0x07, 0x8F, 0x2C,
0x8F, 0x1B, 0x8C, 0x3D, 0x8F, 0x35, 0x83, 0x4C, 0x89, 0x45, 0x74, 0x56,
0x7D, 0x53, 0x61, 0x5A, 0x6B, 0x5A, 0x21, 0x5A, 0x21, 0x8F, 0x00, 0x8F,
0x15, 0x54, 0xAA, 0xA9, 0x5A, 0x55, 0x05, 0x3E, 0x26, 0x3E, 0x3D, 0x2A,
0x3D, 0x2A, 0x69, 0x2B, 0x78, 0x2A, 0x76, 0x2D, 0x7C, 0x2B, 0x7A, 0x32,
0x7D, 0x2F, 0x7D, 0x3E, 0x7B, 0x36, 0x7D, 0x40, 0x91, 0x29, 0x95, 0x36,
0x95, 0x1B, 0x93, 0x22, 0x95, 0x12, 0x8C, 0x15, 0x90, 0x0E, 0x81, 0x0F,
0x88, 0x0D, 0x6C, 0x0D, 0x7C, 0x0D, 0x3D, 0x00, 0x3D, 0x00, 0x26, 0x0D,
0x26, 0x0D, 0x10, 0x2A, 0x00, 0x2A, 0x26, 0x3E, 0x26, 0x17, 0xA4, 0x6A,
0xAA, 0x5A, 0xA9, 0xAA, 0x04, 0x76, 0x25, 0x7A, 0x28, 0x82, 0x25, 0x80,
0x35, 0x85, 0x2D, 0x85, 0x46, 0x81, 0x41, 0x85, 0x4C, 0x7A, 0x4A, 0x7F,
0x4D, 0x6D, 0x4D, 0x77, 0x4D, 0x5D, 0x2D, 0x6F, 0x40, 0x6F, 0x0A, 0x5C,
0x17, 0x6F, 0x00, 0x38, 0x00, 0x4E, 0x0D, 0x0E, 0x00, 0x1C, 0x2E, 0x00,
0x1A, 0x00, 0x4F, 0x11, 0x42, 0x00, 0x4F, 0x02, 0x6A, 0x02, 0x6A, 0x64,
0x67, 0x80, 0x6A, 0x77, 0x5E, 0x8F, 0x64, 0x8A, 0x4F, 0x98, 0x58, 0x95,
0x36, 0x99, 0x45, 0x99, 0x0F, 0x91, 0x1B, 0x99, 0x04, 0x79, 0x04, 0x88,
0x04, 0x76, 0x04, 0x78, 0x17, 0xA4, 0xAA, 0xAA, 0xAA, 0x66, 0xAA, 0x8B,
0x86, 0x79, 0x9D, 0x61, 0x8B, 0x6D, 0x96, 0x4D, 0x97, 0x58, 0x94, 0x35,
0x9B, 0x43, 0x9B, 0x0B, 0x8C, 0x19, 0x9B, 0x00, 0x70, 0x00, 0x7F, 0x09,
0x56, 0x00, 0x61, 0x22, 0x42, 0x11, 0x4A, 0x17, 0x30, 0x1B, 0x39, 0x13,
0x21, 0x13, 0x28, 0x1E, 0x0A, 0x13, 0x13, 0x3D, 0x00, 0x29, 0x00, 0x5B,
0x0A, 0x50, 0x00, 0x66, 0x22, 0x66, 0x14, 0x61, 0x34, 0x66, 0x2B, 0x4B,
0x46, 0x5B, 0x3C, 0x60, 0x62, 0x66, 0x51, 0x63, 0x5B, 0x80, 0x57, 0x79,
0x6B, 0x7C, 0x64, 0x73, 0x75, 0x76, 0x71, 0x80, 0x7F, 0x78, 0x7A, 0x8B,
0x86, 0x87, 0x85, 0x18, 0x54, 0xAA, 0xAA, 0x9A, 0xAA, 0x6A, 0x01, 0x4B,
0x62, 0x4B, 0x48, 0x8C, 0x48, 0x8C, 0x84, 0x71, 0x94, 0x83, 0x8D, 0x4C,
0x9B, 0x5F, 0x9B, 0x23, 0x91, 0x35, 0x9B, 0x09, 0x75, 0x12, 0x88, 0x00,
0x4D, 0x00, 0x63, 0x0A, 0x24, 0x00, 0x36, 0x27, 0x08, 0x14, 0x11, 0x4A,
0x00, 0x35, 0x00, 0x76, 0x0C, 0x66, 0x00, 0x8A, 0x2C, 0x86, 0x18, 0x6C,
0x32, 0x60, 0x20, 0x69, 0x27, 0x4A, 0x1A, 0x58, 0x1A, 0x2B, 0x27, 0x37,
0x1A, 0x1F, 0x4C, 0x1F, 0x33, 0x2B, 0x74, 0x1F, 0x67, 0x4A, 0x81, 0x37,
0x81, 0x5D, 0x7E, 0x54, 0x81, 0x6E, 0x75, 0x67, 0x7A, 0x6E, 0x62, 0x4B,
0x62, 0x19, 0xA4, 0x5A, 0x69, 0xA6, 0x5A, 0x69, 0x0A, 0x2B, 0x8C, 0x2B,
0x61, 0x0D, 0x4F, 0x17, 0x5B, 0x04, 0x33, 0x04, 0x44, 0x0F, 0x17, 0x04,
0x22, 0x2B, 0x0A, 0x19, 0x0B, 0x2B, 0x00, 0x3A, 0x00, 0x3A, 0x0A, 0x54,
0x15, 0x4A, 0x0C, 0x60, 0x2D, 0x5D, 0x1E, 0x46, 0x31, 0x3A, 0x20, 0x44,
0x25, 0x3A, 0x48, 0x5B, 0x5A, 0x52, 0x4F, 0x64, 0x75, 0x64, 0x64, 0x59,
0x94, 0x64, 0x87, 0x3A, 0xA4, 0x4E, 0xA1, 0x3A, 0xB7, 0x2B, 0xB7, 0x2B,
0xA4, 0x0E, 0x97, 0x19, 0xA2, 0x00, 0x78, 0x03, 0x8C, 0x1B, 0x75, 0x21,
0x83, 0x1C, 0x7D, 0x2B, 0x8C, 0x25, 0x89, 0x19, 0xA8, 0x56, 0xAA, 0x55,
0x5A, 0xA9, 0x06, 0x00, 0x31, 0x03, 0x1F, 0x00, 0x27, 0x0D, 0x0F, 0x07,
0x16, 0x1D, 0x04, 0x14, 0x08, 0x33, 0x00, 0x27, 0x00, 0x89, 0x00, 0x89,
0x21, 0x35, 0x21, 0x2D, 0x23, 0x31, 0x21, 0x26, 0x27, 0x29, 0x24, 0x23,
0x2F, 0x24, 0x2B, 0x21, 0x37, 0x21, 0x33, 0x21, 0x37, 0x89, 0x37, 0x89,
0x58, 0x21, 0x58, 0x26, 0x67, 0x21, 0x61, 0x35, 0x6E, 0x2C, 0x6E, 0x89,
0x6E, 0x89, 0x8F, 0x33, 0x8F, 0x1D, 0x8B, 0x26, 0x8F, 0x0D, 0x7F, 0x13,
0x86, 0x03, 0x70, 0x06, 0x78, 0x00, 0x5F, 0x00, 0x67, 0x00, 0x31, 0x19,
0xA4, 0x6A, 0x9A, 0xAA, 0xAA, 0xA6, 0x0A, 0x1D, 0x23, 0x03, 0x1E, 0x12,
0x07, 0x07, 0x0F, 0x32, 0x00, 0x1D, 0x00, 0x4F, 0x04, 0x45, 0x00, 0x5C,
0x10, 0x58, 0x09, 0x60, 0x29, 0x60, 0x17, 0x5F, 0x4B, 0x61, 0x60, 0x5F,
0x59, 0x66, 0x6F, 0x62, 0x67, 0x4A, 0x6F, 0x47, 0x66, 0x48, 0x6C, 0x46,
0x63, 0x46, 0x64, 0x36, 0x6E, 0x3E, 0x6A, 0x24, 0x71, 0x2E, 0x71, 0x0A,
0x68, 0x13, 0x71, 0x00, 0x51, 0x00, 0x5F, 0x04, 0x41, 0x00, 0x48, 0x11,
0x36, 0x09, 0x39, 0x28, 0x2F, 0x19, 0x32, 0x44, 0x28, 0x3C, 0x2B, 0x44,
0x25, 0x3F, 0x19, 0x44, 0x1D, 0x30, 0x16, 0x3B, 0x16, 0x24, 0x19, 0x28,
0x16, 0x1D, 0x23, 0x20, 0x1C, 0x1A, 0xA4, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA,
0x2A, 0x00, 0x50, 0x1D, 0x4B, 0x24, 0x58, 0x1F, 0x54, 0x34, 0x5C, 0x2A,
0x5C, 0x45, 0x58, 0x3F, 0x5C, 0x49, 0x51, 0x49, 0x55, 0x47, 0x4B, 0x49,
0x4D, 0x3D, 0x47, 0x44, 0x49, 0x11, 0x39, 0x1A, 0x40, 0x04, 0x21, 0x04,
0x31, 0x0F, 0x09, 0x04, 0x13, 0x32, 0x00, 0x1A, 0x00, 0x53, 0x07, 0x48,
0x00, 0x62, 0x1C, 0x5E, 0x0E, 0x47, 0x21, 0x40, 0x18, 0x45, 0x1B, 0x32,
0x14, 0x3B, 0x14, 0x22, 0x17, 0x27, 0x14, 0x1F, 0x1D, 0x1F, 0x1A, 0x22,
0x22, 0x1F, 0x20, 0x3C, 0x2B, 0x25, 0x25, 0x5D, 0x37, 0x53, 0x30, 0x66,
0x4D, 0x66, 0x3F, 0x59, 0x66, 0x66, 0x5C, 0x34, 0x71, 0x4D, 0x71, 0x11,
0x68, 0x1E, 0x71, 0x00, 0x50, 0x04, 0x5F, 0x1B, 0x54, 0x95, 0xAA, 0x6A,
0xA5, 0xAA, 0x5A, 0x6B, 0x8F, 0x52, 0x5A, 0x21, 0x5A, 0x21, 0x8F, 0x00,
0x8F, 0x00, 0x38, 0x61, 0x38, 0x67, 0x37, 0x65, 0x38, 0x6B, 0x34, 0x6A,
0x36, 0x6D, 0x31, 0x6D, 0x32, 0x6E, 0x2D, 0x6E, 0x2F, 0x6D, 0x29, 0x6E,
0x2B, 0x6B, 0x25, 0x6D, 0x27, 0x67, 0x22, 0x6A, 0x23, 0x61, 0x21, 0x65,
0x21, 0x00, 0x21, 0x00, 0x00, 0x61, 0x00, 0x74, 0x03, 0x6B, 0x00, 0x83,
0x0D, 0x7D, 0x07, 0x8C, 0x1C, 0x89, 0x14, 0x8F, 0x2D, 0x8F, 0x24, 0x8C,
0x3D, 0x8F, 0x34, 0x83, 0x4C, 0x89, 0x45, 0x7D, 0x51, 0x81, 0x4F, 0x76,
0x55, 0x7A, 0x54, 0x91, 0x8F, 0x6B, 0x8F, 0x1C, 0xA4, 0xAA, 0xA6, 0xAA,
0xA9, 0xAA, 0xAA, 0x02, 0x00, 0x6F, 0x1C, 0x6C, 0x23, 0x7C, 0x1D, 0x76,
0x31, 0x81, 0x29, 0x81, 0x40, 0x7B, 0x3A, 0x81, 0x46, 0x68, 0x46, 0x74,
0x40, 0x57, 0x46, 0x5E, 0x32, 0x51, 0x3B, 0x51, 0x25, 0x53, 0x2D, 0x51,
0x28, 0x3C, 0x3A, 0x37, 0x34, 0x3C, 0x40, 0x28, 0x40, 0x31, 0x3C, 0x1C,
0x40, 0x21, 0x30, 0x18, 0x37, 0x18, 0x23, 0x1D, 0x28, 0x18, 0x1D, 0x2C,
0x1E, 0x22, 0x02, 0x27, 0x0A, 0x12, 0x05, 0x1A, 0x1A, 0x05, 0x10, 0x09,
0x30, 0x00, 0x24, 0x00, 0x52, 0x0E, 0x46, 0x00, 0x5D, 0x27, 0x5D, 0x19,
0x47, 0x46, 0x5D, 0x3A, 0x5C, 0x52, 0x54, 0x49, 0x64, 0x6A, 0x64, 0x5C,
0x55, 0x8B, 0x64, 0x7D, 0x31, 0x99, 0x47, 0x99, 0x10, 0x8E, 0x1D, 0x99,
0x00, 0x6F, 0x02, 0x82, 0x1C, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x01, 0x0E, 0x73, 0x00, 0x73, 0x00, 0x5D, 0x12, 0x5D, 0x19, 0x3F, 0x00,
0x3F, 0x00, 0x28, 0x1D, 0x28, 0x25, 0x00, 0x3C, 0x00, 0x34, 0x28, 0x4B,
0x28, 0x53, 0x00, 0x6A, 0x00, 0x62, 0x28, 0x70, 0x28, 0x70, 0x3F, 0x5E,
0x3F, 0x57, 0x5D, 0x70, 0x5D, 0x70, 0x73, 0x53, 0x73, 0x4B, 0x9B, 0x34,
0x9B, 0x3C, 0x73, 0x25, 0x73, 0x1D, 0x9B, 0x06, 0x9B, 0x0E, 0x73, 0x1E,
0xA4, 0xAA, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0x2A, 0x00, 0x68, 0x1D, 0x65,
0x28, 0x7B, 0x20, 0x74, 0x3E, 0x82, 0x30, 0x82, 0x54, 0x7C, 0x4D, 0x82,
0x5C, 0x6D, 0x5C, 0x75, 0x59, 0x64, 0x5C, 0x68, 0x4E, 0x5E, 0x55, 0x60,
0x35, 0x57, 0x48, 0x5C, 0x13, 0x48, 0x1D, 0x51, 0x05, 0x2A, 0x05, 0x3C,
0x0C, 0x15, 0x05, 0x1F, 0x1F, 0x05, 0x12, 0x0B, 0x3C, 0x00, 0x2B, 0x00,
0x67, 0x0D, 0x58, 0x00, 0x76, 0x2E, 0x75, 0x19, 0x57, 0x2F, 0x4F, 0x1E,
0x55, 0x23, 0x3C, 0x19, 0x49, 0x19, 0x27, 0x1F, 0x2F, 0x19, 0x22, 0x28,
0x22, 0x22, 0x27, 0x31, 0x22, 0x2D, 0x43, 0x3B, 0x2D, 0x36, 0x63, 0x46,
0x59, 0x40, 0x74, 0x55, 0x6E, 0x4B, 0x7A, 0x6D, 0x7A, 0x5F, 0x73, 0x85,
0x7A, 0x7A, 0x5F, 0x96, 0x6C, 0x90, 0x3E, 0x9B, 0x51, 0x9B, 0x12, 0x8E,
0x21, 0x9B, 0x00, 0x68, 0x03, 0x81, 0x1E, 0x94, 0xAA, 0x6A, 0xA5, 0x6A,
0xA5, 0xAA, 0x15, 0x00, 0x02, 0x1B, 0x02, 0x1B, 0x11, 0x3C, 0x00, 0x29,
0x00, 0x4E, 0x04, 0x47, 0x00, 0x5B, 0x11, 0x56, 0x08, 0x6B, 0x04, 0x62,
0x08, 0x7C, 0x00, 0x73, 0x00, 0x90, 0x04, 0x88, 0x00, 0x9D, 0x13, 0x99,
0x09, 0xA0, 0x29, 0xA0, 0x1A, 0xA0, 0x6F, 0x83, 0x6F, 0x83, 0x31, 0x80,
0x1C, 0x83, 0x20, 0x74, 0x16, 0x7C, 0x16, 0x68, 0x19, 0x6E, 0x16, 0x61,
0x24, 0x63, 0x1D, 0x5E, 0x3B, 0x5E, 0x2B, 0x5E, 0x6F, 0x42, 0x6F, 0x42,
0x33, 0x40, 0x1F, 0x42, 0x23, 0x3B, 0x18, 0x3F, 0x1A, 0x33, 0x16, 0x38,
0x16, 0x27, 0x19, 0x2C, 0x16, 0x1F, 0x24, 0x21, 0x1D, 0x1D, 0x3A, 0x1D,
0x2A, 0x1D, 0x6F, 0x00, 0x6F, 0x00, 0x02, 0x20, 0xA8, 0x56, 0xAA, 0xA9,
0xAA, 0x56, 0xAA, 0xA9, 0x02, 0x00, 0x22, 0x03, 0x18, 0x01, 0x1E, 0x0A,
0x0C, 0x05, 0x12, 0x17, 0x03, 0x0E, 0x07, 0x2B, 0x00, 0x1F, 0x00, 0x77,
0x00, 0x63, 0x20, 0x2B, 0x20, 0x25, 0x21, 0x28, 0x20, 0x23, 0x25, 0x23,
0x23, 0x24, 0x29, 0x23, 0x27, 0x27, 0x2C, 0x25, 0x2B, 0x64, 0x45, 0x70,
0x4D, 0x6C, 0x49, 0x77, 0x57, 0x75, 0x52, 0x7B, 0x62, 0x7A, 0x5D, 0x7B,
0x6D, 0x7B, 0x68, 0x79, 0x77, 0x7B, 0x71, 0x72, 0x83, 0x77, 0x7D, 0x65,
0x8C, 0x6D, 0x88, 0x50, 0x8F, 0x5D, 0x8F, 0x15, 0x8F, 0x00, 0x6F, 0x50,
0x6F, 0x56, 0x6E, 0x54, 0x6F, 0x59, 0x6A, 0x58, 0x6C, 0x58, 0x66, 0x59,
0x68, 0x55, 0x63, 0x57, 0x64, 0x17, 0x4A, 0x0B, 0x42, 0x10, 0x47, 0x04,
0x38, 0x07, 0x3D, 0x01, 0x2D, 0x01, 0x32, 0x00, 0x22, 0x00, 0x27, 0x21,
0xA8, 0xAA, 0x96, 0xAA, 0xAA, 0xAA, 0xA5, 0xAA, 0x06, 0x46, 0x6F, 0x3B,
0x71, 0x3F, 0x6F, 0x34, 0x77, 0x37, 0x73, 0x30, 0x82, 0x32, 0x7C, 0x30,
0x93, 0x30, 0x87, 0x2E, 0xAF, 0x30, 0xA7, 0x27, 0xBB, 0x2C, 0xB7, 0x19,
0xC3, 0x22, 0xC0, 0x05, 0xC3, 0x13, 0xC3, 0x00, 0xC3, 0x00, 0xAC, 0x0E,
0xAB, 0x0B, 0xAC, 0x13, 0xA7, 0x12, 0xA9, 0x15, 0x9E, 0x15, 0xA4, 0x16,
0x86, 0x15, 0x98, 0x19, 0x75, 0x16, 0x7C, 0x1E, 0x6A, 0x1B, 0x6F, 0x28,
0x62, 0x22, 0x66, 0x1D, 0x59, 0x21, 0x5E, 0x17, 0x48, 0x18, 0x52, 0x15,
0x28, 0x15, 0x41, 0x13, 0x1E, 0x15, 0x20, 0x0F, 0x1A, 0x12, 0x1B, 0x00,
0x19, 0x0C, 0x19, 0x00, 0x00, 0x05, 0x00, 0x1B, 0x02, 0x13, 0x00, 0x27,
0x0A, 0x22, 0x04, 0x2E, 0x16, 0x2C, 0x0F, 0x30, 0x2E, 0x30, 0x1E, 0x31,
0x46, 0x30, 0x41, 0x38, 0x52, 0x33, 0x4F, 0x46, 0x56, 0x3D, 0x56, 0x46,
0x6F, 0x22, 0xA4, 0xAA, 0x5A, 0xAA, 0xAA, 0xAA, 0x5A, 0xAA, 0x2A, 0x00,
0x6F, 0x00, 0x56, 0x0B, 0x54, 0x07, 0x56, 0x12, 0x4E, 0x0F, 0x52, 0x16,
0x43, 0x15, 0x49, 0x16, 0x32, 0x16, 0x3E, 0x18, 0x16, 0x16, 0x1E, 0x1F,
0x0A, 0x1A, 0x0E, 0x2D, 0x02, 0x24, 0x05, 0x41, 0x00, 0x33, 0x00, 0x46,
0x00, 0x46, 0x19, 0x37, 0x1A, 0x3B, 0x19, 0x33, 0x1E, 0x34, 0x1B, 0x31,
0x27, 0x31, 0x20, 0x30, 0x3F, 0x31, 0x2D, 0x2E, 0x50, 0x30, 0x49, 0x28,
0x5A, 0x2B, 0x56, 0x1E, 0x62, 0x25, 0x5E, 0x28, 0x6B, 0x24, 0x66, 0x2E,
0x76, 0x2C, 0x6F, 0x30, 0x88, 0x30, 0x7D, 0x31, 0x9D, 0x31, 0x99, 0x33,
0xA7, 0x31, 0xA4, 0x38, 0xAB, 0x34, 0xA9, 0x46, 0xAC, 0x3B, 0xAC, 0x46,
0xC3, 0x41, 0xC3, 0x2B, 0xC3, 0x33, 0xC3, 0x1F, 0xBB, 0x24, 0xC0, 0x18,
0xAF, 0x1A, 0xB6, 0x16, 0x97, 0x16, 0xA7, 0x15, 0x7F, 0x16, 0x84, 0x0E,
0x73, 0x13, 0x76, 0x00, 0x6F, 0x09, 0x6F, 0x29, 0xA4, 0xAA, 0xAA, 0xAA,
0xAA, 0x6A, 0xA5, 0xAA, 0xAA, 0xAA, 0x0A, 0xB0, 0x97, 0xC5, 0x97, 0xA6,
0xB7, 0xBB, 0xAC, 0x6B, 0xC3, 0x8E, 0xC3, 0x31, 0xB9, 0x49, 0xC3, 0x0C,
0x98, 0x18, 0xAE, 0x00, 0x67, 0x00, 0x81, 0x0E, 0x32, 0x00, 0x4B, 0x33,
0x0D, 0x1B, 0x19, 0x69, 0x00, 0x4A, 0x00, 0x97, 0x0A, 0x83, 0x00, 0xB5,
0x27, 0xAB, 0x14, 0xC0, 0x4F, 0xC0, 0x39, 0xB0, 0x7E, 0xC0, 0x69, 0x7C,
0x99, 0x9C, 0x99, 0x6F, 0x96, 0x74, 0x99, 0x6A, 0x8D, 0x6B, 0x93, 0x4E,
0x99, 0x5E, 0x99, 0x32, 0x8D, 0x3D, 0x99, 0x26, 0x6E, 0x26, 0x81, 0x34,
0x42, 0x26, 0x56, 0x5E, 0x2A, 0x44, 0x2A, 0x79, 0x38, 0x70, 0x2A, 0x7B,
0x2C, 0x96, 0x2C, 0x87, 0x76, 0x86, 0x7F, 0x86, 0x7D, 0x87, 0x83, 0x86,
0x81, 0x8A, 0x84, 0x88, 0x84, 0x96, 0x7E, 0x8E, 0x84, 0xA7, 0x69, 0xA1,
0x76, 0xAE, 0x4E, 0xAE, 0x5C, 0x9B, 0x24, 0xAE, 0x35, 0x68, 0x13, 0x89,
0x13, 0x39, 0x1E, 0x4D, 0x13, 0x1C, 0x3E, 0x26, 0x29, 0x13, 0x69, 0x13,
0x53, 0x1D, 0x90, 0x13, 0x7E, 0x3C, 0xAA, 0x28, 0xA2, 0x69, 0xB2, 0x50,
0xB2, 0x93, 0xAB, 0x82, 0xB2, 0xB0, 0x97, 0xA5, 0xA4, 0xC0, 0x00, 0x24,
0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x39, 0x00, 0x00,
0x3C, 0x00, 0x00, 0x92, 0x00, 0xC0, 0x00, 0x37, 0x00, 0x00, 0xB6, 0x00,
0x00, 0x83, 0x00, 0xC0, 0x00, 0x37, 0x00, 0x00, 0xB6, 0x00, 0x00, 0x71,
0x00, 0xC0, 0x00, 0x47, 0x00, 0x00, 0x47, 0x00, 0x00, 0x9F, 0x00, 0xC0,
0x00, 0x24, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xB6,
0x00, 0x00, 0xB6, 0x00, 0x00, 0x9B, 0x00, 0xC0, 0x00, 0xB6, 0x00, 0x00,
0xB6, 0x00, 0x00, 0x9D, 0x00, 0xC0, 0x00, 0x24, 0x00, 0x00, 0x59, 0x00,
0x00, 0x59, 0x00, 0xC0, 0x00, 0x24, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x3F,
0x00, 0xC0, 0x00, 0x3D, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x97, 0x00, 0xC0,
0x00, 0x24, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x21, 0x00, 0xC0, 0x00, 0x24,
0x00, 0x00, 0x24, 0x00, 0x00, 0xA1, 0x00, 0x9F, 0x00, 0x00, 0x00, 0x00,
0x3B, 0x00, 0x00, 0x02, 0x20, 0xD5, 0x34, 0x00, 0x00, 0x3E, 0x42, 0x03,
0x00, 0x01, 0xB7, 0x79, 0x00, 0x00, 0x00, 0x02, 0x4E, 0x74, 0x59, 0x00,
0x00, 0x3E, 0xFF, 0x00, 0x00, 0x2E, 0x3E, 0x20, 0x03, 0x00, 0x00, 0x02,
0x71, 0xD7, 0x73, 0x00, 0x00, 0x3B, 0x20, 0x1A, 0x00, 0x2A, 0x7A, 0x21,
0x02, 0x00, 0x00, 0x04, 0x65, 0xEA, 0x6E, 0x00, 0x01, 0x00, 0xA3, 0x1D,
0x00, 0x00, 0x32, 0xC5, 0x17, 0x00, 0x1E, 0x52, 0xCA, 0x02, 0x00, 0x3A,
0x97, 0xE1, 0x02, 0x00, 0x00, 0x05, 0xA8, 0xDB, 0xB2, 0x00, 0x00, 0x3B,
0x3C, 0x07, 0x00, 0x21, 0x3B, 0x2E, 0x02, 0x00, 0x16, 0x4B, 0x6C, 0x06,
0x00, 0x65, 0x8A, 0xC8, 0x05, 0x00, 0x7C, 0x9B, 0x46, 0x06, 0x00, 0x00,
0x03, 0x8C, 0xD9, 0x8F, 0x00, 0x00, 0x3B, 0x08, 0x17, 0x00, 0x2F, 0x4F,
0xF4, 0x06, 0x00, 0x1D, 0x8F, 0xA4, 0x03, 0x00, 0x00, 0x01, 0x20, 0x74,
0x29, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x35, 0xFF, 0x3B,
0x00, 0x00, 0x3B, 0x50, 0x0A, 0x00, 0x00, 0x02, 0x35, 0xFF, 0x40, 0x00,
0x01, 0x00, 0xFD, 0x1D, 0x00, 0x00, 0x3B, 0x4C, 0x0D, 0x00, 0x00, 0x01,
0x4B, 0x84, 0x4F, 0x00, 0x00, 0x3B, 0x4A, 0x13, 0x00, 0x00, 0x01, 0x6A,
0xBF, 0x72, 0x00, 0x00, 0x55, 0x11, 0x0B, 0x00, 0x00, 0x01, 0x20, 0xF6,
0x2F, 0x00, 0x00, 0xB7, 0x70, 0x01, 0x00, 0x00, 0x01, 0x39, 0xAD, 0x3B,
0x00, 0x00, 0x8F, 0xA3, 0x02, 0x00, 0x00, 0x01, 0x1E, 0xD5, 0x2C, 0x00,
0x00, 0xB7, 0x79, 0x00, 0x00, 0x01, 0x02, 0x3C, 0xD7, 0x3B, 0x00, 0x01,
0x00, 0x99, 0x1D, 0x00, 0x00, 0x3B, 0xBD, 0x02, 0x00, 0x00, 0x02, 0x62,
0xD7, 0x6C, 0x00, 0x00, 0x3D, 0xA8, 0x06, 0x00, 0x1E, 0x55, 0xE9, 0x0B,
0x00, 0x00, 0x01, 0x43, 0xD5, 0x65, 0x00, 0x00, 0x3D, 0x04, 0x06, 0x00,
0x00, 0x01, 0x66, 0xD5, 0x70, 0x00, 0x00, 0x3D, 0xC6, 0x15, 0x00, 0x00,
0x02, 0x65, 0xD7, 0x6D, 0x00, 0x01, 0x00, 0x85, 0x1D, 0x00, 0x00, 0x3D,
0xAB, 0x19, 0x00, 0x00, 0x02, 0x6D, 0xD5, 0x71, 0x00, 0x00, 0x3D, 0x34,
0x0A, 0x00, 0x1B, 0x69, 0xFD, 0x01, 0x00, 0x00, 0x02, 0x66, 0xD7, 0x6C,
0x00, 0x01, 0x00, 0x8F, 0x1D, 0x00, 0x00, 0x40, 0x77, 0x15, 0x00, 0x00,
0x02, 0x65, 0xD7, 0x6C, 0x00, 0x00, 0x3D, 0x46, 0x10, 0x00, 0x20, 0x87,
0x50, 0x05, 0x00, 0x00, 0x02, 0x63, 0xD5, 0x6C, 0x00, 0x01, 0x00, 0xB7,
0x1D, 0x00, 0x00, 0x40, 0xA4, 0x08, 0x00, 0x00, 0x03, 0x64, 0xD7, 0x6D,
0x00, 0x00, 0x3D, 0x8C, 0x10, 0x00, 0x1F, 0x54, 0x2A, 0x04, 0x00, 0x1C,
0x8F, 0x50, 0x04, 0x00, 0x00, 0x03, 0x65, 0xD7, 0x6F, 0x00, 0x01, 0x00,
0xF3, 0x1D, 0x00, 0x00, 0x3D, 0x88, 0x11, 0x00, 0x1C, 0x55, 0xC2, 0x04,
0x00, 0x00, 0x03, 0x1E, 0xD5, 0x32, 0x00, 0x01, 0x00, 0xDF, 0x1D, 0x00,
0x00, 0x67, 0x79, 0x00, 0x00, 0x00, 0xB7, 0x79, 0x00, 0x00, 0x00, 0x02,
0x20, 0xF6, 0x35, 0x00, 0x02, 0x67, 0x79, 0x00, 0x00, 0x00, 0xB7, 0x70,
0x01, 0x00, 0x00, 0x02, 0x68, 0xC4, 0x71, 0x00, 0x01, 0x00, 0xD5, 0x1D,
0x00, 0x00, 0x51, 0x01, 0x04, 0x00, 0x00, 0x02, 0x6A, 0xAF, 0x72, 0x00,
0x00, 0x66, 0x6F, 0x02, 0x00, 0x00, 0x93, 0x62, 0x02, 0x00, 0x00, 0x01,
0x68, 0xC4, 0x71, 0x00, 0x00, 0x51, 0x91, 0x03, 0x00, 0x00, 0x02, 0x6D,
0xD5, 0x76, 0x00, 0x00, 0x3C, 0xFA, 0x12, 0x00, 0x28, 0xB7, 0x79, 0x00,
0x00, 0x00, 0x02, 0xC6, 0xFF, 0xC7, 0x00, 0x00, 0x3B, 0xDB, 0x1C, 0x00,
0x41, 0x77, 0x7E, 0x0A, 0x00, 0x00, 0x02, 0x98, 0xD5, 0x98, 0x00, 0x00,
0x3E, 0xEE, 0x05, 0x00, 0x36, 0x61, 0xF3, 0x01, 0x00, 0x00, 0x03, 0x7F,
0xD5, 0x89, 0x00, 0x00, 0x3E, 0x09, 0x10, 0x00, 0x1E, 0x57, 0xC6, 0x07,
0x00, 0x1E, 0x92, 0x7A, 0x07, 0x00, 0x00, 0x01, 0x84, 0xD7, 0x8E, 0x00,
0x00, 0x3B, 0xCE, 0x11, 0x00, 0x00, 0x02, 0x7F, 0xD5, 0x89, 0x00, 0x00,
0x3E, 0x08, 0x0A, 0x00, 0x1E, 0x57, 0xB0, 0x0A, 0x00, 0x00, 0x01, 0x73,
0xD5, 0x7D, 0x00, 0x00, 0x3E, 0xC2, 0x0C, 0x00, 0x00, 0x01, 0x68, 0xD5,
0x71, 0x00, 0x00, 0x3E, 0xD0, 0x09, 0x00, 0x00, 0x01, 0x8D, 0xD7, 0x9A,
0x00, 0x00, 0x3B, 0x67, 0x17, 0x00, 0x00, 0x01, 0x79, 0xD5, 0x89, 0x00,
0x00, 0x3E, 0xA3, 0x0C, 0x00, 0x00, 0x02, 0x1F, 0xD5, 0x2D, 0x00, 0x01,
0x00, 0xC1, 0x1D, 0x00, 0x00, 0x3E, 0x14, 0x02, 0x00, 0x00, 0x01, 0x61,
0xD7, 0x72, 0x00, 0x00, 0x3E, 0xAE, 0x0D, 0x00, 0x00, 0x01, 0x88, 0xD5,
0x88, 0x00, 0x00, 0x3E, 0xCA, 0x0B, 0x00, 0x00, 0x01, 0x6B, 0xD5, 0x71,
0x00, 0x00, 0x3F, 0x31, 0x03, 0x00, 0x00, 0x01, 0x92, 0xD5, 0xA0, 0x00,
0x00, 0x3E, 0x12, 0x0E, 0x00, 0x00, 0x01, 0x78, 0xD5, 0x88, 0x00, 0x00,
0x3E, 0xC8, 0x08, 0x00, 0x00, 0x02, 0x93, 0xD7, 0x9B, 0x00, 0x00, 0x3B,
0x68, 0x09, 0x00, 0x1F, 0x55, 0x2A, 0x05, 0x00, 0x00, 0x02, 0x74, 0xD5,
0x7D, 0x00, 0x00, 0x3E, 0x30, 0x0B, 0x00, 0x1E, 0x57, 0x5C, 0x08, 0x00,
0x00, 0x02, 0x98, 0xE4, 0x9B, 0x00, 0x00, 0x3B, 0x64, 0x0E, 0x00, 0x1F,
0x55, 0xDC, 0x0A, 0x00, 0x00, 0x02, 0x88, 0xD5, 0x89, 0x00, 0x00, 0x3E,
0x6E, 0x12, 0x00, 0x1E, 0x57, 0x80, 0x08, 0x00, 0x00, 0x01, 0x7B, 0xD7,
0x85, 0x00, 0x00, 0x3B, 0x63, 0x1A, 0x00, 0x00, 0x01, 0x78, 0xD5, 0x7C,
0x00, 0x00, 0x3E, 0x14, 0x04, 0x00, 0x00, 0x02, 0x79, 0xD7, 0x89, 0x00,
0x01, 0x00, 0xCB, 0x1D, 0x00, 0x00, 0x3E, 0x2A, 0x15, 0x00, 0x01, 0x01,
0x8D, 0xD5, 0x8C, 0x00, 0x00, 0x3E, 0xEE, 0x03, 0x00, 0x00, 0x01, 0xC6,
0xD5, 0xC6, 0x00, 0x00, 0x3E, 0x9D, 0x0E, 0x00, 0x00, 0x01, 0x8C, 0xD5,
0x8C, 0x00, 0x00, 0x3E, 0x0E, 0x0D, 0x00, 0x01, 0x01, 0x8D, 0xD5, 0x8D,
0x00, 0x00, 0x3E, 0x44, 0x08, 0x00, 0x00, 0x01, 0x7B, 0xD5, 0x7E, 0x00,
0x00, 0x3E, 0xE2, 0x08, 0x00, 0x00, 0x01, 0x34, 0xFF, 0x37, 0x00, 0x00,
0x3E, 0x14, 0x05, 0x00, 0x01, 0x01, 0x3C, 0xD7, 0x3B, 0x00, 0x00, 0x3B,
0x96, 0x02, 0x00, 0x00, 0x01, 0x34, 0xFF, 0x43, 0x00, 0x00, 0x3E, 0xB2,
0x05, 0x00, 0x00, 0x01, 0x64, 0x8E, 0x6F, 0x00, 0x00, 0x3B, 0x53, 0x03,
0x00, 0x02, 0x01, 0x79, 0xFE, 0x77, 0x00, 0x00, 0xEB, 0x55, 0x02, 0x00,
0x00, 0x01, 0x2F, 0x5B, 0x42, 0x00, 0x00, 0x3B, 0x48, 0x02, 0x00, 0x00,
0x02, 0x67, 0xD7, 0x6E, 0x00, 0x00, 0x65, 0x77, 0x18, 0x00, 0x1D, 0xA0,
0x9E, 0x07, 0x00, 0x00, 0x02, 0x6B, 0xD7, 0x73, 0x00, 0x00, 0x3E, 0x76,
0x0C, 0x00, 0x1D, 0x7B, 0x16, 0x07, 0x00, 0x00, 0x01, 0x68, 0xD7, 0x6C,
0x00, 0x00, 0x65, 0xAE, 0x12, 0x00, 0x00, 0x02, 0x6B, 0xD7, 0x78, 0x00,
0x00, 0x3E, 0xE1, 0x0C, 0x00, 0x1D, 0x7B, 0xCE, 0x06, 0x00, 0x00, 0x02,
0x67, 0xD7, 0x6F, 0x00, 0x00, 0x65, 0x00, 0x0F, 0x00, 0x1E, 0x7B, 0xF8,
0x02, 0x00, 0x00, 0x01, 0x4A, 0xD5, 0x44, 0x00, 0x00, 0x3B, 0x90, 0x13,
0x00, 0x00, 0x02, 0x6B, 0xFF, 0x78, 0x00, 0x00, 0x65, 0xAD, 0x16, 0x00,
0x1D, 0x7B, 0x20, 0x06, 0x00, 0x00, 0x01, 0x64, 0xD5, 0x72, 0x00, 0x00,
0x3E, 0x54, 0x14, 0x00, 0x00, 0x02, 0x1E, 0xD5, 0x2C, 0x00, 0x00, 0x3E,
0xF2, 0x00, 0x00, 0x00, 0x67, 0x89, 0x02, 0x00, 0x0A, 0x02, 0x36, 0xFF,
0x44, 0x00, 0x18, 0x3E, 0xF2, 0x00, 0x00, 0x00, 0x67, 0x3B, 0x0F, 0x00,
0x00, 0x01, 0x65, 0xD5, 0x67, 0x00, 0x00, 0x3E, 0xAB, 0x0B, 0x00, 0x00,
0x01, 0x1E, 0xD5, 0x2C, 0x00, 0x00, 0x3E, 0x7C, 0x02, 0x00, 0x00, 0x01,
0xA1, 0xD5, 0xAE, 0x00, 0x00, 0x65, 0xE2, 0x1A, 0x00, 0x00, 0x01, 0x64,
0xD5, 0x72, 0x00, 0x00, 0x65, 0x10, 0x14, 0x00, 0x00, 0x02, 0x71, 0xD7,
0x78, 0x00, 0x00, 0x65, 0x3A, 0x09, 0x00, 0x1D, 0x7C, 0x76, 0x05, 0x00,
0x00, 0x02, 0x6B, 0xFE, 0x72, 0x00, 0x00, 0x65, 0x33, 0x0E, 0x00, 0x1C,
0x7B, 0x9C, 0x04, 0x00, 0x00, 0x02, 0x6A, 0xFE, 0x77, 0x00, 0x00, 0x65,
0xE1, 0x0D, 0x00, 0x1D, 0x7B, 0x76, 0x04, 0x00, 0x00, 0x01, 0x47, 0xD5,
0x44, 0x00, 0x00, 0x65, 0x7F, 0x0D, 0x00, 0x00, 0x01, 0x67, 0xD7, 0x70,
0x00, 0x00, 0x65, 0xDD, 0x18, 0x00, 0x00, 0x01, 0x41, 0xD7, 0x43, 0x00,
0x00, 0x41, 0x68, 0x16, 0x00, 0x00, 0x01, 0x64, 0xD7, 0x72, 0x00, 0x00,
0x67, 0xCC, 0x13, 0x00, 0x00, 0x01, 0x72, 0xD5, 0x74, 0x00, 0x00, 0x67,
0xEA, 0x09, 0x00, 0x00, 0x01, 0xA3, 0xD5, 0xA3, 0x00, 0x00, 0x67, 0xBE,
0x0E, 0x00, 0x00, 0x01, 0x72, 0xD5, 0x74, 0x00, 0x00, 0x67, 0x2D, 0x0D,
0x00, 0x00, 0x01, 0x71, 0xFF, 0x74, 0x00, 0x00, 0x67, 0xD4, 0x10, 0x00,
0x00, 0x01, 0x62, 0xD5, 0x66, 0x00, 0x00, 0x67, 0xE0, 0x0F, 0x00, 0x00,
0x01, 0x47, 0xFF, 0x4C, 0x00, 0x00, 0x3B, 0x51, 0x1C, 0x00, 0x00, 0x01,
0x18, 0xFF, 0x29, 0x00, 0x00, 0x3B, 0xB0, 0x02, 0x00, 0x00, 0x01, 0x47,
0xFF, 0x4E, 0x00, 0x00, 0x3B, 0xCB, 0x1B, 0x00, 0x00, 0x01, 0x6E, 0xA0,
0x74, 0x00, 0x00, 0x75, 0xA5, 0x0F, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00,
0x3B, 0x00, 0x00, 0x04, 0xDF, 0xF1, 0xF3, 0x00, 0x00, 0x12, 0x86, 0x00,
0x00, 0x0B, 0x1E, 0xBC, 0x00, 0x00, 0x2F, 0x42, 0x92, 0x06, 0x00, 0x5C,
0x60, 0xE9, 0x01, 0x00, 0x00, 0x05, 0xDF, 0xF1, 0xF3, 0x00, 0x00, 0x12,
0x86, 0x00, 0x00, 0x0B, 0x1E, 0xBC, 0x00, 0x00, 0x3F, 0x42, 0x94, 0x01,
0x00, 0x59, 0x57, 0x10, 0x01, 0x00, 0x59, 0x89, 0x40, 0x01, 0x00, 0x00,
0x03, 0xDF, 0xF1, 0xF3, 0x00, 0x00, 0x12, 0x86, 0x00, 0x00, 0x0B, 0x1E,
0xBC, 0x00, 0x00, 0x34, 0x42, 0x5D, 0x0B, 0x00, 0x00, 0x03, 0xDF, 0xF1,
0xF3, 0x00, 0x00, 0x12, 0x86, 0x00, 0x00, 0x0B, 0x1E, 0xBC, 0x00, 0x00,
0x34, 0x42, 0x62, 0x07, 0x00, 0x00, 0x01, 0xAD, 0xE3, 0xAF, 0x00, 0x00,
0x5F, 0x0C, 0x11, 0x00, 0x00, 0x01, 0x83, 0xF8, 0x98, 0x00, 0x00, 0x46,
0x48, 0x11, 0x00, 0x00, 0x02, 0x90, 0xCC, 0x95, 0x00, 0x01, 0x00, 0xAD,
0x1D, 0x00, 0x00, 0x3C, 0x1B, 0x16, 0x00, 0x00, 0x01, 0x92, 0xCC, 0x98,
0x00, 0x00, 0x3C, 0x4B, 0x19, 0x00, 0x00, 0x02, 0x9D, 0xCC, 0xA6, 0x00,
0x00, 0x3C, 0x98, 0x14, 0x00, 0x21, 0x5D, 0x7C, 0x0B, 0x00, 0x00, 0x01,
0x97, 0xCC, 0xA0, 0x00, 0x00, 0x3C, 0xE9, 0x14, 0x00, 0x00, 0x01, 0x8A,
0xCC, 0x93, 0x00, 0x00, 0x3C, 0x1F, 0x18, 0x00, 0x00, 0x01, 0x7E, 0xCC,
0x86, 0x00, 0x00, 0x3C, 0xE8, 0x04, 0x00, 0x00, 0x01, 0x90, 0xCC, 0x99,
0x00, 0x00, 0x3C, 0x57, 0x0C, 0x00, 0x00, 0x01, 0x7C, 0xCC, 0x80, 0x00,
0x00, 0x3C, 0x4F, 0x1B, 0x00, 0x00, 0x01, 0x2C, 0xD5, 0x2C, 0x00, 0x00,
0x3E, 0x07, 0x02, 0x00, 0x00, 0x01, 0x01, 0xD5, 0x2C, 0x00, 0x00, 0xD4,
0x3B, 0x02, 0x00, 0x00, 0x02, 0x45, 0x6F, 0x46, 0x00, 0x00, 0x29, 0x20,
0x0C, 0x00, 0x12, 0x3B, 0xEA, 0x07, 0x00, 0x00, 0x04, 0xC4, 0xF1, 0xE6,
0x00, 0x00, 0x12, 0xFC, 0x08, 0x00, 0x0B, 0x1E, 0xC3, 0x03, 0x00, 0x28,
0x6D, 0x0F, 0x03, 0x00, 0x60, 0x6D, 0x9C, 0x05, 0x00, 0x00, 0x05, 0xC4,
0xF1, 0xE6, 0x00, 0x00, 0x12, 0x96, 0x09, 0x00, 0x0B, 0x1E, 0x66, 0x03,
0x00, 0x1B, 0x6D, 0x1A, 0x12, 0x00, 0x6A, 0x6D, 0xFE, 0x04, 0x00, 0x2C,
0x7B, 0x14, 0x08, 0x00, 0x00, 0x02, 0x73, 0xCC, 0x7B, 0x00, 0x01, 0x00,
0xE9, 0x1D, 0x00, 0x00, 0x3C, 0x72, 0x0F, 0x00, 0x00, 0x02, 0xDF, 0xF1,
0xF3, 0x00, 0x00, 0x12, 0x86, 0x00, 0x00, 0x34, 0x41, 0xDF, 0x0E, 0x00,
0x00, 0x04, 0xDF, 0xF1, 0xF3, 0x00, 0x00, 0x12, 0x86, 0x00, 0x00, 0x3F,
0x42, 0x94, 0x01, 0x00, 0x59, 0x57, 0x10, 0x01, 0x00, 0x59, 0x89, 0x40,
0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF,
0xFE, 0xFF, 0xC3, 0x49, 0x00, 0xF2, 0x8C, 0x00, 0x00, 0xFE, 0x90, 0x00,
0x04, 0xF2, 0x00, 0xF2, 0x00, 0xF2, 0x82, 0x00, 0x00, 0xFE, 0x84, 0x00,
0x00, 0xF2, 0x81, 0x00, 0x07, 0xF6, 0xF2, 0x00, 0xF2, 0x00, 0xF2, 0x00,
0xF2, 0x00, 0xF2, 0x9E, 0x00, 0x00, 0xF6, 0x82, 0x00, 0x00, 0xF6, 0x82,
0x00, 0x00, 0xFE, 0x84, 0x00, 0x00, 0xF2, 0x81, 0x00, 0x00, 0xF6, 0x81,
0x00, 0x00, 0xFA, 0x82, 0x00, 0x00, 0xFA, 0x00, 0xF6, 0x9E, 0x00, 0x00,
0xFA, 0x82, 0x00, 0x00, 0xFE, 0x88, 0x00, 0x00, 0xFE, 0x81, 0x00, 0x00,
0xFE, 0x81, 0x00, 0x00, 0xFE, 0x82, 0x00, 0x00, 0xFE, 0x00, 0xEE, 0x9E,
0x00, 0x00, 0xF6, 0x82, 0x00, 0x00, 0xF6, 0x82, 0x00, 0x00, 0xFA, 0x84,
0x00, 0x02, 0xF2, 0xF6, 0xF2, 0x82, 0x00, 0x81, 0xF6, 0x05, 0xF2, 0x00,
0xF2, 0xF6, 0x00, 0xEE, 0x9B, 0x00, 0x03, 0xFA, 0xFE, 0x00, 0xFA, 0xD8,
0x00, 0x00, 0xF6, 0x05, 0xF2, 0x00, 0xF2, 0xF6, 0x00, 0xEE, 0x9E, 0x00,
0x00, 0xFA, 0xD8, 0x00, 0x00, 0xF6, 0x81, 0xFE, 0x01, 0x00, 0xFA, 0x00,
0xFD, 0x81, 0xF8, 0x00, 0x04, 0x00, 0x08, 0x00, 0xF7, 0x00, 0xF6, 0x32,
0x4E, 0x46, 0x53
};

View file

@ -0,0 +1,47 @@
#pragma once
const uint8_t cerbiosini_html[] = {
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c,
0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x65, 0x6e, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2d, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x72, 0x6b, 0x3e, 0x3c, 0x68, 0x65,
0x61, 0x64, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x20, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e,
0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x66, 0x69, 0x74, 0x3d, 0x6e, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53,
0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65,
0x6c, 0x3d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x69, 0x6d, 0x61, 0x67,
0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e,
0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x70, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x73, 0x73, 0x20,
0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x2f,
0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x6d,
0x61, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x50, 0x72,
0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x3a, 0x20, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f,
0x73, 0x20, 0x49, 0x4e, 0x49, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c,
0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3e,
0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x57, 0x61, 0x69, 0x74, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f,
0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f,
0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64,
0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20,
0x68, 0x72, 0x65, 0x66, 0x3d, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a,
0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d,
0x73, 0x65, 0x74, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x49, 0x6e, 0x69, 0x28, 0x29, 0x3e,
0x53, 0x61, 0x76, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65,
0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x73, 0x65,
0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x69, 0x6e, 0x64,
0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x42, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76,
0x3e, 0x3c, 0x62, 0x3e, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30,
0x32, 0x34, 0x20, 0x2d, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f,
0x73, 0x20, 0x2b, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x75, 0x72, 0x67, 0x65,
0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x66, 0x6f,
0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70,
0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x63, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x69, 0x6e, 0x69,
0x2e, 0x6a, 0x73, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62,
0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e
};

View file

@ -0,0 +1,102 @@
#pragma once
const uint8_t cerbiosini_js[] = {
0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20,
0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x49, 0x6e, 0x69,
0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63,
0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x43, 0x65, 0x72,
0x62, 0x69, 0x6f, 0x73, 0x49, 0x6e, 0x69, 0x28, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x69, 0x6e, 0x69, 0x22, 0x29,
0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x72, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x65,
0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x62, 0x6f, 0x64,
0x79, 0x2e, 0x67, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65,
0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74,
0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x29,
0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74,
0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x72,
0x75, 0x65, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73,
0x74, 0x20, 0x7b, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
0x7d, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72,
0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x6e, 0x65, 0x29, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d,
0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28,
0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3a,
0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x63,
0x68, 0x75, 0x6e, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x22, 0x22,
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x22, 0x3c, 0x70, 0x3e, 0x3c, 0x64,
0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x5c, 0x22, 0x67, 0x72, 0x69, 0x64, 0x5c,
0x22, 0x3e, 0x3c, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x20, 0x72, 0x6f, 0x77, 0x73,
0x3d, 0x5c, 0x22, 0x34, 0x30, 0x5c, 0x22, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x3d, 0x5c, 0x22, 0x38,
0x30, 0x5c, 0x22, 0x20, 0x73, 0x70, 0x65, 0x6c, 0x6c, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x3d, 0x5c,
0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x5c, 0x22, 0x63, 0x65,
0x72, 0x62, 0x69, 0x6f, 0x73, 0x69, 0x6e, 0x69, 0x5c, 0x22, 0x3e, 0x22, 0x20, 0x2b, 0x20, 0x62,
0x6f, 0x64, 0x79, 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65,
0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x22, 0x3b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74,
0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67,
0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63,
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72,
0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f,
0x64, 0x79, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x63, 0x61,
0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28,
0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e,
0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64,
0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x0d, 0x0a, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61,
0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65,
0x74, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x49, 0x6e, 0x69, 0x28, 0x29, 0x0d, 0x0a, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74,
0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63, 0x65, 0x72,
0x62, 0x69, 0x6f, 0x73, 0x69, 0x6e, 0x69, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77,
0x20, 0x46, 0x6f, 0x72, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x62,
0x6f, 0x64, 0x79, 0x27, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e,
0x6e, 0x65, 0x72, 0x54, 0x65, 0x78, 0x74, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61,
0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69,
0x2f, 0x63, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x69, 0x6e, 0x69, 0x22, 0x2c, 0x20, 0x7b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a,
0x20, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x20, 0x64, 0x61, 0x74, 0x61, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74,
0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x30, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64,
0x6f, 0x77, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66,
0x20, 0x3d, 0x20, 0x22, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22,
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73,
0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x28, 0x29,
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, 0x29, 0x20, 0x3d, 0x3e,
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x6c, 0x6f,
0x61, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x28, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d,
0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x28, 0x22, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x66,
0x61, 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a
};

View file

@ -0,0 +1,43 @@
#pragma once
const uint8_t download_html[] = {
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c,
0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x65, 0x6e, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2d, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x72, 0x6b, 0x3e, 0x3c, 0x68, 0x65,
0x61, 0x64, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x20, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e,
0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x66, 0x69, 0x74, 0x3d, 0x6e, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53,
0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65,
0x6c, 0x3d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x69, 0x6d, 0x61, 0x67,
0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e,
0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x70, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x73, 0x73, 0x20,
0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x2f,
0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x6d,
0x61, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x50, 0x72,
0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x3a, 0x20, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f,
0x61, 0x64, 0x20, 0x42, 0x49, 0x4f, 0x53, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76,
0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
0x74, 0x3e, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x57, 0x61, 0x69, 0x74, 0x2e, 0x2e, 0x2e,
0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72,
0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72,
0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f,
0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72,
0x79, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d,
0x6c, 0x3e, 0x42, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x3e, 0x43, 0x6f,
0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x32, 0x34, 0x20, 0x2d, 0x20, 0x54,
0x65, 0x61, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x54, 0x65,
0x61, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x6d,
0x61, 0x69, 0x6e, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d,
0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x6a, 0x73, 0x3e, 0x3c, 0x2f, 0x73, 0x63,
0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74,
0x6d, 0x6c, 0x3e
};

View file

@ -0,0 +1,86 @@
#pragma once
const uint8_t download_js[] = {
0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20,
0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x29,
0x3b, 0x0d, 0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6b, 0x49,
0x6e, 0x66, 0x6f, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61,
0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62,
0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x29, 0x2e, 0x74,
0x68, 0x65, 0x6e, 0x28, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x20, 0x3d, 0x20,
0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6a,
0x73, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64,
0x79, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b,
0x20, 0x69, 0x20, 0x3c, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x69,
0x5d, 0x2e, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x22,
0x3c, 0x70, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x5c, 0x22,
0x67, 0x72, 0x69, 0x64, 0x5c, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x5c,
0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5c, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x5c,
0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64,
0x28, 0x30, 0x29, 0x5c, 0x22, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x5c, 0x22,
0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x28, 0x22, 0x20, 0x2b,
0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x22, 0x2c,
0x20, 0x27, 0x22, 0x20, 0x2b, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x6e, 0x61,
0x6d, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x2e, 0x62, 0x69, 0x6e, 0x27, 0x29, 0x5c, 0x22, 0x3e, 0x22,
0x20, 0x2b, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20,
0x2b, 0x20, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x70,
0x3e, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65,
0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48,
0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64,
0x79, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x3f, 0x20, 0x22, 0x4e, 0x6f, 0x20, 0x69, 0x74,
0x65, 0x6d, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x20, 0x3a, 0x20, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x7d, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d,
0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74,
0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79,
0x49, 0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22, 0x46, 0x61, 0x69,
0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64,
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x28, 0x69, 0x64, 0x2c, 0x20,
0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77,
0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x62, 0x61, 0x6e, 0x6b, 0x3f, 0x22, 0x20, 0x2b,
0x20, 0x69, 0x64, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72,
0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63,
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c,
0x20, 0x3d, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f,
0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e,
0x74, 0x68, 0x65, 0x6e, 0x28, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x3d, 0x3e,
0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x28, 0x29,
0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x62, 0x6c, 0x6f, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x75, 0x72,
0x6c, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x55, 0x52, 0x4c, 0x2e, 0x63,
0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x52, 0x4c, 0x28, 0x62,
0x6c, 0x6f, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76,
0x61, 0x72, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x61,
0x27, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2e, 0x68,
0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x75, 0x72, 0x6c, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x61, 0x2e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d,
0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70,
0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x61, 0x29, 0x3b, 0x20, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28,
0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2e, 0x72, 0x65,
0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29,
0x3b, 0x0d, 0x0a, 0x7d
};

View file

@ -0,0 +1,58 @@
#pragma once
const uint8_t downloads_html[] = {
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c,
0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x65, 0x6e, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2d, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x72, 0x6b, 0x3e, 0x3c, 0x68, 0x65,
0x61, 0x64, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x20, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e,
0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x66, 0x69, 0x74, 0x3d, 0x6e, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53,
0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65,
0x6c, 0x3d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x69, 0x6d, 0x61, 0x67,
0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e,
0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x70, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x73, 0x73, 0x20,
0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x2f,
0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x6d,
0x61, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x50, 0x72,
0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20,
0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66,
0x3d, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x44,
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x42, 0x49, 0x4f, 0x53, 0x3c, 0x2f, 0x61, 0x3e,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72,
0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28,
0x30, 0x29, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x64, 0x6f, 0x77, 0x6e, 0x6c,
0x6f, 0x61, 0x64, 0x45, 0x65, 0x70, 0x72, 0x6f, 0x6d, 0x28, 0x29, 0x3e, 0x44, 0x6f, 0x77, 0x6e,
0x6c, 0x6f, 0x61, 0x64, 0x20, 0x45, 0x45, 0x50, 0x52, 0x4f, 0x4d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f,
0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x6a,
0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30,
0x29, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f,
0x61, 0x64, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x28, 0x29, 0x3e, 0x44,
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65,
0x4f, 0x53, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20,
0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69,
0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79,
0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c,
0x3e, 0x42, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c,
0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x3e, 0x43, 0x6f, 0x70,
0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x32, 0x34, 0x20, 0x2d, 0x20, 0x54, 0x65,
0x61, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x54, 0x65, 0x61,
0x6d, 0x20, 0x52, 0x65, 0x73, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e, 0x3c,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x6d, 0x61,
0x69, 0x6e, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x64,
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x2e, 0x6a, 0x73, 0x3e, 0x3c, 0x2f, 0x73, 0x63,
0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74,
0x6d, 0x6c, 0x3e
};

View file

@ -0,0 +1,42 @@
#pragma once
const uint8_t downloads_js[] = {
0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64,
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x65, 0x70, 0x72, 0x6f, 0x6d, 0x28, 0x29, 0x7b,
0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x65, 0x70, 0x72, 0x6f, 0x6d,
0x22, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d,
0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
0x63, 0x74, 0x2e, 0x22, 0x7d, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x6e, 0x3d, 0x3e, 0x6e,
0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x28, 0x29, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x6e, 0x3d,
0x3e, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x55,
0x52, 0x4c, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55,
0x52, 0x4c, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22,
0x61, 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x69, 0x3b, 0x74, 0x2e, 0x64,
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x45, 0x45, 0x50, 0x52, 0x4f, 0x4d, 0x2e,
0x62, 0x69, 0x6e, 0x22, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f,
0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74,
0x29, 0x3b, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, 0x3b, 0x74, 0x2e, 0x72, 0x65,
0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x7d, 0x29, 0x7d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64,
0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x28, 0x29, 0x7b, 0x61, 0x77, 0x61,
0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64,
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x70, 0x72, 0x6f, 0x6d, 0x22, 0x29, 0x2e, 0x63, 0x61,
0x74, 0x63, 0x68, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x22, 0x46, 0x61, 0x69, 0x6c,
0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x7d,
0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x6e, 0x3d, 0x3e, 0x6e, 0x2e, 0x62, 0x6c, 0x6f, 0x62,
0x28, 0x29, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x6e, 0x3d, 0x3e, 0x7b, 0x76, 0x61, 0x72,
0x20, 0x69, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x55, 0x52, 0x4c, 0x2e, 0x63, 0x72,
0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x52, 0x4c, 0x28, 0x6e, 0x29,
0x2c, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61,
0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x61, 0x22, 0x29, 0x3b, 0x74,
0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x69, 0x3b, 0x74, 0x2e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f,
0x61, 0x64, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x2e, 0x62,
0x69, 0x6e, 0x22, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64,
0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, 0x29,
0x3b, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, 0x3b, 0x74, 0x2e, 0x72, 0x65, 0x6d,
0x6f, 0x76, 0x65, 0x28, 0x29, 0x7d, 0x29, 0x7d
};

View file

@ -0,0 +1,272 @@
#pragma once
const uint8_t favicon_ico[] = {
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xa8, 0x10,
0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x67,
0x5a, 0xff, 0x86, 0x7e, 0x72, 0xff, 0x91, 0x85, 0x73, 0xff, 0x95, 0x89, 0x75, 0xff, 0xb2, 0xaa,
0x96, 0xff, 0xbd, 0xb5, 0x9e, 0xff, 0xb8, 0xac, 0x91, 0xff, 0xb5, 0xa7, 0x8a, 0xff, 0x8d, 0x7f,
0x6c, 0xff, 0x68, 0x5b, 0x4d, 0xff, 0x6a, 0x5c, 0x42, 0xff, 0x5c, 0x4e, 0x2c, 0xff, 0x3c, 0x31,
0x22, 0xff, 0x53, 0x48, 0x2c, 0xff, 0x58, 0x50, 0x38, 0xff, 0x6a, 0x5f, 0x47, 0xff, 0x79, 0x6c,
0x47, 0xff, 0x4f, 0x41, 0x29, 0xff, 0x66, 0x57, 0x38, 0xff, 0x7d, 0x6e, 0x52, 0xff, 0x88, 0x77,
0x63, 0xff, 0xa2, 0x95, 0x87, 0xff, 0xc6, 0xc2, 0xb9, 0xff, 0xdc, 0xe0, 0xd9, 0xff, 0xdc, 0xe1,
0xda, 0xff, 0xdc, 0xe1, 0xdb, 0xff, 0xdc, 0xde, 0xd5, 0xff, 0xd4, 0xd0, 0xc0, 0xff, 0xca, 0xc8,
0xc3, 0xff, 0xc8, 0xca, 0xcb, 0xff, 0xc2, 0xc2, 0xbf, 0xff, 0xb9, 0xba, 0xb8, 0xff, 0x5b, 0x55,
0x50, 0xff, 0x92, 0x86, 0x70, 0xff, 0xaa, 0x9e, 0x88, 0xff, 0xb6, 0xb1, 0x9c, 0xff, 0xbc, 0xb6,
0x9c, 0xff, 0xc2, 0xbb, 0xa3, 0xff, 0xbe, 0xb4, 0x9a, 0xff, 0xc6, 0xbf, 0xa6, 0xff, 0xb1, 0xa6,
0x8f, 0xff, 0x8a, 0x7b, 0x64, 0xff, 0x7c, 0x6d, 0x50, 0xff, 0x70, 0x62, 0x45, 0xff, 0x49, 0x3d,
0x2a, 0xff, 0x57, 0x4d, 0x3c, 0xff, 0x5a, 0x50, 0x37, 0xff, 0x41, 0x38, 0x2b, 0xff, 0x65, 0x57,
0x3f, 0xff, 0x6d, 0x5f, 0x45, 0xff, 0x77, 0x69, 0x4d, 0xff, 0x82, 0x72, 0x5e, 0xff, 0xbb, 0xb2,
0x9b, 0xff, 0xbe, 0xb7, 0xae, 0xff, 0xd7, 0xda, 0xd4, 0xff, 0xdc, 0xe3, 0xde, 0xff, 0xdc, 0xe2,
0xdd, 0xff, 0xdc, 0xde, 0xd6, 0xff, 0xda, 0xda, 0xcf, 0xff, 0xd8, 0xd7, 0xcf, 0xff, 0xd4, 0xd4,
0xd0, 0xff, 0xcf, 0xd2, 0xd5, 0xff, 0xaf, 0xb8, 0xc0, 0xff, 0x83, 0x8c, 0x98, 0xff, 0x4a, 0x48,
0x4b, 0xff, 0x5a, 0x56, 0x59, 0xff, 0x9f, 0x97, 0x85, 0xff, 0xbf, 0xb7, 0x9e, 0xff, 0xc1, 0xba,
0xa0, 0xff, 0xc3, 0xbc, 0xa2, 0xff, 0xca, 0xc5, 0xb0, 0xff, 0xd2, 0xd0, 0xbd, 0xff, 0xcb, 0xc7,
0xb6, 0xff, 0xa4, 0x96, 0x7c, 0xff, 0x74, 0x65, 0x50, 0xff, 0x66, 0x57, 0x3d, 0xff, 0x6a, 0x5e,
0x42, 0xff, 0x7c, 0x70, 0x4f, 0xff, 0x53, 0x48, 0x2a, 0xff, 0x43, 0x38, 0x2c, 0xff, 0x79, 0x6c,
0x44, 0xff, 0x75, 0x68, 0x4b, 0xff, 0x75, 0x65, 0x49, 0xff, 0x9b, 0x8c, 0x6c, 0xff, 0xa0, 0x93,
0x81, 0xff, 0xd4, 0xd3, 0xca, 0xff, 0xdc, 0xe1, 0xdb, 0xff, 0xdc, 0xe2, 0xde, 0xff, 0xdc, 0xe1,
0xdd, 0xff, 0xdc, 0xdf, 0xda, 0xff, 0xdb, 0xdd, 0xd8, 0xff, 0xda, 0xdd, 0xdb, 0xff, 0xd5, 0xd6,
0xd2, 0xff, 0xb6, 0xb5, 0xb3, 0xff, 0x89, 0x86, 0x87, 0xff, 0x69, 0x5d, 0x58, 0xff, 0x61, 0x5d,
0x5e, 0xff, 0x68, 0x70, 0x7e, 0xff, 0x65, 0x6e, 0x7f, 0xff, 0xa4, 0xa3, 0x98, 0xff, 0xbf, 0xb7,
0x98, 0xff, 0xc6, 0xbe, 0xa5, 0xff, 0xca, 0xc5, 0xaf, 0xff, 0xd5, 0xd5, 0xc6, 0xff, 0xd9, 0xdb,
0xd0, 0xff, 0xab, 0x9d, 0x86, 0xff, 0x78, 0x68, 0x58, 0xff, 0x75, 0x66, 0x52, 0xff, 0x86, 0x79,
0x53, 0xff, 0x45, 0x3a, 0x2a, 0xff, 0x3a, 0x30, 0x23, 0xff, 0x45, 0x3b, 0x2d, 0xff, 0x5f, 0x53,
0x3a, 0xff, 0x74, 0x66, 0x4b, 0xff, 0xb5, 0xab, 0x92, 0xff, 0x8e, 0x7e, 0x6c, 0xff, 0xae, 0xa1,
0x91, 0xff, 0xcf, 0xcd, 0xc6, 0xff, 0xdc, 0xe1, 0xdb, 0xff, 0xdc, 0xe1, 0xda, 0xff, 0xdc, 0xe0,
0xda, 0xff, 0xdc, 0xe0, 0xdb, 0xff, 0xdc, 0xde, 0xd7, 0xff, 0xd7, 0xd5, 0xcc, 0xff, 0xaf, 0xa0,
0x90, 0xff, 0x9a, 0x94, 0x91, 0xff, 0x7a, 0x6a, 0x60, 0xff, 0x6c, 0x5e, 0x55, 0xff, 0x80, 0x7f,
0x7f, 0xff, 0x78, 0x81, 0x8e, 0xff, 0x77, 0x81, 0x90, 0xff, 0x72, 0x76, 0x7f, 0xff, 0xc1, 0xbc,
0xac, 0xff, 0xc7, 0xc1, 0xaa, 0xff, 0xca, 0xc3, 0xac, 0xff, 0xd2, 0xd0, 0xbf, 0xff, 0xd4, 0xd3,
0xc2, 0xff, 0xbc, 0xb4, 0xa2, 0xff, 0x87, 0x78, 0x69, 0xff, 0x7c, 0x72, 0x63, 0xff, 0x5c, 0x56,
0x4b, 0xff, 0x4f, 0x47, 0x3a, 0xff, 0x49, 0x3f, 0x31, 0xff, 0x47, 0x3e, 0x31, 0xff, 0x61, 0x57,
0x4b, 0xff, 0x6b, 0x62, 0x56, 0xff, 0x82, 0x77, 0x69, 0xff, 0xa0, 0x96, 0x89, 0xff, 0xba, 0xb0,
0xa2, 0xff, 0xd2, 0xd0, 0xc6, 0xff, 0xdc, 0xe3, 0xdd, 0xff, 0xdc, 0xe2, 0xdd, 0xff, 0xdc, 0xe3,
0xdd, 0xff, 0xdc, 0xe3, 0xdf, 0xff, 0xdc, 0xe1, 0xdc, 0xff, 0xb8, 0xa9, 0x99, 0xff, 0x9a, 0x88,
0x79, 0xff, 0x96, 0x89, 0x7f, 0xff, 0x7c, 0x6d, 0x61, 0xff, 0x8a, 0x82, 0x79, 0xff, 0x9e, 0x9b,
0x94, 0xff, 0x6d, 0x6a, 0x68, 0xff, 0x7b, 0x83, 0x8f, 0xff, 0x71, 0x7d, 0x8e, 0xff, 0xb2, 0xac,
0x9d, 0xff, 0xc9, 0xc4, 0xae, 0xff, 0xcd, 0xc8, 0xb4, 0xff, 0xd2, 0xd0, 0xbf, 0xff, 0xd4, 0xd3,
0xc2, 0xff, 0xbb, 0xb4, 0xa1, 0xff, 0x80, 0x73, 0x65, 0xff, 0x5f, 0x57, 0x4d, 0xff, 0x6c, 0x69,
0x64, 0xff, 0x4c, 0x43, 0x36, 0xff, 0x5e, 0x55, 0x48, 0xff, 0x53, 0x4b, 0x3f, 0xff, 0x7f, 0x7d,
0x78, 0xff, 0x6d, 0x6b, 0x68, 0xff, 0x8b, 0x8a, 0x87, 0xff, 0x9a, 0x92, 0x89, 0xff, 0xb3, 0xa8,
0x9b, 0xff, 0xd3, 0xd4, 0xcb, 0xff, 0xdc, 0xe3, 0xdd, 0xff, 0xdc, 0xe2, 0xdc, 0xff, 0xdc, 0xe3,
0xdd, 0xff, 0xdc, 0xe4, 0xe0, 0xff, 0xd3, 0xd4, 0xcb, 0xff, 0xa4, 0x94, 0x85, 0xff, 0xa3, 0x9a,
0x91, 0xff, 0x88, 0x7a, 0x6b, 0xff, 0x84, 0x79, 0x6d, 0xff, 0xba, 0xb8, 0xb2, 0xff, 0x94, 0x8e,
0x85, 0xff, 0x73, 0x6e, 0x6a, 0xff, 0x63, 0x69, 0x76, 0xff, 0x72, 0x87, 0xa1, 0xff, 0x9d, 0xa8,
0xb2, 0xff, 0xca, 0xc7, 0xb7, 0xff, 0xd2, 0xd0, 0xbf, 0xff, 0xd6, 0xd5, 0xc8, 0xff, 0xda, 0xdc,
0xd1, 0xff, 0xbe, 0xbc, 0xb4, 0xff, 0x5c, 0x50, 0x43, 0xff, 0x5a, 0x57, 0x53, 0xff, 0x56, 0x51,
0x49, 0xff, 0x52, 0x48, 0x3a, 0xff, 0x79, 0x72, 0x67, 0xff, 0x74, 0x73, 0x71, 0xff, 0x83, 0x7d,
0x73, 0xff, 0x78, 0x71, 0x65, 0xff, 0x8e, 0x8e, 0x8c, 0xff, 0x8e, 0x89, 0x82, 0xff, 0x9e, 0x92,
0x85, 0xff, 0xcc, 0xcd, 0xc9, 0xff, 0xdc, 0xe4, 0xde, 0xff, 0xdc, 0xe3, 0xde, 0xff, 0xdc, 0xe3,
0xde, 0xff, 0xdc, 0xe3, 0xde, 0xff, 0xc3, 0xbb, 0xb0, 0xff, 0x91, 0x80, 0x6f, 0xff, 0x87, 0x77,
0x67, 0xff, 0x6f, 0x5f, 0x4f, 0xff, 0xaa, 0xa4, 0x9b, 0xff, 0xa9, 0xa4, 0x98, 0xff, 0x6b, 0x62,
0x55, 0xff, 0x80, 0x7d, 0x76, 0xff, 0x5e, 0x69, 0x7c, 0xff, 0x57, 0x5e, 0x6e, 0xff, 0x63, 0x6a,
0x76, 0xff, 0x9c, 0x96, 0x8d, 0xff, 0xd4, 0xd3, 0xc6, 0xff, 0xda, 0xdc, 0xd3, 0xff, 0xdc, 0xdf,
0xd8, 0xff, 0x8b, 0x87, 0x7f, 0xff, 0x4d, 0x48, 0x42, 0xff, 0x4a, 0x42, 0x3a, 0xff, 0x4b, 0x48,
0x43, 0xff, 0x51, 0x49, 0x3e, 0xff, 0x77, 0x70, 0x65, 0xff, 0x7e, 0x78, 0x6f, 0xff, 0x86, 0x80,
0x76, 0xff, 0x6b, 0x62, 0x56, 0xff, 0x70, 0x6f, 0x6e, 0xff, 0x7b, 0x71, 0x67, 0xff, 0x92, 0x8e,
0x88, 0xff, 0xbe, 0xbb, 0xb5, 0xff, 0xdc, 0xe3, 0xe1, 0xff, 0xdc, 0xe4, 0xe1, 0xff, 0xdc, 0xe3,
0xdf, 0xff, 0xda, 0xdf, 0xdb, 0xff, 0xa5, 0x9a, 0x8f, 0xff, 0x7d, 0x6f, 0x63, 0xff, 0x6e, 0x5e,
0x4e, 0xff, 0x8f, 0x84, 0x77, 0xff, 0xad, 0xa7, 0x9a, 0xff, 0x9c, 0x8d, 0x71, 0xff, 0x7e, 0x6f,
0x54, 0xff, 0x83, 0x77, 0x60, 0xff, 0x5a, 0x55, 0x52, 0xff, 0x57, 0x5f, 0x6c, 0xff, 0x5a, 0x68,
0x7c, 0xff, 0x55, 0x59, 0x66, 0xff, 0x99, 0x97, 0x92, 0xff, 0xda, 0xde, 0xd8, 0xff, 0xdc, 0xe2,
0xdd, 0xff, 0x69, 0x65, 0x60, 0xff, 0x48, 0x43, 0x3e, 0xff, 0x41, 0x39, 0x2f, 0xff, 0x47, 0x48,
0x47, 0xff, 0x54, 0x51, 0x4e, 0xff, 0x80, 0x7c, 0x77, 0xff, 0x89, 0x86, 0x81, 0xff, 0x9c, 0x9e,
0x9c, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x57, 0x4e, 0x43, 0xff, 0x67, 0x5f, 0x56, 0xff, 0x88, 0x80,
0x78, 0xff, 0xa8, 0x9f, 0x95, 0xff, 0xd8, 0xde, 0xdd, 0xff, 0xdc, 0xe4, 0xe2, 0xff, 0xd4, 0xd6,
0xcd, 0xff, 0xb2, 0xa7, 0x97, 0xff, 0x80, 0x6f, 0x5e, 0xff, 0x66, 0x56, 0x46, 0xff, 0x60, 0x51,
0x40, 0xff, 0xac, 0xa3, 0x93, 0xff, 0xa7, 0x97, 0x78, 0xff, 0x95, 0x85, 0x68, 0xff, 0x8c, 0x7b,
0x5d, 0xff, 0x94, 0x85, 0x68, 0xff, 0x60, 0x53, 0x40, 0xff, 0x54, 0x48, 0x3b, 0xff, 0x53, 0x4e,
0x4d, 0xff, 0x4a, 0x4b, 0x51, 0xff, 0x58, 0x5f, 0x6c, 0xff, 0xc1, 0xc3, 0xbc, 0xff, 0xb2, 0xb5,
0xb3, 0xff, 0x50, 0x4e, 0x4e, 0xff, 0x3d, 0x34, 0x2b, 0xff, 0x3a, 0x32, 0x28, 0xff, 0x38, 0x30,
0x26, 0xff, 0x39, 0x34, 0x2b, 0xff, 0x5c, 0x65, 0x6e, 0xff, 0x59, 0x55, 0x4f, 0xff, 0x52, 0x52,
0x52, 0xff, 0x45, 0x3c, 0x32, 0xff, 0x4a, 0x43, 0x3b, 0xff, 0x5f, 0x53, 0x45, 0xff, 0x65, 0x59,
0x4b, 0xff, 0x8b, 0x7d, 0x6f, 0xff, 0xb9, 0xb5, 0xad, 0xff, 0xd5, 0xd8, 0xcf, 0xff, 0xa2, 0x94,
0x84, 0xff, 0x7d, 0x6c, 0x5c, 0xff, 0x75, 0x64, 0x53, 0xff, 0x6a, 0x5b, 0x4b, 0xff, 0x75, 0x66,
0x55, 0xff, 0xb7, 0xac, 0x8e, 0xff, 0xb1, 0xa3, 0x83, 0xff, 0xa3, 0x94, 0x75, 0xff, 0x85, 0x74,
0x56, 0xff, 0x8e, 0x7d, 0x5e, 0xff, 0x8b, 0x85, 0x76, 0xff, 0x87, 0x85, 0x80, 0xff, 0x63, 0x5b,
0x51, 0xff, 0x44, 0x3d, 0x37, 0xff, 0x40, 0x3a, 0x37, 0xff, 0x74, 0x71, 0x6b, 0xff, 0x70, 0x70,
0x6f, 0xff, 0x38, 0x36, 0x35, 0xff, 0x3e, 0x3d, 0x3b, 0xff, 0x3d, 0x37, 0x2f, 0xff, 0x3f, 0x35,
0x29, 0xff, 0x4a, 0x43, 0x39, 0xff, 0x50, 0x55, 0x5b, 0xff, 0x66, 0x68, 0x6b, 0xff, 0x50, 0x4f,
0x4d, 0xff, 0x50, 0x47, 0x3b, 0xff, 0x4b, 0x41, 0x36, 0xff, 0x62, 0x5d, 0x54, 0xff, 0x7c, 0x73,
0x68, 0xff, 0x81, 0x7a, 0x71, 0xff, 0x8c, 0x81, 0x75, 0xff, 0xa6, 0x9d, 0x8f, 0xff, 0x74, 0x67,
0x5b, 0xff, 0x6a, 0x5a, 0x49, 0xff, 0x77, 0x69, 0x57, 0xff, 0xb8, 0xb6, 0xae, 0xff, 0xb6, 0xb1,
0xa3, 0xff, 0xc3, 0xba, 0x9c, 0xff, 0xbb, 0xb0, 0x91, 0xff, 0xb6, 0xa9, 0x8a, 0xff, 0x8d, 0x7c,
0x5d, 0xff, 0x8a, 0x79, 0x5a, 0xff, 0x93, 0x84, 0x64, 0xff, 0x5e, 0x54, 0x42, 0xff, 0x53, 0x49,
0x3a, 0xff, 0x52, 0x4b, 0x41, 0xff, 0x39, 0x34, 0x30, 0xff, 0x2e, 0x2a, 0x24, 0xff, 0x26, 0x24,
0x20, 0xff, 0x35, 0x34, 0x35, 0xff, 0x2f, 0x2c, 0x27, 0xff, 0x37, 0x38, 0x38, 0xff, 0x58, 0x55,
0x4e, 0xff, 0x69, 0x64, 0x5c, 0xff, 0x74, 0x77, 0x79, 0xff, 0x66, 0x68, 0x6a, 0xff, 0x71, 0x71,
0x71, 0xff, 0x8d, 0x89, 0x81, 0xff, 0x81, 0x7a, 0x71, 0xff, 0x67, 0x62, 0x5b, 0xff, 0x5e, 0x54,
0x48, 0xff, 0x6d, 0x61, 0x53, 0xff, 0x6b, 0x62, 0x57, 0xff, 0x5a, 0x4f, 0x43, 0xff, 0x5d, 0x52,
0x47, 0xff, 0x6e, 0x60, 0x4f, 0xff, 0x93, 0x88, 0x7a, 0xff, 0xa0, 0x97, 0x8a, 0xff, 0xc8, 0xc2,
0xac, 0xff, 0xc2, 0xb8, 0x9a, 0xff, 0xbd, 0xb2, 0x92, 0xff, 0xbc, 0xb1, 0x92, 0xff, 0xa2, 0x93,
0x72, 0xff, 0x8e, 0x7d, 0x5d, 0xff, 0x8f, 0x7e, 0x5e, 0xff, 0x7b, 0x6d, 0x53, 0xff, 0x5a, 0x50,
0x41, 0xff, 0x58, 0x50, 0x43, 0xff, 0x45, 0x40, 0x39, 0xff, 0x2d, 0x2f, 0x2f, 0xff, 0x20, 0x1b,
0x16, 0xff, 0x30, 0x2d, 0x28, 0xff, 0x2b, 0x27, 0x1f, 0xff, 0x2a, 0x28, 0x23, 0xff, 0x35, 0x3a,
0x3e, 0xff, 0x4e, 0x4b, 0x46, 0xff, 0x82, 0x84, 0x84, 0xff, 0x65, 0x60, 0x5a, 0xff, 0x78, 0x76,
0x72, 0xff, 0x7a, 0x79, 0x78, 0xff, 0x5a, 0x58, 0x55, 0xff, 0x3a, 0x34, 0x2d, 0xff, 0x3f, 0x3a,
0x33, 0xff, 0x56, 0x4f, 0x48, 0xff, 0x4e, 0x43, 0x36, 0xff, 0x45, 0x3a, 0x2f, 0xff, 0x63, 0x58,
0x4a, 0xff, 0x9a, 0x91, 0x84, 0xff, 0xa4, 0x9c, 0x91, 0xff, 0xb1, 0xa8, 0x95, 0xff, 0xc7, 0xbe,
0xa2, 0xff, 0xc3, 0xb9, 0x9b, 0xff, 0xbd, 0xb3, 0x94, 0xff, 0xbd, 0xb3, 0x93, 0xff, 0xa9, 0x9b,
0x79, 0xff, 0x97, 0x87, 0x66, 0xff, 0x91, 0x80, 0x60, 0xff, 0x8a, 0x7b, 0x5d, 0xff, 0x42, 0x39,
0x2d, 0xff, 0x49, 0x41, 0x34, 0xff, 0x3b, 0x37, 0x31, 0xff, 0x25, 0x23, 0x21, 0xff, 0x23, 0x1e,
0x18, 0xff, 0x2c, 0x26, 0x1d, 0xff, 0x32, 0x2b, 0x23, 0xff, 0x2e, 0x2a, 0x24, 0xff, 0x2a, 0x27,
0x22, 0xff, 0x2a, 0x27, 0x23, 0xff, 0x32, 0x30, 0x2d, 0xff, 0x48, 0x42, 0x39, 0xff, 0x3b, 0x39,
0x37, 0xff, 0x3f, 0x3c, 0x39, 0xff, 0x3a, 0x32, 0x2b, 0xff, 0x3a, 0x32, 0x2a, 0xff, 0x3d, 0x33,
0x2a, 0xff, 0x46, 0x3a, 0x2c, 0xff, 0x4b, 0x3f, 0x2f, 0xff, 0x40, 0x37, 0x2d, 0xff, 0x73, 0x6c,
0x62, 0xff, 0x99, 0x92, 0x87, 0xff, 0x97, 0x8f, 0x84, 0xff, 0xbd, 0xb8, 0xa6, 0xff, 0xcd, 0xc7,
0xb0, 0xff, 0xc5, 0xbc, 0xa0, 0xff, 0xc4, 0xbb, 0x9f, 0xff, 0xc1, 0xb8, 0x9b, 0xff, 0xba, 0xaf,
0x8f, 0xff, 0xaa, 0x9d, 0x7b, 0xff, 0x97, 0x87, 0x66, 0xff, 0x92, 0x83, 0x62, 0xff, 0x39, 0x30,
0x23, 0xff, 0x38, 0x30, 0x26, 0xff, 0x2f, 0x29, 0x21, 0xff, 0x25, 0x22, 0x1c, 0xff, 0x27, 0x22,
0x1a, 0xff, 0x32, 0x2a, 0x20, 0xff, 0x40, 0x37, 0x2c, 0xff, 0x45, 0x3c, 0x32, 0xff, 0x49, 0x44,
0x3b, 0xff, 0x45, 0x40, 0x3a, 0xff, 0x4d, 0x45, 0x3a, 0xff, 0x4f, 0x48, 0x3e, 0xff, 0x47, 0x3e,
0x33, 0xff, 0x4d, 0x45, 0x3b, 0xff, 0x51, 0x48, 0x3c, 0xff, 0x4f, 0x45, 0x38, 0xff, 0x52, 0x47,
0x39, 0xff, 0x59, 0x4c, 0x3c, 0xff, 0x58, 0x4a, 0x38, 0xff, 0x44, 0x37, 0x2a, 0xff, 0x4e, 0x42,
0x34, 0xff, 0x80, 0x76, 0x68, 0xff, 0x7a, 0x6e, 0x5d, 0xff, 0xbd, 0xb9, 0xaa, 0xff, 0xd4, 0xd3,
0xc1, 0xff, 0xcd, 0xc7, 0xb0, 0xff, 0xca, 0xc2, 0xa7, 0xff, 0xc6, 0xbd, 0xa2, 0xff, 0xc1, 0xb9,
0x9c, 0xff, 0xb9, 0xae, 0x8d, 0xff, 0xab, 0x9e, 0x7c, 0xff, 0xb2, 0xa5, 0x83, 0xff, 0x69, 0x5f,
0x49, 0xff, 0x40, 0x36, 0x28, 0xff, 0x37, 0x2f, 0x23, 0xff, 0x2f, 0x29, 0x21, 0xff, 0x38, 0x2f,
0x22, 0xff, 0x4f, 0x46, 0x39, 0xff, 0x65, 0x5e, 0x54, 0xff, 0x7a, 0x7a, 0x76, 0xff, 0x82, 0x80,
0x7a, 0xff, 0x95, 0x93, 0x8d, 0xff, 0xad, 0xac, 0xa8, 0xff, 0x8e, 0x88, 0x7e, 0xff, 0x8b, 0x84,
0x7a, 0xff, 0x7a, 0x74, 0x6d, 0xff, 0x89, 0x81, 0x76, 0xff, 0x9e, 0x98, 0x8c, 0xff, 0x96, 0x8e,
0x81, 0xff, 0x87, 0x7b, 0x69, 0xff, 0x72, 0x63, 0x50, 0xff, 0x5f, 0x51, 0x3f, 0xff, 0x7e, 0x72,
0x62, 0xff, 0x71, 0x63, 0x51, 0xff, 0x8a, 0x7e, 0x6b, 0xff, 0xce, 0xc9, 0xb4, 0xff, 0xcc, 0xc5,
0xac, 0xff, 0xc9, 0xc1, 0xa6, 0xff, 0xc5, 0xbc, 0xa0, 0xff, 0xc3, 0xba, 0x9d, 0xff, 0xbd, 0xb3,
0x93, 0xff, 0xb9, 0xae, 0x8c, 0xff, 0xbe, 0xb5, 0x95, 0xff, 0xba, 0xaf, 0x8e, 0xff, 0x9a, 0x8f,
0x72, 0xff, 0x53, 0x48, 0x35, 0xff, 0x4d, 0x41, 0x31, 0xff, 0x56, 0x4c, 0x3b, 0xff, 0x5b, 0x52,
0x40, 0xff, 0x82, 0x7b, 0x6f, 0xff, 0x92, 0x8b, 0x81, 0xff, 0xad, 0xa9, 0xa1, 0xff, 0xca, 0xcb,
0xc7, 0xff, 0xc1, 0xc0, 0xba, 0xff, 0xaa, 0xa8, 0x9f, 0xff, 0xb4, 0xb1, 0xa8, 0xff, 0x96, 0x90,
0x86, 0xff, 0xac, 0xa8, 0xa0, 0xff, 0xd0, 0xd0, 0xc9, 0xff, 0xdb, 0xdc, 0xd5, 0xff, 0xd0, 0xcf,
0xc7, 0xff, 0xb4, 0xaf, 0xa3, 0xff, 0x96, 0x8a, 0x78, 0xff, 0x84, 0x76, 0x62, 0xff, 0x7d, 0x6f,
0x5c, 0xff, 0x8e, 0x81, 0x6f, 0xff, 0xa9, 0x9e, 0x88, 0xff, 0xc8, 0xbf, 0xa4, 0xff, 0xc6, 0xbd,
0xa2, 0xff, 0xc4, 0xbb, 0x9e, 0xff, 0xbf, 0xb6, 0x97, 0xff, 0xbd, 0xb4, 0x95, 0xff, 0xb5, 0xa8,
0x86, 0xff, 0xb4, 0xa7, 0x85, 0xff, 0xad, 0x9f, 0x7c, 0xff, 0xa4, 0x95, 0x72, 0xff, 0xa6, 0x98,
0x75, 0xff, 0x83, 0x78, 0x60, 0xff, 0x71, 0x6a, 0x5f, 0xff, 0x77, 0x6d, 0x5e, 0xff, 0x8a, 0x83,
0x75, 0xff, 0xa7, 0xa4, 0x9a, 0xff, 0x93, 0x93, 0x8f, 0xff, 0x96, 0x91, 0x84, 0xff, 0xb4, 0xb1,
0xa7, 0xff, 0xbd, 0xbc, 0xb4, 0xff, 0xb2, 0xaf, 0xa6, 0xff, 0xb6, 0xb4, 0xab, 0xff, 0x97, 0x91,
0x87, 0xff, 0x9f, 0x99, 0x8e, 0xff, 0xb3, 0xae, 0xa3, 0xff, 0xbd, 0xb8, 0xad, 0xff, 0xbd, 0xb8,
0xac, 0xff, 0xc9, 0xc5, 0xb9, 0xff, 0xbf, 0xb9, 0xaa, 0xff, 0xa3, 0x98, 0x87, 0xff, 0xa7, 0x9f,
0x90, 0xff, 0xb1, 0xaa, 0x9c, 0xff, 0xcc, 0xc6, 0xb0, 0xff, 0xcf, 0xc9, 0xb3, 0xff, 0xcc, 0xc7,
0xaf, 0xff, 0xc9, 0xc2, 0xa8, 0xff, 0xc5, 0xbc, 0xa0, 0xff, 0xbe, 0xb4, 0x95, 0xff, 0xb7, 0xab,
0x8a, 0xff, 0xb8, 0xad, 0x8c, 0xff, 0xa3, 0x93, 0x70, 0xff, 0x9c, 0x8c, 0x6b, 0xff, 0xa1, 0x91,
0x6e, 0xff, 0xab, 0x9d, 0x7b, 0xff, 0xb7, 0xb4, 0xa2, 0xff, 0xbc, 0xbd, 0xb5, 0xff, 0xb4, 0xb1,
0xa6, 0xff, 0xc5, 0xc2, 0xb4, 0xff, 0xb4, 0xad, 0x9c, 0xff, 0x97, 0x8f, 0x80, 0xff, 0x93, 0x89,
0x7a, 0xff, 0xa6, 0xa0, 0x94, 0xff, 0xae, 0xaa, 0xa2, 0xff, 0xb1, 0xb2, 0xad, 0xff, 0xa5, 0xa0,
0x96, 0xff, 0xb6, 0xb1, 0xa7, 0xff, 0xb2, 0xaa, 0x9c, 0xff, 0xc0, 0xbb, 0xad, 0xff, 0xc6, 0xc1,
0xb4, 0xff, 0xd5, 0xd3, 0xc7, 0xff, 0xc1, 0xbc, 0xaf, 0xff, 0xc1, 0xbe, 0xb4, 0xff, 0xcd, 0xcd,
0xc3, 0xff, 0xd6, 0xd7, 0xc9, 0xff, 0xd0, 0xcc, 0xb9, 0xff, 0xce, 0xcb, 0xb6, 0xff, 0xc7, 0xbf,
0xa5, 0xff, 0xc9, 0xc2, 0xa9, 0xff, 0xcc, 0xc7, 0xaf, 0xff, 0xbc, 0xb1, 0x92, 0xff, 0xb8, 0xad,
0x8b, 0xff, 0xb8, 0xad, 0x8c, 0xff, 0xa9, 0x9a, 0x76, 0xff, 0xa2, 0x92, 0x6e, 0xff, 0xa3, 0x92,
0x70, 0xff, 0xb3, 0xa6, 0x84, 0xff, 0xc8, 0xc2, 0xa7, 0xff, 0xd7, 0xd9, 0xca, 0xff, 0xd6, 0xd5,
0xc3, 0xff, 0xd2, 0xcf, 0xba, 0xff, 0xd1, 0xcd, 0xb8, 0xff, 0xd4, 0xd5, 0xc9, 0xff, 0xa2, 0x9b,
0x8b, 0xff, 0x7b, 0x6d, 0x59, 0xff, 0x88, 0x82, 0x7a, 0xff, 0x6a, 0x64, 0x5b, 0xff, 0x9e, 0x9b,
0x93, 0xff, 0xb0, 0xa9, 0x9c, 0xff, 0xbc, 0xb6, 0xaa, 0xff, 0xda, 0xdc, 0xd4, 0xff, 0xdc, 0xe0,
0xd7, 0xff, 0xdb, 0xdb, 0xcf, 0xff, 0xd5, 0xd3, 0xc2, 0xff, 0xd4, 0xd1, 0xc0, 0xff, 0xd2, 0xce,
0xb9, 0xff, 0xd3, 0xd0, 0xbd, 0xff, 0xb6, 0xa9, 0x8b, 0xff, 0xac, 0x9e, 0x7f, 0xff, 0xad, 0x9f,
0x7f, 0xff, 0xa8, 0x9a, 0x7b, 0xff, 0xaa, 0x9b, 0x7c, 0xff, 0xa7, 0x99, 0x79, 0xff, 0xb7, 0xac,
0x8b, 0xff, 0xbb, 0xb1, 0x90, 0xff, 0xa6, 0x97, 0x74, 0xff, 0xa1, 0x91, 0x6e, 0xff, 0xa7, 0x97,
0x74, 0xff, 0xaf, 0xa0, 0x7d, 0xff, 0xbe, 0xb5, 0x96, 0xff, 0xd1, 0xce, 0xb9, 0xff, 0xd9, 0xda,
0xcd, 0xff, 0xd5, 0xd3, 0xc0, 0xff, 0xd5, 0xd5, 0xc4, 0xff, 0xd2, 0xd1, 0xc4, 0xff, 0xc6, 0xc0,
0xaf, 0xff, 0x7c, 0x75, 0x69, 0xff, 0x5d, 0x5a, 0x55, 0xff, 0x56, 0x4f, 0x45, 0xff, 0x72, 0x6f,
0x6c, 0xff, 0xa0, 0x9f, 0x9a, 0xff, 0xa4, 0x98, 0x87, 0xff, 0xc2, 0xbc, 0xab, 0xff, 0xda, 0xdf,
0xd7, 0xff, 0xdc, 0xdf, 0xd7, 0xff, 0xda, 0xda, 0xce, 0xff, 0xd1, 0xcb, 0xb6, 0xff, 0xd1, 0xcd,
0xb8, 0xff, 0xc8, 0xc0, 0xa5, 0xff, 0xb7, 0xaa, 0x8b, 0xff, 0xa2, 0x93, 0x76, 0xff, 0x98, 0x88,
0x6b, 0xff, 0x8f, 0x7f, 0x63, 0xff, 0x8c, 0x7c, 0x5e, 0xff, 0x8c, 0x7d, 0x61, 0xff, 0xb8, 0xad,
0x8c, 0xff, 0xb1, 0xa5, 0x84, 0xff, 0x95, 0x83, 0x62, 0xff, 0x90, 0x7f, 0x5d, 0xff, 0x9d, 0x8c,
0x6a, 0xff, 0x9f, 0x8e, 0x6b, 0xff, 0xa2, 0x92, 0x6f, 0xff, 0xbd, 0xb3, 0x93, 0xff, 0xd0, 0xce,
0xb8, 0xff, 0xd7, 0xd7, 0xc7, 0xff, 0xd8, 0xd9, 0xcb, 0xff, 0xcc, 0xca, 0xba, 0xff, 0x89, 0x7c,
0x67, 0xff, 0x5b, 0x51, 0x43, 0xff, 0x4e, 0x44, 0x3a, 0xff, 0x46, 0x38, 0x2b, 0xff, 0x54, 0x4b,
0x40, 0xff, 0x94, 0x8e, 0x84, 0xff, 0x8a, 0x7c, 0x69, 0xff, 0xac, 0xa1, 0x8d, 0xff, 0xd7, 0xda,
0xd0, 0xff, 0xdc, 0xe2, 0xdb, 0xff, 0xdb, 0xdf, 0xd5, 0xff, 0xd0, 0xcb, 0xb6, 0xff, 0xd0, 0xca,
0xb5, 0xff, 0xc4, 0xbb, 0x9f, 0xff, 0xb2, 0xa4, 0x84, 0xff, 0x9f, 0x8f, 0x71, 0xff, 0x94, 0x84,
0x68, 0xff, 0x90, 0x80, 0x64, 0xff, 0x86, 0x76, 0x5b, 0xff, 0x7b, 0x6b, 0x52, 0xff, 0xa7, 0x98,
0x75, 0xff, 0x9c, 0x8c, 0x69, 0xff, 0x8c, 0x79, 0x59, 0xff, 0x85, 0x74, 0x54, 0xff, 0x92, 0x80,
0x5f, 0xff, 0x8e, 0x7c, 0x5a, 0xff, 0x93, 0x81, 0x60, 0xff, 0xaf, 0xa1, 0x7f, 0xff, 0xc1, 0xb8,
0x99, 0xff, 0xd5, 0xd4, 0xc3, 0xff, 0xdb, 0xdd, 0xd4, 0xff, 0xbf, 0xba, 0xaa, 0xff, 0x68, 0x59,
0x43, 0xff, 0x52, 0x4b, 0x40, 0xff, 0x3f, 0x37, 0x2d, 0xff, 0x3d, 0x32, 0x27, 0xff, 0x42, 0x36,
0x2a, 0xff, 0x6d, 0x66, 0x5d, 0xff, 0x78, 0x69, 0x58, 0xff, 0xa1, 0x93, 0x7f, 0xff, 0xd2, 0xd1,
0xc3, 0xff, 0xdc, 0xe3, 0xde, 0xff, 0xdb, 0xdd, 0xd1, 0xff, 0xd2, 0xce, 0xb9, 0xff, 0xcd, 0xc6,
0xae, 0xff, 0xbc, 0xb0, 0x91, 0xff, 0xb2, 0xa3, 0x83, 0xff, 0xa7, 0x97, 0x77, 0xff, 0x96, 0x86,
0x69, 0xff, 0x8b, 0x7a, 0x5f, 0xff, 0x7b, 0x6b, 0x52, 0xff, 0x73, 0x65, 0x4d, 0xff, 0x96, 0x84,
0x63, 0xff, 0x91, 0x80, 0x5e, 0xff, 0x87, 0x75, 0x56, 0xff, 0x85, 0x73, 0x54, 0xff, 0x82, 0x71,
0x52, 0xff, 0x84, 0x73, 0x54, 0xff, 0x8e, 0x7c, 0x5c, 0xff, 0x9f, 0x8f, 0x6d, 0xff, 0xb6, 0xaa,
0x88, 0xff, 0xcd, 0xc9, 0xb1, 0xff, 0xcb, 0xc8, 0xba, 0xff, 0x8e, 0x81, 0x6b, 0xff, 0x58, 0x49,
0x35, 0xff, 0x46, 0x3d, 0x32, 0xff, 0x3e, 0x34, 0x27, 0xff, 0x46, 0x3a, 0x2f, 0xff, 0x56, 0x4c,
0x41, 0xff, 0x5c, 0x52, 0x46, 0xff, 0x6e, 0x60, 0x50, 0xff, 0x96, 0x86, 0x72, 0xff, 0xd1, 0xcd,
0xc0, 0xff, 0xdc, 0xe3, 0xde, 0xff, 0xdc, 0xdf, 0xd6, 0xff, 0xdb, 0xdc, 0xd0, 0xff, 0xd8, 0xd7,
0xc8, 0xff, 0xc3, 0xba, 0x9d, 0xff, 0xba, 0xad, 0x8d, 0xff, 0xb4, 0xa6, 0x86, 0xff, 0x9d, 0x8e,
0x70, 0xff, 0x89, 0x79, 0x5d, 0xff, 0x7c, 0x6c, 0x52, 0xff, 0x73, 0x64, 0x4d, 0xff, 0x8a, 0x78,
0x58, 0xff, 0x83, 0x72, 0x53, 0xff, 0x78, 0x67, 0x4b, 0xff, 0x77, 0x67, 0x4a, 0xff, 0x72, 0x62,
0x48, 0xff, 0x7a, 0x69, 0x4d, 0xff, 0x87, 0x76, 0x57, 0xff, 0x91, 0x80, 0x5f, 0xff, 0xa3, 0x93,
0x71, 0xff, 0xaf, 0xa2, 0x82, 0xff, 0x80, 0x72, 0x5b, 0xff, 0x6c, 0x5e, 0x49, 0xff, 0x50, 0x42,
0x30, 0xff, 0x45, 0x3e, 0x35, 0xff, 0x42, 0x38, 0x2c, 0xff, 0x3f, 0x35, 0x29, 0xff, 0x4f, 0x44,
0x39, 0xff, 0x6a, 0x63, 0x5a, 0xff, 0x77, 0x6d, 0x61, 0xff, 0x94, 0x86, 0x73, 0xff, 0xcf, 0xcb,
0xbe, 0xff, 0xdc, 0xe1, 0xda, 0xff, 0xdc, 0xe4, 0xde, 0xff, 0xdc, 0xe0, 0xd8, 0xff, 0xd2, 0xce,
0xb9, 0xff, 0xc5, 0xbc, 0x9f, 0xff, 0xc0, 0xb6, 0x97, 0xff, 0xb7, 0xa9, 0x88, 0xff, 0xa7, 0x98,
0x79, 0xff, 0x94, 0x84, 0x68, 0xff, 0x80, 0x70, 0x56, 0xff, 0x77, 0x68, 0x50, 0xff, 0x7a, 0x69,
0x4d, 0xff, 0x75, 0x65, 0x49, 0xff, 0x6b, 0x5b, 0x42, 0xff, 0x68, 0x58, 0x3f, 0xff, 0x6c, 0x5d,
0x44, 0xff, 0x73, 0x63, 0x48, 0xff, 0x7d, 0x6b, 0x4f, 0xff, 0x82, 0x72, 0x54, 0xff, 0x92, 0x81,
0x61, 0xff, 0xa2, 0x93, 0x73, 0xff, 0x9d, 0x91, 0x7a, 0xff, 0x7b, 0x6e, 0x59, 0xff, 0x4e, 0x3f,
0x2e, 0xff, 0x46, 0x3f, 0x37, 0xff, 0x4b, 0x42, 0x37, 0xff, 0x4a, 0x3f, 0x33, 0xff, 0x66, 0x5d,
0x54, 0xff, 0x74, 0x6d, 0x66, 0xff, 0x81, 0x79, 0x72, 0xff, 0x8f, 0x81, 0x6f, 0xff, 0xbd, 0xb6,
0xa4, 0xff, 0xd5, 0xd4, 0xc6, 0xff, 0xdb, 0xe0, 0xd9, 0xff, 0xdc, 0xe1, 0xd8, 0xff, 0xd6, 0xd3,
0xc1, 0xff, 0xcb, 0xc3, 0xa9, 0xff, 0xc3, 0xbb, 0x9e, 0xff, 0xb8, 0xab, 0x8b, 0xff, 0xac, 0x9d,
0x7d, 0xff, 0x96, 0x86, 0x6b, 0xff, 0x88, 0x78, 0x5d, 0xff, 0x7c, 0x6c, 0x54, 0xff, 0x64, 0x55,
0x3c, 0xff, 0x5f, 0x50, 0x37, 0xff, 0x5f, 0x51, 0x37, 0xff, 0x63, 0x55, 0x3b, 0xff, 0x66, 0x57,
0x3d, 0xff, 0x69, 0x59, 0x40, 0xff, 0x72, 0x62, 0x47, 0xff, 0x7f, 0x6e, 0x51, 0xff, 0x94, 0x83,
0x63, 0xff, 0xad, 0x9f, 0x7d, 0xff, 0xb6, 0xab, 0x8e, 0xff, 0x91, 0x86, 0x6e, 0xff, 0x48, 0x3b,
0x2a, 0xff, 0x49, 0x41, 0x36, 0xff, 0x50, 0x46, 0x41, 0xff, 0x5f, 0x57, 0x50, 0xff, 0x77, 0x72,
0x70, 0xff, 0x74, 0x6b, 0x68, 0xff, 0x80, 0x75, 0x69, 0xff, 0x94, 0x88, 0x75, 0xff, 0xc1, 0xbb,
0xab, 0xff, 0xd7, 0xd6, 0xcc, 0xff, 0xdc, 0xe1, 0xdc, 0xff, 0xdc, 0xe2, 0xdb, 0xff, 0xd9, 0xd9,
0xcb, 0xff, 0xd0, 0xcb, 0xb5, 0xff, 0xc5, 0xbc, 0x9f, 0xff, 0xb8, 0xab, 0x8b, 0xff, 0xab, 0x9c,
0x7c, 0xff, 0x9c, 0x8c, 0x6f, 0xff, 0x8c, 0x7d, 0x62, 0xff, 0x81, 0x71, 0x57, 0xff, 0x59, 0x4b,
0x33, 0xff, 0x55, 0x49, 0x31, 0xff, 0x58, 0x4b, 0x32, 0xff, 0x5c, 0x4e, 0x35, 0xff, 0x5c, 0x4e,
0x35, 0xff, 0x60, 0x52, 0x39, 0xff, 0x6a, 0x5a, 0x41, 0xff, 0x78, 0x67, 0x4c, 0xff, 0x8d, 0x7d,
0x5e, 0xff, 0xab, 0x9c, 0x7a, 0xff, 0xbd, 0xb3, 0x95, 0xff, 0xb4, 0xac, 0x95, 0xff, 0x5d, 0x51,
0x3e, 0xff, 0x44, 0x3a, 0x2d, 0xff, 0x5b, 0x53, 0x4d, 0xff, 0x63, 0x5a, 0x52, 0xff, 0x72, 0x6a,
0x64, 0xff, 0x79, 0x72, 0x6d, 0xff, 0x79, 0x6b, 0x5b, 0xff, 0x9d, 0x91, 0x7e, 0xff, 0xcb, 0xc7,
0xb8, 0xff, 0xdb, 0xdf, 0xd7, 0xff, 0xdc, 0xe4, 0xdf, 0xff, 0xdc, 0xe4, 0xdf, 0xff, 0xdc, 0xde,
0xd4, 0xff, 0xd5, 0xd3, 0xc2, 0xff, 0xc6, 0xbe, 0xa2, 0xff, 0xb7, 0xa9, 0x89, 0xff, 0xb2, 0xa4,
0x84, 0xff, 0xab, 0x9b, 0x7c, 0xff, 0x97, 0x87, 0x6c, 0xff, 0x8c, 0x7c, 0x61, 0xff, 0x55, 0x48,
0x31, 0xff, 0x54, 0x46, 0x2f, 0xff, 0x54, 0x46, 0x2f, 0xff, 0x55, 0x48, 0x31, 0xff, 0x58, 0x4a,
0x32, 0xff, 0x5a, 0x4d, 0x34, 0xff, 0x62, 0x54, 0x3a, 0xff, 0x70, 0x60, 0x47, 0xff, 0x81, 0x70,
0x53, 0xff, 0xab, 0x9d, 0x7c, 0xff, 0xca, 0xc5, 0xac, 0xff, 0xbe, 0xb8, 0xa4, 0xff, 0x62, 0x56,
0x44, 0xff, 0x46, 0x3a, 0x2b, 0xff, 0x72, 0x6a, 0x61, 0xff, 0x96, 0x93, 0x8e, 0xff, 0xa6, 0xa5,
0xa1, 0xff, 0xa2, 0xa1, 0x9d, 0xff, 0x82, 0x74, 0x61, 0xff, 0xba, 0xb1, 0xa1, 0xff, 0xd7, 0xd9,
0xd1, 0xff, 0xdc, 0xe3, 0xdf, 0xff, 0xdc, 0xe4, 0xdf, 0xff, 0xdc, 0xe3, 0xdc, 0xff, 0xdc, 0xe1,
0xd8, 0xff, 0xda, 0xda, 0xcc, 0xff, 0xce, 0xc8, 0xb1, 0xff, 0xc0, 0xb6, 0x98, 0xff, 0xbe, 0xb3,
0x94, 0xff, 0xba, 0xaf, 0x8f, 0xff, 0xb0, 0xa4, 0x86, 0xff, 0x94, 0x84, 0x68, 0xff, 0x59, 0x4c,
0x34, 0xff, 0x58, 0x4a, 0x33, 0xff, 0x55, 0x48, 0x31, 0xff, 0x55, 0x48, 0x30, 0xff, 0x58, 0x4b,
0x33, 0xff, 0x5a, 0x4c, 0x34, 0xff, 0x61, 0x53, 0x39, 0xff, 0x6e, 0x5e, 0x45, 0xff, 0x82, 0x72,
0x56, 0xff, 0x9d, 0x8d, 0x6c, 0xff, 0xbf, 0xb6, 0x99, 0xff, 0xac, 0xa7, 0x95, 0xff, 0x81, 0x77,
0x66, 0xff, 0x5c, 0x51, 0x40, 0xff, 0x5f, 0x55, 0x47, 0xff, 0x7b, 0x75, 0x6b, 0xff, 0x98, 0x93,
0x8b, 0xff, 0x8e, 0x83, 0x75, 0xff, 0xaf, 0xa5, 0x94, 0xff, 0xd4, 0xd5, 0xcc, 0xff, 0xdc, 0xe2,
0xdf, 0xff, 0xdc, 0xe4, 0xe1, 0xff, 0xdc, 0xe0, 0xd7, 0xff, 0xdc, 0xe0, 0xd6, 0xff, 0xdc, 0xdd,
0xd3, 0xff, 0xdb, 0xdc, 0xd0, 0xff, 0xd6, 0xd5, 0xc4, 0xff, 0xcd, 0xc7, 0xaf, 0xff, 0xcb, 0xc4,
0xab, 0xff, 0xcb, 0xc5, 0xad, 0xff, 0xcf, 0xcb, 0xb7, 0xff, 0xa5, 0x97, 0x7c, 0xff, 0x61, 0x53,
0x3a, 0xff, 0x61, 0x53, 0x3a, 0xff, 0x5c, 0x4e, 0x36, 0xff, 0x5a, 0x4d, 0x35, 0xff, 0x5b, 0x4d,
0x35, 0xff, 0x61, 0x52, 0x39, 0xff, 0x6a, 0x5b, 0x42, 0xff, 0x77, 0x67, 0x4c, 0xff, 0x85, 0x75,
0x58, 0xff, 0x8f, 0x7e, 0x60, 0xff, 0xa9, 0x9b, 0x7a, 0xff, 0xcd, 0xca, 0xb6, 0xff, 0xb9, 0xb2,
0x9f, 0xff, 0x99, 0x8f, 0x7e, 0xff, 0x83, 0x78, 0x68, 0xff, 0x87, 0x7c, 0x6b, 0xff, 0x8b, 0x7e,
0x6a, 0xff, 0xb4, 0xad, 0x9c, 0xff, 0xd4, 0xd4, 0xc8, 0xff, 0xdc, 0xe4, 0xe0, 0xff, 0xdc, 0xe4,
0xe1, 0xff, 0xdc, 0xe4, 0xde, 0xff, 0xdc, 0xe0, 0xd7, 0xff, 0xdb, 0xdb, 0xce, 0xff, 0xdc, 0xdd,
0xd3, 0xff, 0xdb, 0xdb, 0xce, 0xff, 0xd8, 0xd7, 0xc8, 0xff, 0xd2, 0xcf, 0xbc, 0xff, 0xd3, 0xd0,
0xbd, 0xff, 0xd9, 0xd9, 0xcc, 0xff, 0xd5, 0xd4, 0xc3, 0xff, 0xc2, 0xba, 0xa3, 0xff, 0x73, 0x64,
0x49, 0xff, 0x72, 0x63, 0x48, 0xff, 0x71, 0x62, 0x47, 0xff, 0x6d, 0x5d, 0x43, 0xff, 0x6b, 0x5b,
0x41, 0xff, 0x77, 0x67, 0x4b, 0xff, 0x89, 0x78, 0x59, 0xff, 0x99, 0x89, 0x69, 0xff, 0xaf, 0xa3,
0x82, 0xff, 0xaa, 0x9b, 0x79, 0xff, 0xa8, 0x99, 0x76, 0xff, 0xbc, 0xb2, 0x92, 0xff, 0xcd, 0xc8,
0xb1, 0xff, 0xd7, 0xd8, 0xcb, 0xff, 0xc2, 0xbf, 0xb2, 0xff, 0xbc, 0xb5, 0xa5, 0xff, 0xd3, 0xd3,
0xc7, 0xff, 0xdb, 0xdf, 0xd7, 0xff, 0xdb, 0xe2, 0xdc, 0xff, 0xdc, 0xe2, 0xdb, 0xff, 0xdc, 0xe4,
0xde, 0xff, 0xdc, 0xe3, 0xdc, 0xff, 0xdc, 0xdf, 0xd5, 0xff, 0xda, 0xda, 0xcb, 0xff, 0xdc, 0xdc,
0xd1, 0xff, 0xda, 0xdb, 0xcd, 0xff, 0xd7, 0xd6, 0xc6, 0xff, 0xd1, 0xcd, 0xb7, 0xff, 0xd7, 0xd8,
0xc8, 0xff, 0xd9, 0xd9, 0xcb, 0xff, 0xd5, 0xd5, 0xc4, 0xff, 0xd1, 0xce, 0xba, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

View file

@ -0,0 +1,118 @@
#pragma once
const uint8_t flash_html[] = {
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c,
0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x65, 0x6e, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2d, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x72, 0x6b, 0x3e, 0x3c, 0x68, 0x65,
0x61, 0x64, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x20, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e,
0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x66, 0x69, 0x74, 0x3d, 0x6e, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53,
0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65,
0x6c, 0x3d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x69, 0x6d, 0x61, 0x67,
0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e,
0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x70, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x73, 0x73, 0x20,
0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x2f,
0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x6d, 0x61, 0x69, 0x6e,
0x2e, 0x63, 0x73, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68,
0x65, 0x65, 0x74, 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f,
0x64, 0x79, 0x3e, 0x3c, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63,
0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c,
0x68, 0x32, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x3a, 0x20, 0x46,
0x6c, 0x61, 0x73, 0x68, 0x20, 0x42, 0x49, 0x4f, 0x53, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x6c,
0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x66, 0x69, 0x6c, 0x65, 0x3e, 0x3c, 0x62,
0x3e, 0x46, 0x69, 0x6c, 0x65, 0x3a, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65,
0x6c, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x66, 0x69,
0x6c, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x63, 0x68, 0x61,
0x6e, 0x67, 0x65, 0x3d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x49,
0x6e, 0x66, 0x6f, 0x28, 0x29, 0x20, 0x2f, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x20, 0x3c,
0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c,
0x62, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62,
0x65, 0x6c, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x74, 0x79, 0x70,
0x65, 0x3d, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
0x3d, 0x34, 0x30, 0x20, 0x69, 0x64, 0x3d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2f, 0x3e, 0x3c, 0x62,
0x72, 0x20, 0x2f, 0x3e, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d,
0x73, 0x6c, 0x6f, 0x74, 0x73, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x3e, 0x3c, 0x62, 0x3e, 0x4e,
0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x3a, 0x3c, 0x2f, 0x62, 0x3e,
0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64,
0x3d, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x3e, 0x4e, 0x41, 0x3c,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65,
0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x66, 0x72, 0x65, 0x65, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x3e,
0x3c, 0x62, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x3a, 0x3c, 0x2f,
0x62, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x69, 0x64, 0x3d, 0x66, 0x72, 0x65, 0x65, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x3e, 0x30, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c,
0x20, 0x66, 0x6f, 0x72, 0x3d, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x75, 0x74,
0x74, 0x6f, 0x6e, 0x73, 0x3e, 0x3c, 0x62, 0x3e, 0x4c, 0x45, 0x44, 0x20, 0x43, 0x6f, 0x6c, 0x6f,
0x72, 0x3a, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d,
0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3e, 0x4f, 0x66, 0x66, 0x3c, 0x2f, 0x73, 0x70,
0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x69, 0x64, 0x3d, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x75, 0x74, 0x74, 0x6f,
0x6e, 0x73, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72,
0x69, 0x64, 0x3e, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65,
0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x62, 0x74,
0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x6f, 0x66, 0x66, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b,
0x3d, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x3e,
0x4f, 0x66, 0x66, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x62, 0x75,
0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x72, 0x65,
0x64, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x64,
0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x31, 0x29, 0x3e, 0x52, 0x65, 0x64, 0x3c, 0x2f, 0x62, 0x75,
0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x79,
0x70, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x63,
0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
0x28, 0x32, 0x29, 0x3e, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f,
0x6e, 0x3e, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x62, 0x74, 0x6e,
0x2d, 0x6c, 0x65, 0x64, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69,
0x63, 0x6b, 0x3d, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x33,
0x29, 0x3e, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74,
0x79, 0x70, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x6e, 0x63,
0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
0x28, 0x34, 0x29, 0x3e, 0x42, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
0x3e, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x62,
0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x62, 0x74, 0x6e, 0x2d,
0x6c, 0x65, 0x64, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63,
0x6b, 0x3d, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x35, 0x29,
0x3e, 0x50, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e,
0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x62, 0x75,
0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x62, 0x74, 0x6e, 0x2d, 0x6c,
0x65, 0x64, 0x74, 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x63, 0x6c,
0x69, 0x63, 0x6b, 0x3d, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28,
0x36, 0x29, 0x3e, 0x54, 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x3c, 0x2f, 0x62, 0x75,
0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x79,
0x70, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x6e, 0x63,
0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
0x28, 0x37, 0x29, 0x3e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f,
0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x68,
0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c,
0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
0x64, 0x20, 0x69, 0x64, 0x3d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x68, 0x72, 0x65, 0x66,
0x3d, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64,
0x28, 0x30, 0x29, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x75, 0x70, 0x6c, 0x6f,
0x61, 0x64, 0x28, 0x29, 0x3e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x3c, 0x2f, 0x61, 0x3e, 0x20,
0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x68,
0x72, 0x65, 0x66, 0x3d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x42,
0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72,
0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x3e, 0x43, 0x6f, 0x70, 0x79, 0x72,
0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x32, 0x34, 0x20, 0x2d, 0x20, 0x54, 0x65, 0x61, 0x6d,
0x20, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x20,
0x52, 0x65, 0x73, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x6d, 0x61, 0x69, 0x6e,
0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x66, 0x6c, 0x61,
0x73, 0x68, 0x2e, 0x6a, 0x73, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c,
0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e
};

View file

@ -0,0 +1,226 @@
#pragma once
const uint8_t flash_js[] = {
0x6c, 0x65, 0x74, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74,
0x65, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
0x2e, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x66,
0x72, 0x65, 0x73, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x29, 0x3b, 0x0d,
0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x0d, 0x0a, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65,
0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45,
0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x66, 0x69, 0x6c, 0x65,
0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x69, 0x6c,
0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
0x20, 0x2d, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x20,
0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5b, 0x30, 0x5d, 0x2e,
0x73, 0x69, 0x7a, 0x65, 0x3b, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28,
0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
0x20, 0x2d, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65,
0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x25, 0x20,
0x28, 0x32, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x32, 0x34, 0x29, 0x20, 0x21, 0x3d, 0x20,
0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20,
0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a,
0x65, 0x20, 0x3e, 0x20, 0x28, 0x31, 0x30, 0x32, 0x34, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x32, 0x34,
0x29, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65,
0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e,
0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x66, 0x72, 0x65,
0x73, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x29, 0x0d, 0x0a, 0x7b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20,
0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c,
0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22,
0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65,
0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x7b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67,
0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x6e,
0x61, 0x6d, 0x65, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c,
0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5b, 0x30, 0x5d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x2e,
0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x20, 0x34, 0x30, 0x29,
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x66, 0x72, 0x65, 0x65, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x2e, 0x6a, 0x73, 0x6f, 0x6e,
0x22, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x72, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6a, 0x73, 0x6f,
0x6e, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x72, 0x65, 0x65, 0x53, 0x6c,
0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67,
0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x66,
0x72, 0x65, 0x65, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x65, 0x65, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x2e, 0x74,
0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6a, 0x73, 0x6f,
0x6e, 0x5b, 0x22, 0x66, 0x72, 0x65, 0x65, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0x5d, 0x3b, 0x0d,
0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74,
0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49,
0x64, 0x28, 0x22, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x6c, 0x6f, 0x74,
0x73, 0x4e, 0x65, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79,
0x49, 0x64, 0x28, 0x22, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x22,
0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73,
0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74,
0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x53,
0x69, 0x7a, 0x65, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x73,
0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x69, 0x73,
0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
0x64, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x4e, 0x65, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x74,
0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x4e, 0x41,
0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x4e,
0x65, 0x65, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c,
0x65, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x28, 0x32, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x31,
0x30, 0x32, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x4e, 0x65, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e,
0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x6c,
0x6f, 0x74, 0x73, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
0x28, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75,
0x65, 0x20, 0x3e, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x22, 0x66, 0x72, 0x65, 0x65, 0x73, 0x6c,
0x6f, 0x74, 0x73, 0x22, 0x5d, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64,
0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62,
0x6c, 0x65, 0x64, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70,
0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69,
0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x29,
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f,
0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x2f, 0x2f, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
0x0a, 0x0d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x4c,
0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c,
0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c,
0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c,
0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f,
0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x22,
0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28,
0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c,
0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65,
0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x64, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, 0x3a,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65,
0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43,
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x22,
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63,
0x61, 0x73, 0x65, 0x20, 0x33, 0x3a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74,
0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22,
0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x3a, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f,
0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74,
0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x42, 0x6c, 0x75, 0x65, 0x22, 0x3b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b,
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20,
0x35, 0x3a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x65, 0x78,
0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x50, 0x75, 0x72, 0x70,
0x6c, 0x65, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x36, 0x3a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54,
0x65, 0x78, 0x74, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20,
0x3d, 0x20, 0x22, 0x54, 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x22, 0x3b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61,
0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65,
0x20, 0x37, 0x3a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x65,
0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x57, 0x68, 0x69,
0x74, 0x65, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
0x54, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
0x20, 0x3d, 0x20, 0x22, 0x4f, 0x66, 0x66, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x29, 0x0d, 0x0a,
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x70, 0x6c,
0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67,
0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x75,
0x70, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70,
0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
0x65, 0x28, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64,
0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63,
0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69,
0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x2c,
0x20, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20,
0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c,
0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61,
0x74, 0x61, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x44, 0x61, 0x74,
0x61, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61,
0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x66, 0x69, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x69,
0x6c, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27,
0x62, 0x6f, 0x64, 0x79, 0x27, 0x2c, 0x20, 0x22, 0x7b, 0x5c, 0x22, 0x6c, 0x65, 0x64, 0x43, 0x6f,
0x6c, 0x6f, 0x72, 0x5c, 0x22, 0x3a, 0x22, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c,
0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x2c, 0x5c, 0x22, 0x62, 0x61,
0x6e, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x5c, 0x22, 0x3a, 0x5c, 0x22, 0x22, 0x20, 0x2b, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x5c, 0x22, 0x7d,
0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66,
0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61,
0x64, 0x22, 0x2c, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d,
0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x20, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x20, 0x64, 0x61,
0x74, 0x61, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28,
0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x30,
0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x22, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78,
0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x61, 0x69,
0x6c, 0x75, 0x72, 0x65, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68,
0x28, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x28,
0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, 0x3b,
0x0d, 0x0a, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x28,
0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x28,
0x22, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x22,
0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x70, 0x6c, 0x6f,
0x61, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65,
0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x75, 0x70,
0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x6c,
0x6f, 0x61, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62,
0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x29, 0x3b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d,
0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65,
0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x29,
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
0x76, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x69, 0x73,
0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a
};

View file

@ -0,0 +1,80 @@
#pragma once
const uint8_t index_html[] = {
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c,
0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x65, 0x6e, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2d, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x72, 0x6b, 0x3e, 0x3c, 0x68, 0x65,
0x61, 0x64, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x20, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e,
0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x66, 0x69, 0x74, 0x3d, 0x6e, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53,
0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65,
0x6c, 0x3d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x69, 0x6d, 0x61, 0x67,
0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e,
0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x70, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x73, 0x73, 0x20,
0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x2f,
0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x6d,
0x61, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x50, 0x72,
0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20,
0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66,
0x3d, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x4c, 0x61, 0x75,
0x6e, 0x63, 0x68, 0x20, 0x42, 0x49, 0x4f, 0x53, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61,
0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x72, 0x65, 0x6d, 0x6f,
0x76, 0x65, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x42,
0x49, 0x4f, 0x53, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72,
0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72,
0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f,
0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x68, 0x74, 0x6d,
0x6c, 0x3e, 0x46, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x42, 0x49, 0x4f, 0x53, 0x3c, 0x2f, 0x61, 0x3e,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72,
0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x44,
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61,
0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x63, 0x65, 0x72, 0x62,
0x69, 0x6f, 0x73, 0x69, 0x6e, 0x69, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x43, 0x65, 0x72, 0x62,
0x69, 0x6f, 0x73, 0x20, 0x49, 0x4e, 0x49, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76,
0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62,
0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x6a, 0x61, 0x76, 0x61, 0x73,
0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x20, 0x6f, 0x6e,
0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74,
0x28, 0x29, 0x3e, 0x54, 0x61, 0x6b, 0x65, 0x20, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68,
0x6f, 0x74, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20,
0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69,
0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x76, 0x69, 0x65, 0x77,
0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x20, 0x56, 0x69, 0x65,
0x77, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f,
0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64,
0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20,
0x68, 0x72, 0x65, 0x66, 0x3d, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a,
0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d,
0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x28, 0x29, 0x3e, 0x52, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x3c,
0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c,
0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c,
0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x68, 0x72,
0x65, 0x66, 0x3d, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f,
0x69, 0x64, 0x28, 0x30, 0x29, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x73, 0x68,
0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x28, 0x29, 0x3e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77,
0x6e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f,
0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x3e, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67,
0x68, 0x74, 0x20, 0x32, 0x30, 0x32, 0x34, 0x20, 0x2d, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x20, 0x43,
0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x20, 0x52, 0x65,
0x73, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76,
0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x3e, 0x3c,
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x69, 0x6e, 0x64, 0x65, 0x78,
0x2e, 0x6a, 0x73, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62,
0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e
};

View file

@ -0,0 +1,29 @@
#pragma once
const uint8_t index_js[] = {
0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73,
0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x28, 0x29, 0x7b, 0x61, 0x77, 0x61, 0x69,
0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63,
0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68,
0x28, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e,
0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20,
0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x7d, 0x29, 0x2e, 0x74,
0x68, 0x65, 0x6e, 0x28, 0x6e, 0x3d, 0x3e, 0x6e, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x28, 0x29, 0x29,
0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x6e, 0x3d, 0x3e, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d,
0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x55, 0x52, 0x4c, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74,
0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x52, 0x4c, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x3d,
0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45,
0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x61, 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x68, 0x72,
0x65, 0x66, 0x3d, 0x69, 0x3b, 0x74, 0x2e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3d,
0x22, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x70, 0x6e, 0x67, 0x22,
0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61,
0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, 0x29, 0x3b, 0x74, 0x2e,
0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, 0x3b, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65,
0x28, 0x29, 0x7d, 0x29, 0x7d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x28, 0x29, 0x7b, 0x61, 0x77, 0x61,
0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72,
0x65, 0x62, 0x6f, 0x6f, 0x74, 0x22, 0x29, 0x7d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75,
0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x28,
0x29, 0x7b, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x7d
};

View file

@ -0,0 +1,42 @@
#pragma once
const uint8_t launch_html[] = {
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c,
0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x65, 0x6e, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2d, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x72, 0x6b, 0x3e, 0x3c, 0x68, 0x65,
0x61, 0x64, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x20, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e,
0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x66, 0x69, 0x74, 0x3d, 0x6e, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53,
0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65,
0x6c, 0x3d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x69, 0x6d, 0x61, 0x67,
0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e,
0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x70, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x73, 0x73, 0x20,
0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x2f,
0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x6d,
0x61, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x50, 0x72,
0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x3a, 0x20, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68,
0x20, 0x42, 0x49, 0x4f, 0x53, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c,
0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3e,
0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x57, 0x61, 0x69, 0x74, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f,
0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f,
0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64,
0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20,
0x68, 0x72, 0x65, 0x66, 0x3d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e,
0x42, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62,
0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x3e, 0x43, 0x6f, 0x70, 0x79,
0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x32, 0x34, 0x20, 0x2d, 0x20, 0x54, 0x65, 0x61,
0x6d, 0x20, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x54, 0x65, 0x61, 0x6d,
0x20, 0x52, 0x65, 0x73, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x6d, 0x61, 0x69,
0x6e, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x6c, 0x61,
0x75, 0x6e, 0x63, 0x68, 0x2e, 0x6a, 0x73, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e
};

View file

@ -0,0 +1,121 @@
#pragma once
const uint8_t launch_js[] = {
0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20,
0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x29,
0x3b, 0x0d, 0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6b, 0x49,
0x6e, 0x66, 0x6f, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61,
0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62,
0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x29, 0x2e, 0x74,
0x68, 0x65, 0x6e, 0x28, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x20, 0x3d, 0x20,
0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6a,
0x73, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64,
0x79, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b,
0x20, 0x69, 0x20, 0x3c, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x69,
0x5d, 0x2e, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x22,
0x3c, 0x70, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x5c, 0x22,
0x67, 0x72, 0x69, 0x64, 0x5c, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x5c,
0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5c, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x5c,
0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64,
0x28, 0x30, 0x29, 0x5c, 0x22, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x5c, 0x22,
0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x42, 0x61, 0x6e, 0x6b, 0x28, 0x22, 0x20, 0x2b, 0x20, 0x6a,
0x73, 0x6f, 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x22, 0x29, 0x5c, 0x22,
0x3e, 0x22, 0x20, 0x2b, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x6e, 0x61, 0x6d,
0x65, 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c,
0x2f, 0x70, 0x3e, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
0x42, 0x6f, 0x64, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x22, 0x3c, 0x70, 0x3e, 0x3c, 0x64, 0x69, 0x76,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x5c, 0x22, 0x67, 0x72, 0x69, 0x64, 0x5c, 0x22, 0x3e,
0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x5c, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
0x5c, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x5c, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63,
0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5c, 0x22, 0x20, 0x6f,
0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x5c, 0x22, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x54,
0x73, 0x6f, 0x70, 0x28, 0x29, 0x5c, 0x22, 0x3e, 0x54, 0x53, 0x4f, 0x50, 0x3c, 0x2f, 0x61, 0x3e,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x22, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74,
0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67,
0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63,
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72,
0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f,
0x64, 0x79, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63,
0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74,
0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54,
0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x42, 0x61,
0x6e, 0x6b, 0x28, 0x69, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61,
0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69,
0x2f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x62, 0x61, 0x6e, 0x6b, 0x3f, 0x22, 0x20, 0x2b, 0x20,
0x69, 0x64, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20,
0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20,
0x3d, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e,
0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x74,
0x68, 0x65, 0x6e, 0x28, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20,
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d,
0x3d, 0x20, 0x32, 0x30, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74,
0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e,
0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68,
0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65,
0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e,
0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65,
0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x2e, 0x22, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29,
0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75,
0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x54, 0x73, 0x6f,
0x70, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74,
0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x75,
0x6e, 0x63, 0x68, 0x74, 0x73, 0x6f, 0x70, 0x22, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28,
0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65,
0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20,
0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74,
0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x30, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49,
0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22,
0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x22, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74,
0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79,
0x49, 0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74,
0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20,
0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63,
0x68, 0x2e, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x7d
};

View file

@ -0,0 +1,107 @@
#pragma once
const uint8_t main_css[] = {
0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x6f, 0x66, 0x66, 0x7b, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e,
0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x34, 0x30, 0x34, 0x30, 0x34, 0x30, 0x3b,
0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30,
0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x6f, 0x66, 0x66, 0x3a, 0x68, 0x6f,
0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x6f, 0x66, 0x66, 0x3a,
0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x6f, 0x66,
0x66, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65,
0x64, 0x6f, 0x66, 0x66, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e,
0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x30, 0x32, 0x30, 0x32, 0x30, 0x3b,
0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30,
0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x72, 0x65, 0x64, 0x7b, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x61, 0x30, 0x61, 0x30,
0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23,
0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x72, 0x65, 0x64, 0x3a,
0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x72, 0x65,
0x64, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64,
0x72, 0x65, 0x64, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d,
0x6c, 0x65, 0x64, 0x72, 0x65, 0x64, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7b, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x34, 0x30, 0x63, 0x30,
0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23,
0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x67, 0x72, 0x65, 0x65,
0x6e, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63,
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32,
0x38, 0x39, 0x61, 0x32, 0x33, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64,
0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e,
0x2d, 0x6c, 0x65, 0x64, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c,
0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x61, 0x63,
0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x67, 0x72, 0x65,
0x65, 0x6e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d,
0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x32, 0x63, 0x31, 0x32, 0x63, 0x3b, 0x62, 0x6f,
0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x7d,
0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x7b, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72,
0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x63, 0x63, 0x61, 0x34,
0x30, 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
0x23, 0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x79, 0x65, 0x6c,
0x6c, 0x6f, 0x77, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c,
0x65, 0x64, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e,
0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x3a, 0x61, 0x63,
0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x79, 0x65, 0x6c,
0x6c, 0x6f, 0x77, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x63, 0x64, 0x30, 0x30, 0x3b, 0x62,
0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30,
0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x62, 0x6c, 0x75, 0x65, 0x7b, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x34, 0x33, 0x35, 0x38, 0x63,
0x63, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23,
0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x62, 0x6c, 0x75, 0x65,
0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x62,
0x6c, 0x75, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c,
0x65, 0x64, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62,
0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x62, 0x6c, 0x75, 0x65, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76,
0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63,
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x35,
0x32, 0x36, 0x65, 0x66, 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64,
0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30,
0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x3a, 0x23, 0x36, 0x36, 0x33, 0x66, 0x61, 0x31, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65,
0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74,
0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65,
0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65,
0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x70,
0x75, 0x72, 0x70, 0x6c, 0x65, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74,
0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x2e, 0x61, 0x63, 0x74, 0x69,
0x76, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61,
0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23,
0x37, 0x66, 0x34, 0x66, 0x63, 0x39, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65,
0x64, 0x74, 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x39, 0x36, 0x61, 0x65, 0x3b, 0x62,
0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30,
0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x74, 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69,
0x73, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65,
0x64, 0x74, 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73,
0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x74, 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69,
0x73, 0x65, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c,
0x65, 0x64, 0x74, 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x2e, 0x61, 0x63, 0x74, 0x69,
0x76, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61,
0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23,
0x30, 0x30, 0x62, 0x63, 0x64, 0x39, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65,
0x64, 0x77, 0x68, 0x69, 0x74, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30,
0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x3a, 0x23, 0x63, 0x30, 0x63, 0x30, 0x63, 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65,
0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x7d, 0x2e, 0x62, 0x74,
0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72,
0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3a, 0x66,
0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x77, 0x68, 0x69,
0x74, 0x65, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c,
0x65, 0x64, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7b, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72,
0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x30, 0x66, 0x30,
0x66, 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
0x23, 0x30, 0x30, 0x30, 0x7d
};

View file

@ -0,0 +1,49 @@
#pragma once
const uint8_t remoteview_html[] = {
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c,
0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x65, 0x6e, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2d, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x72, 0x6b, 0x3e, 0x3c, 0x68, 0x65,
0x61, 0x64, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x20, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e,
0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x66, 0x69, 0x74, 0x3d, 0x6e, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53,
0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65,
0x6c, 0x3d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x69, 0x6d, 0x61, 0x67,
0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e,
0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x70, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x73, 0x73, 0x20,
0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x2f,
0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x6d,
0x61, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x50, 0x72,
0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x3a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65,
0x20, 0x56, 0x69, 0x65, 0x77, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c,
0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3e,
0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x57, 0x61, 0x69, 0x74, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f,
0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f,
0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64,
0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20,
0x68, 0x72, 0x65, 0x66, 0x3d, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a,
0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d,
0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x28, 0x29, 0x3e, 0x52, 0x65, 0x66,
0x72, 0x65, 0x73, 0x68, 0x20, 0x56, 0x69, 0x65, 0x77, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c,
0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65,
0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x73, 0x65,
0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x69, 0x6e, 0x64,
0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x42, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76,
0x3e, 0x3c, 0x62, 0x3e, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30,
0x32, 0x34, 0x20, 0x2d, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f,
0x73, 0x20, 0x2b, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x75, 0x72, 0x67, 0x65,
0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x66, 0x6f,
0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70,
0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x76, 0x69, 0x65, 0x77,
0x2e, 0x6a, 0x73, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62,
0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e
};

View file

@ -0,0 +1,29 @@
#pragma once
const uint8_t remoteview_js[] = {
0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73,
0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x28, 0x29, 0x7b, 0x61, 0x77, 0x61, 0x69,
0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63,
0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68,
0x28, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e,
0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20,
0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x7d, 0x29, 0x2e, 0x74,
0x68, 0x65, 0x6e, 0x28, 0x6e, 0x3d, 0x3e, 0x6e, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x28, 0x29, 0x29,
0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x6e, 0x3d, 0x3e, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d,
0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x55, 0x52, 0x4c, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74,
0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x52, 0x4c, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x3d,
0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45,
0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x69, 0x6d, 0x67, 0x22, 0x29, 0x3b, 0x74, 0x2e,
0x73, 0x72, 0x63, 0x3d, 0x72, 0x3b, 0x74, 0x2e, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x53, 0x63, 0x72,
0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x3b, 0x74, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65,
0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30,
0x25, 0x3b, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x22,
0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64,
0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x69, 0x2e, 0x69, 0x6e,
0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x22, 0x22, 0x3b, 0x69, 0x2e, 0x61, 0x70, 0x70,
0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, 0x29, 0x7d, 0x29, 0x7d, 0x77, 0x69,
0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f,
0x74, 0x28, 0x29, 0x7d, 0x3b
};

View file

@ -0,0 +1,42 @@
#pragma once
const uint8_t remove_html[] = {
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c,
0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x65, 0x6e, 0x20, 0x64, 0x61, 0x74,
0x61, 0x2d, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x72, 0x6b, 0x3e, 0x3c, 0x68, 0x65,
0x61, 0x64, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x20, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e,
0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x66, 0x69, 0x74, 0x3d, 0x6e, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53,
0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65,
0x6c, 0x3d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x69, 0x6d, 0x61, 0x67,
0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x20, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e,
0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x70, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x73, 0x73, 0x20,
0x72, 0x65, 0x6c, 0x3d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x2f,
0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x6d,
0x61, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x50, 0x72,
0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x4f, 0x53, 0x3a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
0x20, 0x42, 0x49, 0x4f, 0x53, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c,
0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3e,
0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x57, 0x61, 0x69, 0x74, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f,
0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x72, 0x20, 0x2f,
0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x67, 0x72, 0x69, 0x64,
0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20,
0x68, 0x72, 0x65, 0x66, 0x3d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3e,
0x42, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62,
0x72, 0x20, 0x2f, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x3e, 0x43, 0x6f, 0x70, 0x79,
0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x32, 0x34, 0x20, 0x2d, 0x20, 0x54, 0x65, 0x61,
0x6d, 0x20, 0x43, 0x65, 0x72, 0x62, 0x69, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x54, 0x65, 0x61, 0x6d,
0x20, 0x52, 0x65, 0x73, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x6d, 0x61, 0x69,
0x6e, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x72, 0x65,
0x6d, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x73, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e
};

View file

@ -0,0 +1,68 @@
#pragma once
const uint8_t remove_js[] = {
0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20,
0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x29,
0x3b, 0x0d, 0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6b, 0x49,
0x6e, 0x66, 0x6f, 0x28, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77,
0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x29, 0x2e,
0x74, 0x68, 0x65, 0x6e, 0x28, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x20, 0x3d,
0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
0x6a, 0x73, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f,
0x64, 0x79, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30,
0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74,
0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x73, 0x6f, 0x6e, 0x5b,
0x69, 0x5d, 0x2e, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2b, 0x3d, 0x20,
0x22, 0x3c, 0x70, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x5c,
0x22, 0x67, 0x72, 0x69, 0x64, 0x5c, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
0x5c, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5c, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
0x5c, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69,
0x64, 0x28, 0x30, 0x29, 0x5c, 0x22, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x5c,
0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x6e, 0x6b, 0x28, 0x22, 0x20, 0x2b, 0x20,
0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x22, 0x29, 0x5c,
0x22, 0x3e, 0x22, 0x20, 0x2b, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x6e, 0x61,
0x6d, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
0x3c, 0x2f, 0x70, 0x3e, 0x22, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28,
0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e,
0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
0x42, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x3f, 0x20, 0x22, 0x4e, 0x6f,
0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x20, 0x3a,
0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x3b, 0x0d, 0x0a, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72,
0x72, 0x6f, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20,
0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c,
0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65,
0x6e, 0x74, 0x22, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63,
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c,
0x20, 0x3d, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f,
0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61,
0x6e, 0x6b, 0x28, 0x69, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61,
0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69,
0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x62, 0x61, 0x6e, 0x6b, 0x3f, 0x22, 0x20, 0x2b, 0x20,
0x69, 0x64, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x42, 0x61, 0x6e,
0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29,
0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x3e, 0x20,
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22,
0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
0x74, 0x2e, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x7d
};

View file

@ -0,0 +1,31 @@
#include "displayDriver.h"
void displayDriver::setAddress(uint8_t address)
{
mAddress = address;
}
uint8_t displayDriver::getAddressValue()
{
return mAddress;
}
void displayDriver::setBankValue(uint8_t bank)
{
mBank = bank;
}
uint8_t displayDriver::getBankValue()
{
return mBank;
}
void displayDriver::setSpiValue(uint8_t spi)
{
mSpi = spi;
}
uint8_t displayDriver::getSpiValue()
{
return mSpi;
}

View file

@ -0,0 +1,32 @@
#pragma once
#include "..\xboxinternals.h"
#include "..\globalDefines.h"
#include "..\utils.h"
#include "..\settingsManager.h"
class displayDriver
{
public:
virtual bool isSpi2Par() = 0;
virtual char* getModel() = 0;
virtual void init() = 0;
virtual void printMessage(const char* message) = 0;
virtual void setCursorPosition(uint8_t row, uint8_t col) = 0;
virtual void getSupport(bool& lcdInfo, bool& backlight, bool& contrast) = 0;
virtual void setBacklight(uint8_t backlight) = 0;
virtual void setContrast(uint8_t contrast) = 0;
virtual uint8_t getI2cAddressCount() = 0;
virtual uint8_t getI2cAddress(uint8_t index) = 0;
void setAddress(uint8_t address);
uint8_t getAddressValue();
void setBankValue(uint8_t bank);
uint8_t getBankValue();
void setSpiValue(uint8_t spi);
uint8_t getSpiValue();
private:
uint8_t mAddress;
uint8_t mBank;
uint8_t mSpi;
};

View file

@ -0,0 +1,50 @@
#include "displayFactory.h"
displayDriver* displayFactory::getDisplay(displayVariant variant)
{
if (variant == displayVariantLCDXXXXLPC)
{
return displayLCDXXXXLPC::getInstance();
}
else if (variant == displayVariantLCDXXXXModxo)
{
return displayLCDXXXXModxo::getInstance();
}
else if (variant == displayVariantHD44780LPC)
{
return displayHD44780LPC::getInstance();
}
else if (variant == displayVariantHD44780Modxo)
{
return displayHD44780Modxo::getInstance();
}
else if (variant == displayVariantSPI2PARModxo)
{
return displaySPI2PARModxo::getInstance();
}
else if (variant == displayVariantHD44780Aladdin)
{
return displayHD44780Aladdin::getInstance();
}
else if (variant == displayVariantSPI2PARAladdin)
{
return displaySPI2PARAladdin::getInstance();
}
else if (variant == displayVariantSPI2PARSmartxx)
{
return displaySPI2PARSmartxx::getInstance();
}
else if (variant == displayVariantHD44780Xecuter)
{
return displayHD44780Xecuter::getInstance();
}
else if (variant == displayVariantSPI2PARXenium)
{
return displaySPI2PARXenium::getInstance();
}
else if (variant == displayVariantSPI2PARXtremium)
{
return displaySPI2PARXtremium::getInstance();
}
return NULL;
}

View file

@ -0,0 +1,35 @@
#pragma once
#include "displayDriver.h"
#include "displayLCDXXXXLPC.h"
#include "displayLCDXXXXModxo.h"
#include "displayHD44780LPC.h"
#include "displayHD44780Modxo.h"
#include "displaySPI2PARModxo.h"
#include "displayHD44780Aladdin.h"
#include "displaySPI2PARAladdin.h"
#include "displaySPI2PARSmartxx.h"
#include "displayHD44780Xecuter.h"
#include "displaySPI2PARXenium.h"
#include "displaySPI2PARXtremium.h"
enum displayVariant
{
displayVariantLCDXXXXLPC,
displayVariantLCDXXXXModxo,
displayVariantHD44780LPC,
displayVariantHD44780Modxo,
displayVariantSPI2PARModxo,
displayVariantHD44780Aladdin,
displayVariantSPI2PARAladdin,
displayVariantSPI2PARSmartxx,
displayVariantHD44780Xecuter,
displayVariantSPI2PARXenium,
displayVariantSPI2PARXtremium,
};
class displayFactory
{
public:
static displayDriver* getDisplay(displayVariant variant);
};

View file

@ -0,0 +1,114 @@
#include "displayHD44780Aladdin.h"
static displayDriver* mInstance = NULL;
displayDriver* displayHD44780Aladdin::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displayHD44780Aladdin();
}
return mInstance;
}
bool displayHD44780Aladdin::isSpi2Par()
{
return false;
}
char* displayHD44780Aladdin::getModel()
{
return strdup("HD44780");
}
void displayHD44780Aladdin::init()
{
utils::ioOutputByte(ALADDIN_REGISTER_IO, ALADDIN_DISP_EN5V);
writeValue(0x33, 0);
Sleep(ALADDIN_LCD_DELAY);
writeValue(0x32, 0);
Sleep(ALADDIN_LCD_DELAY);
writeValue(ALADDIN_DISP_FUNCTION_SET | ALADDIN_DISP_N_FLAG | ALADDIN_DISP_RE_FLAG, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
writeValue(ALADDIN_DISP_SEGRAM_SET, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
writeValue(ALADDIN_DISP_EXT_CONTROL | ALADDIN_DISP_NW_FLAG, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
writeValue(ALADDIN_DISP_FUNCTION_SET | ALADDIN_DISP_N_FLAG, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
writeValue(ALADDIN_DISP_CONTROL | ALADDIN_DISP_D_FLAG, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
writeValue(ALADDIN_DISP_CLEAR, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
writeValue(ALADDIN_DISP_ENTRY_MODE_SET | ALADDIN_DISP_ID_FLAG, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
writeValue(ALADDIN_DISP_HOME, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
utils::ioOutputByte(ALADDIN_REGISTER_LCD_BL, (int)(settingsManager::getLcdBacklight(true) * 1.27f));
utils::ioOutputByte(ALADDIN_REGISTER_LCD_CT, (int)(settingsManager::getLcdContrast(true) * 0.64f));
Sleep(ALADDIN_LCD_DELAY);
}
void displayHD44780Aladdin::printMessage(const char* message)
{
for (int i = 0; i < (int)strlen(message); ++i)
{
writeValue(message[i], ALADDIN_DISP_DAT);
}
}
void displayHD44780Aladdin::setCursorPosition(uint8_t row, uint8_t col)
{
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
uint8_t cursor = ALADDIN_DISP_DDRAM_SET | (col + row_offsets[row]);
writeValue(cursor, ALADDIN_DISP_CMD);
Sleep(ALADDIN_LCD_DELAY);
}
void displayHD44780Aladdin::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = true;
contrast = true;
}
void displayHD44780Aladdin::setBacklight(uint8_t backlight)
{
utils::ioOutputByte(ALADDIN_REGISTER_LCD_BL, (int)(backlight * 1.27f));
Sleep(ALADDIN_LCD_DELAY);
}
void displayHD44780Aladdin::setContrast(uint8_t contrast)
{
utils::ioOutputByte(ALADDIN_REGISTER_LCD_CT, (int)(contrast * 0.64f));
Sleep(ALADDIN_LCD_DELAY);
}
uint8_t displayHD44780Aladdin::getI2cAddressCount()
{
return 0;
}
uint8_t displayHD44780Aladdin::getI2cAddress(uint8_t index)
{
return 0;
}
// Private
void displayHD44780Aladdin::writeValue(uint8_t value, uint8_t command)
{
uint8_t oDataHigh = (value >> 2) & 0x28;
oDataHigh |= (value >> 0) & 0x50;
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, command | oDataHigh);
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, command | ALADDIN_DISP_CON_E | oDataHigh);
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, command | oDataHigh);
Sleep(ALADDIN_LCD_DELAY);
uint8_t oDataLow = (value << 2) & 0x28;
oDataLow |= (value << 4) & 0x50;
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, command | oDataLow);
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, command | ALADDIN_DISP_CON_E | oDataLow);
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, command | oDataLow);
Sleep(ALADDIN_LCD_DELAY);
}

View file

@ -0,0 +1,21 @@
#pragma once
#include "displayDriver.h"
class displayHD44780Aladdin : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
private:
void writeValue(uint8_t value, uint8_t command);
};

View file

@ -0,0 +1,112 @@
#include "displayHD44780LPC.h"
static displayDriver* mInstance = NULL;
displayDriver* displayHD44780LPC::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displayHD44780LPC();
}
return mInstance;
}
bool displayHD44780LPC::isSpi2Par()
{
return false;
}
char* displayHD44780LPC::getModel()
{
return strdup("HD44780");
}
void displayHD44780LPC::init()
{
uint8_t address = getI2cAddress(getAddressValue());
HalWriteSMBusByte(address << 1, 0x80, 0x2a);
HalWriteSMBusByte(address << 1, 0x80, 0x71);
HalWriteSMBusByte(address << 1, 0x40, 0x00);
HalWriteSMBusByte(address << 1, 0x80, 0x28);
HalWriteSMBusByte(address << 1, 0x80, 0x08);
HalWriteSMBusByte(address << 1, 0x80, 0x2a);
HalWriteSMBusByte(address << 1, 0x80, 0x79);
HalWriteSMBusByte(address << 1, 0x80, 0xd5);
HalWriteSMBusByte(address << 1, 0x80, 0x70);
HalWriteSMBusByte(address << 1, 0x80, 0x78);
HalWriteSMBusByte(address << 1, 0x80, 0x08 | 0x01); //0x01 is 3-4 rows
HalWriteSMBusByte(address << 1, 0x80, 0x06);
HalWriteSMBusByte(address << 1, 0x80, 0x72);
HalWriteSMBusByte(address << 1, 0x40, 0x00);
HalWriteSMBusByte(address << 1, 0x80, 0x2a);
HalWriteSMBusByte(address << 1, 0x80, 0x79);
HalWriteSMBusByte(address << 1, 0x80, 0xda);
HalWriteSMBusByte(address << 1, 0x80, 0x10);
HalWriteSMBusByte(address << 1, 0x80, 0xdc);
HalWriteSMBusByte(address << 1, 0x80, 0x00);
HalWriteSMBusByte(address << 1, 0x80, 0x81);
HalWriteSMBusByte(address << 1, 0x80, (uint8_t)(settingsManager::getLcdContrast(true) * 2.55f));
HalWriteSMBusByte(address << 1, 0x80, 0xd9);
HalWriteSMBusByte(address << 1, 0x80, 0xf1);
HalWriteSMBusByte(address << 1, 0x80, 0xdb);
HalWriteSMBusByte(address << 1, 0x80, 0x40);
HalWriteSMBusByte(address << 1, 0x80, 0x78);
HalWriteSMBusByte(address << 1, 0x80, 0x28);
HalWriteSMBusByte(address << 1, 0x80, 0x01);
HalWriteSMBusByte(address << 1, 0x80, 0x80);
HalWriteSMBusByte(address << 1, 0x80, 0x08 | 0x04);
}
void displayHD44780LPC::printMessage(const char* message)
{
uint8_t address = getI2cAddress(getAddressValue());
for (int i = 0; i < (int)strlen(message); ++i)
{
HalWriteSMBusByte(address << 1, 0x40, message[i]);
}
}
void displayHD44780LPC::setCursorPosition(uint8_t row, uint8_t col)
{
uint8_t address = getI2cAddress(getAddressValue());
int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };
uint8_t cursor = 0x80 | (col + row_offsets[row]);
HalWriteSMBusByte(address << 1, 0x80, cursor);
}
void displayHD44780LPC::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = false;
contrast = true;
}
void displayHD44780LPC::setBacklight(uint8_t backlight)
{
}
void displayHD44780LPC::setContrast(uint8_t contrast)
{
uint8_t address = getI2cAddress(getAddressValue());
HalWriteSMBusByte(address << 1, 0x80, 0x2A);
HalWriteSMBusByte(address << 1, 0x80, 0x79);
HalWriteSMBusByte(address << 1, 0x80, 0x81);
HalWriteSMBusByte(address << 1, 0x80, (uint8_t)(contrast * 2.55f));
HalWriteSMBusByte(address << 1, 0x80, 0x78);
HalWriteSMBusByte(address << 1, 0x80, 0x28);
}
uint8_t displayHD44780LPC::getI2cAddressCount()
{
return 16;
}
uint8_t displayHD44780LPC::getI2cAddress(uint8_t index)
{
int lcdAddressArray[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F };
return lcdAddressArray[index];
}

View file

@ -0,0 +1,19 @@
#pragma once
#include "displayDriver.h"
class displayHD44780LPC : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
};

View file

@ -0,0 +1,139 @@
#include "displayHD44780Modxo.h"
static displayDriver* mInstance = NULL;
displayDriver* displayHD44780Modxo::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displayHD44780Modxo();
}
return mInstance;
}
bool displayHD44780Modxo::isSpi2Par()
{
return false;
}
char* displayHD44780Modxo::getModel()
{
return strdup("HD44780");
}
void displayHD44780Modxo::init()
{
uint8_t address = getI2cAddress(getAddressValue());
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_CLK);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, 100);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_I2C);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, address);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_COMMAND_MODE);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x2a);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x71);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_DATA_MODE);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x00);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_COMMAND_MODE);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x28);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x08);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x2a);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x79);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0xd5);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x70);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x78);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x08 | 0x01); //0x01 is 3-4 rows
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x06);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x72);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_DATA_MODE);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x00);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_COMMAND_MODE);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x2a);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x79);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0xda);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x10);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0xdc);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x00);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x81);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, (uint8_t)(settingsManager::getLcdContrast(true) * 2.55f));
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0xd9);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0xf1);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0xdb);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x40);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x78);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x28);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x01);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x80);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x08 | 0x04);
}
void displayHD44780Modxo::printMessage(const char* message)
{
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_DATA_MODE);
for (int i = 0; i < (int)strlen(message); ++i)
{
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, message[i]);
}
}
void displayHD44780Modxo::setCursorPosition(uint8_t row, uint8_t col)
{
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_COMMAND_MODE);
int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };
uint8_t cursor = 0x80 | (col + row_offsets[row]);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, cursor);
}
void displayHD44780Modxo::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = false;
contrast = true;
}
void displayHD44780Modxo::setBacklight(uint8_t contrast)
{
}
void displayHD44780Modxo::setContrast(uint8_t contrast)
{
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_COMMAND_MODE);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x2A);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x79);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x81);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, (uint8_t)(contrast * 2.55f));
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x78);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, 0x28);
}
uint8_t displayHD44780Modxo::getI2cAddressCount()
{
return 16;
}
uint8_t displayHD44780Modxo::getI2cAddress(uint8_t index)
{
int lcdAddressArray[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F };
return lcdAddressArray[index];
}

View file

@ -0,0 +1,19 @@
#pragma once
#include "displayDriver.h"
class displayHD44780Modxo : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
};

View file

@ -0,0 +1,116 @@
#include "displayHD44780Xecuter.h"
static displayDriver* mInstance = NULL;
displayDriver* displayHD44780Xecuter::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displayHD44780Xecuter();
}
return mInstance;
}
bool displayHD44780Xecuter::isSpi2Par()
{
return false;
}
char* displayHD44780Xecuter::getModel()
{
return strdup("HD44780");
}
void displayHD44780Xecuter::init()
{
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_DAT, 0);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_CMD, 0);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_DIR_DAT, 0xFF);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_DIR_CMD, 0x07);
writeValue(XECUTER_DISP_FUNCTION_SET | XECUTER_DISP_DL_FLAG, XECUTER_DISP_INI);
Sleep(XECUTER_LCD_DELAY);
writeValue(XECUTER_DISP_FUNCTION_SET | XECUTER_DISP_DL_FLAG, XECUTER_DISP_INI);
Sleep(XECUTER_LCD_DELAY);
writeValue(XECUTER_DISP_FUNCTION_SET | XECUTER_DISP_DL_FLAG, XECUTER_DISP_INI);
Sleep(XECUTER_LCD_DELAY);
writeValue(XECUTER_DISP_FUNCTION_SET, XECUTER_DISP_INI);
Sleep(XECUTER_LCD_DELAY);
writeValue(XECUTER_DISP_FUNCTION_SET | XECUTER_DISP_N_FLAG, XECUTER_DISP_CMD);
Sleep(XECUTER_LCD_DELAY);
writeValue(XECUTER_DISP_CONTROL | XECUTER_DISP_D_FLAG, XECUTER_DISP_CMD);
Sleep(XECUTER_LCD_DELAY);
writeValue(XECUTER_DISP_CLEAR, XECUTER_DISP_CMD);
Sleep(XECUTER_LCD_DELAY);
writeValue(XECUTER_DISP_ENTRY_MODE_SET | XECUTER_DISP_ID_FLAG,XECUTER_DISP_CMD);
Sleep(XECUTER_LCD_DELAY);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_LIGHT, (int)(settingsManager::getLcdBacklight(true) * 1.27f));
Sleep(XECUTER_LCD_DELAY);
}
void displayHD44780Xecuter::printMessage(const char* message)
{
for (int i = 0; i < (int)strlen(message); ++i)
{
writeValue(message[i], XECUTER_DISP_DAT);
}
}
void displayHD44780Xecuter::setCursorPosition(uint8_t row, uint8_t col)
{
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
uint8_t cursor = XECUTER_DISP_DDRAM_SET | (col + row_offsets[row]);
writeValue(cursor, XECUTER_DISP_CMD);
Sleep(XECUTER_LCD_DELAY);
}
void displayHD44780Xecuter::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = true;
contrast = false;
}
void displayHD44780Xecuter::setBacklight(uint8_t backlight)
{
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_LIGHT, (int)(backlight * 1.27f));
Sleep(XECUTER_LCD_DELAY);
}
void displayHD44780Xecuter::setContrast(uint8_t contrast)
{
}
uint8_t displayHD44780Xecuter::getI2cAddressCount()
{
return 0;
}
uint8_t displayHD44780Xecuter::getI2cAddress(uint8_t index)
{
return 0;
}
// Private
void displayHD44780Xecuter::writeValue(uint8_t value, uint8_t command)
{
uint8_t cmd = 0;
if (command & XECUTER_DISP_DAT)
{
cmd |= XECUTER_DISP_CON_RS;
}
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_DAT, value & 0xF0);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_CMD, cmd);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_CMD, XECUTER_DISP_CON_E | cmd);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_CMD, cmd);
if ((command & XECUTER_DISP_INI) == 0)
{
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_DAT, (value << 4) & 0xF0);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_CMD, cmd);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_CMD, XECUTER_DISP_CON_E | cmd);
utils::ioOutputByte(XECUTER_REGISTER_DISP_O_CMD, cmd);
}
}

View file

@ -0,0 +1,21 @@
#pragma once
#include "displayDriver.h"
class displayHD44780Xecuter : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
private:
void writeValue(uint8_t value, uint8_t command);
};

View file

@ -0,0 +1,130 @@
#include "displayLCDXXXXLPC.h"
static displayDriver* mInstance = NULL;
displayDriver* displayLCDXXXXLPC::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displayLCDXXXXLPC();
}
return mInstance;
}
bool displayLCDXXXXLPC::isSpi2Par()
{
return false;
}
char* displayLCDXXXXLPC::getModel()
{
return strdup("LCDXXXX");
}
void displayLCDXXXXLPC::init()
{
uint8_t address = getI2cAddress(getAddressValue());
write4bits(address, 0x03 << 4);
utils::uSleep(4500);
write4bits(address, 0x03 << 4);
utils::uSleep(4500);
write4bits(address, 0x03 << 4);
utils::uSleep(4500);
write4bits(address, 0x02 << 4);
command(address, 0x20 | 0x08);
command(address, 0x08 | 0x04);
command(address, 0x01);
utils::uSleep(2000);
command(address, 0x04 | 0x02);
command(address, 0x02);
utils::uSleep(2000);
}
void displayLCDXXXXLPC::printMessage(const char* message)
{
uint8_t address = getI2cAddress(getAddressValue());
for (int i = 0; i < (int)strlen(message); ++i)
{
writeChar(address, message[i]);
}
}
void displayLCDXXXXLPC::setCursorPosition(uint8_t row, uint8_t col)
{
uint8_t address = getI2cAddress(getAddressValue());
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
uint8_t cursor = 0x80 | (col + row_offsets[row]);
command(address, cursor);
}
void displayLCDXXXXLPC::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = false;
contrast = false;
}
void displayLCDXXXXLPC::setBacklight(uint8_t backlight)
{
}
void displayLCDXXXXLPC::setContrast(uint8_t contrast)
{
}
uint8_t displayLCDXXXXLPC::getI2cAddressCount()
{
return 16;
}
uint8_t displayLCDXXXXLPC::getI2cAddress(uint8_t index)
{
int lcdAddressArray[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F };
return lcdAddressArray[index];
}
//Private
void displayLCDXXXXLPC::expanderWrite(uint8_t address, uint8_t value)
{
uint8_t bl = 0x08;
HalWriteSMBusValue(address << 1, 0, 0xff, (value | bl));
}
void displayLCDXXXXLPC::pulseEnable(uint8_t address, uint8_t value)
{
uint8_t En = 0x04;
expanderWrite(address, value | En);
utils::uSleep(1);
expanderWrite(address, value & ~En);
utils::uSleep(50);
}
void displayLCDXXXXLPC::write4bits(uint8_t address, uint8_t value)
{
expanderWrite(address, value);
pulseEnable(address, value);
}
void displayLCDXXXXLPC::send(uint8_t address, uint8_t value, uint8_t mode)
{
uint8_t highnib = value & 0xf0;
uint8_t lownib = (value << 4) & 0xf0;
write4bits(address, (highnib) | mode);
write4bits(address, (lownib) | mode);
}
void displayLCDXXXXLPC::command(uint8_t address, uint8_t value)
{
send(address, value, 0);
}
void displayLCDXXXXLPC::writeChar(uint8_t address, uint8_t value)
{
send(address, value, 1);
}

View file

@ -0,0 +1,26 @@
#pragma once
#include "displayDriver.h"
class displayLCDXXXXLPC : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
private:
void expanderWrite(uint8_t address, uint8_t value);
void pulseEnable(uint8_t address, uint8_t value);
void write4bits(uint8_t address, uint8_t value);
void send(uint8_t address, uint8_t value, uint8_t mode);
void command(uint8_t address, uint8_t value);
void writeChar(uint8_t address, uint8_t value);
};

View file

@ -0,0 +1,134 @@
#include "displayLCDXXXXModxo.h"
static displayDriver* mInstance = NULL;
displayDriver* displayLCDXXXXModxo::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displayLCDXXXXModxo();
}
return mInstance;
}
bool displayLCDXXXXModxo::isSpi2Par()
{
return false;
}
char* displayLCDXXXXModxo::getModel()
{
return strdup("LCDXXXX");
}
void displayLCDXXXXModxo::init()
{
uint8_t address = getI2cAddress(getAddressValue());
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_CLK);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, 100);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_REMOVE_I2C_PREFIX);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_I2C);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, address);
utils::uSleep(2000);
write4bits(0x03 << 4);
utils::uSleep(4500);
write4bits(0x03 << 4);
utils::uSleep(4500);
write4bits(0x03 << 4);
utils::uSleep(4500);
write4bits(0x02 << 4);
command(0x20 | 0x08);
command(0x08 | 0x04);
command(0x01);
utils::uSleep(2000);
command(0x04 | 0x02);
command(0x02);
utils::uSleep(2000);
}
void displayLCDXXXXModxo::printMessage(const char* message)
{
for (int i = 0; i < (int)strlen(message); ++i)
{
writeChar(message[i]);
}
}
void displayLCDXXXXModxo::setCursorPosition(uint8_t row, uint8_t col)
{
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
uint8_t cursor = 0x80 | (col + row_offsets[row]);
command(cursor);
}
void displayLCDXXXXModxo::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = false;
contrast = false;
}
void displayLCDXXXXModxo::setBacklight(uint8_t backlight)
{
}
void displayLCDXXXXModxo::setContrast(uint8_t contrast)
{
}
uint8_t displayLCDXXXXModxo::getI2cAddressCount()
{
return 16;
}
uint8_t displayLCDXXXXModxo::getI2cAddress(uint8_t index)
{
int lcdAddressArray[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F };
return lcdAddressArray[index];
}
//Private
void displayLCDXXXXModxo::expanderWrite(uint8_t value)
{
uint8_t bl = 0x08;
uint8_t data = (uint8_t)(value | bl);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, data);
}
void displayLCDXXXXModxo::pulseEnable(uint8_t value)
{
uint8_t En = 0x04;
expanderWrite(value | En);
utils::uSleep(1);
expanderWrite(value & ~En);
utils::uSleep(50);
}
void displayLCDXXXXModxo::write4bits(uint8_t value)
{
expanderWrite(value);
pulseEnable(value);
}
void displayLCDXXXXModxo::send(uint8_t value, uint8_t mode)
{
uint8_t highnib = value & 0xf0;
uint8_t lownib = (value << 4) & 0xf0;
write4bits((highnib) | mode);
write4bits((lownib) | mode);
}
void displayLCDXXXXModxo::command(uint8_t value)
{
send(value, 0);
}
void displayLCDXXXXModxo::writeChar(uint8_t value)
{
send(value, 1);
}

View file

@ -0,0 +1,26 @@
#pragma once
#include "displayDriver.h"
class displayLCDXXXXModxo : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
private:
void expanderWrite(uint8_t value);
void pulseEnable(uint8_t value);
void write4bits(uint8_t value);
void send(uint8_t val, uint8_t mode);
void command(uint8_t value);
void writeChar(uint8_t value);
};

View file

@ -0,0 +1,135 @@
#include "displaySPI2PARAladdin.h"
static displayDriver* mInstance = NULL;
displayDriver* displaySPI2PARAladdin::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displaySPI2PARAladdin();
}
return mInstance;
}
bool displaySPI2PARAladdin::isSpi2Par()
{
return true;
}
char* displaySPI2PARAladdin::getModel()
{
return strdup("SPI2PAR");
}
void displaySPI2PARAladdin::init()
{
utils::ioOutputByte(ALADDIN_REGISTER_IO, ALADDIN_DISP_EN5V);
writeValue(SPI2PAR_SHOWDISPLAY);
utils::uSleep(2000);
writeValue(SPI2PAR_FORMFEED);
utils::uSleep(2000);
writeValue(SPI2PAR_HIDECURSOR);
utils::uSleep(2000);
writeValue(SPI2PAR_SCROLLOFF);
utils::uSleep(2000);
writeValue(SPI2PAR_WRAPOFF);
utils::uSleep(2000);
writeValue(SPI2PAR_SETBACKLIGHT);
writeValue(settingsManager::getLcdBacklight(true));
utils::uSleep(2000);
writeValue(SPI2PAR_SETCONTRAST);
writeValue(settingsManager::getLcdContrast(true));
utils::uSleep(2000);
}
void displaySPI2PARAladdin::printMessage(const char* message)
{
for (int i = 0; i < (int)strlen(message); ++i)
{
writeValue(message[i]);
utils::uSleep(2000);
}
}
void displaySPI2PARAladdin::setCursorPosition(uint8_t row, uint8_t col)
{
writeValue(SPI2PAR_SETCURSORPOSITION);
writeValue(col);
writeValue(row);
utils::uSleep(2000);
}
void displaySPI2PARAladdin::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = true;
contrast = true;
}
void displaySPI2PARAladdin::setBacklight(uint8_t backlight)
{
writeValue(SPI2PAR_SETBACKLIGHT);
writeValue(backlight);
utils::uSleep(2000);
}
void displaySPI2PARAladdin::setContrast(uint8_t contrast)
{
writeValue(SPI2PAR_SETCONTRAST);
writeValue(contrast);
utils::uSleep(2000);
}
uint8_t displaySPI2PARAladdin::getI2cAddressCount()
{
return 0;
}
uint8_t displaySPI2PARAladdin::getI2cAddress(uint8_t index)
{
return 0;
}
// Private
void displaySPI2PARAladdin::writeValue(uint8_t value)
{
uint8_t spi = getSpiValue();
spi |= ALADDIN_SPI_CLK_BIT;
spi &= ~ALADDIN_SPI_CS_BIT;
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, spi);
utils::uSleep(0x1);
uint8_t i = 8;
do
{
if ((value & 0x80) > 0)
{
spi |= ALADDIN_SPI_MOSI_BIT;
}
else
{
spi &= ~ALADDIN_SPI_MOSI_BIT;
}
spi &= ~ALADDIN_SPI_CLK_BIT;
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, spi);
utils::uSleep(0x1);
spi |= ALADDIN_SPI_CLK_BIT;
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, spi);
utils::uSleep(0x1);
value = value << 1;
i--;
}
while (i > 0);
spi |= ALADDIN_SPI_CS_BIT;
utils::ioOutputByte(ALADDIN_REGISTER_DISP_O, spi);
utils::uSleep(0x1);
setSpiValue(spi);
}

View file

@ -0,0 +1,27 @@
#pragma once
#include "displayDriver.h"
//D7 = CLK
//D6 = MOSI
//D5 = CS
//WriteToIO(XBLAST_IO, (GenPurposeIOs.GPO3 << 7) | (GenPurposeIOs.GPO2 << 6) | (GenPurposeIOs.GPO1 << 5) | (GenPurposeIOs.GPO0 << 4) | GenPurposeIOs.EN_5V);
class displaySPI2PARAladdin : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
private:
void writeValue(uint8_t value);
};

View file

@ -0,0 +1,97 @@
#include "displaySPI2PARModxo.h"
static displayDriver* mInstance = NULL;
displayDriver* displaySPI2PARModxo::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displaySPI2PARModxo();
}
return mInstance;
}
bool displaySPI2PARModxo::isSpi2Par()
{
return true;
}
char* displaySPI2PARModxo::getModel()
{
return strdup("SPI2PAR");
}
void displaySPI2PARModxo::init()
{
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_CLK);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, 10);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SET_SPI_MODE);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, 3);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, MODXO_LCD_SPI);
utils::ioOutputByte(MODXO_REGISTER_LCD_COMMAND, 0);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_SHOWDISPLAY);
utils::uSleep(2000);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_FORMFEED);
utils::uSleep(2000);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_HIDECURSOR);
utils::uSleep(2000);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_SCROLLOFF);
utils::uSleep(2000);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_WRAPOFF);
utils::uSleep(2000);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_SETBACKLIGHT);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, settingsManager::getLcdBacklight(true));
utils::uSleep(2000);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_SETCONTRAST);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, settingsManager::getLcdContrast(true));
utils::uSleep(2000);
}
void displaySPI2PARModxo::printMessage(const char* message)
{
for (int i = 0; i < (int)strlen(message); ++i)
{
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, message[i]);
utils::uSleep(2000);
}
}
void displaySPI2PARModxo::setCursorPosition(uint8_t row, uint8_t col)
{
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_SETCURSORPOSITION);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, col);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, row);
utils::uSleep(2000);
}
void displaySPI2PARModxo::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = true;
contrast = true;
}
void displaySPI2PARModxo::setBacklight(uint8_t backlight)
{
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_SETBACKLIGHT);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, backlight);
utils::uSleep(2000);
}
void displaySPI2PARModxo::setContrast(uint8_t contrast)
{
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, SPI2PAR_SETCONTRAST);
utils::ioOutputByte(MODXO_REGISTER_LCD_DATA, contrast);
utils::uSleep(2000);
}
uint8_t displaySPI2PARModxo::getI2cAddressCount()
{
return 0;
}
uint8_t displaySPI2PARModxo::getI2cAddress(uint8_t index)
{
return 0;
}

View file

@ -0,0 +1,19 @@
#pragma once
#include "displayDriver.h"
class displaySPI2PARModxo : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
};

View file

@ -0,0 +1,136 @@
#include "displaySPI2PARSmartxx.h"
static displayDriver* mInstance = NULL;
displayDriver* displaySPI2PARSmartxx::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displaySPI2PARSmartxx();
}
return mInstance;
}
bool displaySPI2PARSmartxx::isSpi2Par()
{
return true;
}
char* displaySPI2PARSmartxx::getModel()
{
return strdup("SPI2PAR");
}
void displaySPI2PARSmartxx::init()
{
writeValue(SPI2PAR_SHOWDISPLAY);
utils::uSleep(2000);
writeValue(SPI2PAR_FORMFEED);
utils::uSleep(2000);
writeValue(SPI2PAR_HIDECURSOR);
utils::uSleep(2000);
writeValue(SPI2PAR_SCROLLOFF);
utils::uSleep(2000);
writeValue(SPI2PAR_WRAPOFF);
utils::uSleep(2000);
writeValue(SPI2PAR_SETBACKLIGHT);
writeValue(settingsManager::getLcdBacklight(true));
utils::uSleep(2000);
writeValue(SPI2PAR_SETCONTRAST);
writeValue(settingsManager::getLcdContrast(true));
utils::uSleep(2000);
}
void displaySPI2PARSmartxx::printMessage(const char* message)
{
for (int i = 0; i < (int)strlen(message); ++i)
{
writeValue(message[i]);
utils::uSleep(2000);
}
}
void displaySPI2PARSmartxx::setCursorPosition(uint8_t row, uint8_t col)
{
writeValue(SPI2PAR_SETCURSORPOSITION);
writeValue(col);
writeValue(row);
utils::uSleep(2000);
}
void displaySPI2PARSmartxx::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = false;
backlight = true;
contrast = true;
}
void displaySPI2PARSmartxx::setBacklight(uint8_t backlight)
{
writeValue(SPI2PAR_SETBACKLIGHT);
writeValue(backlight);
utils::uSleep(2000);
}
void displaySPI2PARSmartxx::setContrast(uint8_t contrast)
{
writeValue(SPI2PAR_SETCONTRAST);
writeValue(contrast);
utils::uSleep(2000);
}
uint8_t displaySPI2PARSmartxx::getI2cAddressCount()
{
return 0;
}
uint8_t displaySPI2PARSmartxx::getI2cAddress(uint8_t index)
{
return 0;
}
// Private
void displaySPI2PARSmartxx::writeValue(uint8_t value)
{
uint8_t spi = getSpiValue();
uint8_t bank = getBankValue();
spi |= SMARTXX_SPI_CLK_BIT;
spi &= ~SMARTXX_SPI_CS_BIT;
utils::ioOutputByte(SMARTXX_REGISTER_BANKING, (spi | bank));
utils::uSleep(0x1c);
uint8_t i = 8;
do
{
utils::uSleep(0x1c);
if ((value & 0x80) > 0)
{
spi |= SMARTXX_SPI_MOSI_BIT;
}
else
{
spi &= ~SMARTXX_SPI_MOSI_BIT;
}
utils::ioOutputByte(SMARTXX_REGISTER_BANKING, (spi | bank));
spi &= ~SMARTXX_SPI_CLK_BIT;
utils::ioOutputByte(SMARTXX_REGISTER_BANKING, (spi | bank));
utils::uSleep(0x1c);
spi |= SMARTXX_SPI_CLK_BIT;
utils::ioOutputByte(SMARTXX_REGISTER_BANKING, (spi | bank));
value = value << 1;
i--;
}
while (i > 0);
spi |= SMARTXX_SPI_CS_BIT;
utils::ioOutputByte(SMARTXX_REGISTER_BANKING, (spi | bank));
utils::uSleep(0x1c);
setSpiValue(spi);
}

View file

@ -0,0 +1,21 @@
#pragma once
#include "displayDriver.h"
class displaySPI2PARSmartxx : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
private:
void writeValue(uint8_t value);
};

View file

@ -0,0 +1,131 @@
#include "displaySPI2PARXenium.h"
static displayDriver* mInstance = NULL;
displayDriver* displaySPI2PARXenium::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displaySPI2PARXenium();
}
return mInstance;
}
bool displaySPI2PARXenium::isSpi2Par()
{
return true;
}
char* displaySPI2PARXenium::getModel()
{
return strdup("SPI2PAR");
}
void displaySPI2PARXenium::init()
{
writeValue(SPI2PAR_SHOWDISPLAY);
utils::uSleep(2000);
writeValue(SPI2PAR_FORMFEED);
utils::uSleep(2000);
writeValue(SPI2PAR_HIDECURSOR);
utils::uSleep(2000);
writeValue(SPI2PAR_SCROLLOFF);
utils::uSleep(2000);
writeValue(SPI2PAR_WRAPOFF);
utils::uSleep(2000);
writeValue(SPI2PAR_SETBACKLIGHT);
writeValue(settingsManager::getLcdBacklight(true));
utils::uSleep(2000);
writeValue(SPI2PAR_SETCONTRAST);
writeValue(settingsManager::getLcdContrast(true));
utils::uSleep(2000);
}
void displaySPI2PARXenium::printMessage(const char* message)
{
for (int i = 0; i < (int)strlen(message); ++i)
{
writeValue(message[i]);
utils::uSleep(2000);
}
}
void displaySPI2PARXenium::setCursorPosition(uint8_t row, uint8_t col)
{
writeValue(SPI2PAR_SETCURSORPOSITION);
writeValue(col);
writeValue(row);
utils::uSleep(2000);
}
void displaySPI2PARXenium::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = true;
backlight = true;
contrast = true;
}
void displaySPI2PARXenium::setBacklight(uint8_t backlight)
{
writeValue(SPI2PAR_SETBACKLIGHT);
writeValue(backlight);
utils::uSleep(2000);
}
void displaySPI2PARXenium::setContrast(uint8_t contrast)
{
writeValue(SPI2PAR_SETCONTRAST);
writeValue(contrast);
utils::uSleep(2000);
}
uint8_t displaySPI2PARXenium::getI2cAddressCount()
{
return 0;
}
uint8_t displaySPI2PARXenium::getI2cAddress(uint8_t index)
{
return 0;
}
// Private
void displaySPI2PARXenium::writeValue(uint8_t value)
{
uint8_t spi = getSpiValue();
uint8_t bank = getBankValue();
spi |= XENIUM_SPI_CLK_BIT;
utils::ioOutputByte(XENIUM_REGISTER_BANKING, (spi | bank));
utils::uSleep(0x1c);
uint8_t i = 8;
do
{
utils::uSleep(0x1c);
if ((value & 0x80) > 0)
{
spi |= XENIUM_SPI_MOSI_BIT;
}
else
{
spi &= ~XENIUM_SPI_MOSI_BIT;
}
utils::ioOutputByte(XENIUM_REGISTER_BANKING, (spi | bank));
spi &= ~XENIUM_SPI_CLK_BIT;
utils::ioOutputByte(XENIUM_REGISTER_BANKING, (spi | bank));
utils::uSleep(0x1c);
spi |= XENIUM_SPI_CLK_BIT;
utils::ioOutputByte(XENIUM_REGISTER_BANKING, (spi | bank));
value = value << 1;
i--;
}
while (i > 0);
setSpiValue(spi);
}

View file

@ -0,0 +1,21 @@
#pragma once
#include "displayDriver.h"
class displaySPI2PARXenium : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
private:
void writeValue(uint8_t value);
};

View file

@ -0,0 +1,131 @@
#include "displaySPI2PARXtremium.h"
static displayDriver* mInstance = NULL;
displayDriver* displaySPI2PARXtremium::getInstance()
{
if (mInstance == NULL)
{
mInstance = new displaySPI2PARXtremium();
}
return mInstance;
}
bool displaySPI2PARXtremium::isSpi2Par()
{
return true;
}
char* displaySPI2PARXtremium::getModel()
{
return strdup("SPI2PAR");
}
void displaySPI2PARXtremium::init()
{
writeValue(SPI2PAR_SHOWDISPLAY);
utils::uSleep(2000);
writeValue(SPI2PAR_FORMFEED);
utils::uSleep(2000);
writeValue(SPI2PAR_HIDECURSOR);
utils::uSleep(2000);
writeValue(SPI2PAR_SCROLLOFF);
utils::uSleep(2000);
writeValue(SPI2PAR_WRAPOFF);
utils::uSleep(2000);
writeValue(SPI2PAR_SETBACKLIGHT);
writeValue(settingsManager::getLcdBacklight(true));
utils::uSleep(2000);
writeValue(SPI2PAR_SETCONTRAST);
writeValue(settingsManager::getLcdContrast(true));
utils::uSleep(2000);
}
void displaySPI2PARXtremium::printMessage(const char* message)
{
for (int i = 0; i < (int)strlen(message); ++i)
{
writeValue(message[i]);
utils::uSleep(2000);
}
}
void displaySPI2PARXtremium::setCursorPosition(uint8_t row, uint8_t col)
{
writeValue(SPI2PAR_SETCURSORPOSITION);
writeValue(col);
writeValue(row);
utils::uSleep(2000);
}
void displaySPI2PARXtremium::getSupport(bool& lcdInfo, bool& backlight, bool& contrast)
{
lcdInfo = true;
backlight = true;
contrast = true;
}
void displaySPI2PARXtremium::setBacklight(uint8_t backlight)
{
writeValue(SPI2PAR_SETBACKLIGHT);
writeValue(backlight);
utils::uSleep(2000);
}
void displaySPI2PARXtremium::setContrast(uint8_t contrast)
{
writeValue(SPI2PAR_SETCONTRAST);
writeValue(contrast);
utils::uSleep(2000);
}
uint8_t displaySPI2PARXtremium::getI2cAddressCount()
{
return 0;
}
uint8_t displaySPI2PARXtremium::getI2cAddress(uint8_t index)
{
return 0;
}
// Private
void displaySPI2PARXtremium::writeValue(uint8_t value)
{
uint8_t spi = getSpiValue();
uint8_t bank = getBankValue();
spi |= XTREMIUM_SPI_CLK_BIT;
utils::ioOutputByte(XTREMIUM_REGISTER_BANKING, (spi | bank));
utils::uSleep(0x1c);
uint8_t i = 8;
do
{
utils::uSleep(0x1c);
if ((value & 0x80) > 0)
{
spi |= XTREMIUM_SPI_MOSI_BIT;
}
else
{
spi &= ~XTREMIUM_SPI_MOSI_BIT;
}
utils::ioOutputByte(XTREMIUM_REGISTER_BANKING, (spi | bank));
spi &= ~XTREMIUM_SPI_CLK_BIT;
utils::ioOutputByte(XTREMIUM_REGISTER_BANKING, (spi | bank));
utils::uSleep(0x1c);
spi |= XTREMIUM_SPI_CLK_BIT;
utils::ioOutputByte(XTREMIUM_REGISTER_BANKING, (spi | bank));
value = value << 1;
i--;
}
while (i > 0);
setSpiValue(spi);
}

View file

@ -0,0 +1,21 @@
#pragma once
#include "displayDriver.h"
class displaySPI2PARXtremium : displayDriver
{
public:
static displayDriver* getInstance();
bool isSpi2Par();
char* getModel();
void init();
void printMessage(const char* message);
void setCursorPosition(uint8_t row, uint8_t col);
void getSupport(bool& lcdInfo, bool& backlight, bool& contrast);
void setBacklight(uint8_t backlight);
void setContrast(uint8_t contrast);
uint8_t getI2cAddressCount();
uint8_t getI2cAddress(uint8_t index);
private:
void writeValue(uint8_t value);
};

View file

@ -0,0 +1,373 @@
#include "PEProcess.h"
#include "PESymbol.h"
#include "..\utils.h"
#include "..\fileSystem.h"
#include "..\xboxInternals.h"
#include <malloc.h>
#include <fstream>
PEObject_t* PEProcess::PE_Alloc()
{
PEObject_t* PEObject = (PEObject_t*)malloc(sizeof(PEObject_t));
if (!PEObject)
{
return NULL;
}
PEObject->HModule = NULL;
PEObject->DOSHeader = NULL;
PEObject->NTHeader = NULL;
PEObject->SectionHeader = NULL;
PEObject->ExportTable = NULL;
PEObject->ImportTable = NULL;
PEObject->ImageSize = 0;
return PEObject;
}
void PEProcess::PE_Free(PEObject_t* PEObject)
{
if (PEObject->HModule != NULL)
{
_aligned_free(PEObject->HModule);
}
PEObject->HModule = NULL;
PEObject->DOSHeader = NULL;
PEObject->NTHeader = NULL;
PEObject->SectionHeader = NULL;
PEObject->ExportTable = NULL;
PEObject->ImportTable = NULL;
PEObject->ImageSize = 0;
free(PEObject);
}
PEObject_t* PEProcess::PE_Load(const char* filepath)
{
std::ifstream file(filepath, std::ios::binary);
if (!file.is_open())
{
utils::debugPrint("PE Loader: Unable to open image file.\n");
return NULL;
}
char* filename = fileSystem::getFileName(filepath);
PEObject_t* PEObject = NULL;
PEObject = PE_Alloc();
if (PEObject == NULL)
{
utils::debugPrint("PE Loader [%s]: Unable to allocate context.\n", filename);
file.close();
return NULL;
}
file.seekg(0, std::ios::end);
std::streampos fileSize = file.tellg();
file.seekg(0, std::ios::beg);
PEObject->ImageSize = fileSize;
PEObject->DOSHeader = (XIMAGE_DOS_HEADER*)malloc(sizeof(XIMAGE_DOS_HEADER));
if (PEObject->DOSHeader == NULL) {
utils::debugPrint("PE Loader [%s]: \n\tUnable to allocate memory for DOSHeader [0x%08x bytes].\n", filename, sizeof(XIMAGE_DOS_HEADER));
free(PEObject);
file.close();
return NULL;
}
file.read((char*)PEObject->DOSHeader, sizeof(XIMAGE_DOS_HEADER));
if (PEObject->DOSHeader->e_magic != IMAGE_DOS_SIGNATURE) {
utils::debugPrint("PE Loader [%s]: \n\tInvalid DOS signature 0x%04x.\n", filename, PEObject->DOSHeader->e_magic);
free(PEObject->DOSHeader);
free(PEObject);
file.close();
return NULL;
}
PEObject->NTHeader = (XIMAGE_NT_HEADERS32*)malloc(sizeof(XIMAGE_NT_HEADERS32));
if (PEObject->NTHeader == NULL) {
utils::debugPrint("PE Loader [%s]: \n\tUnable to allocate memory for NTHeader [0x%08x bytes].\n", filename, sizeof(XIMAGE_NT_HEADERS32));
free(PEObject->DOSHeader);
free(PEObject);
file.close();
return NULL;
}
file.seekg(PEObject->DOSHeader->e_lfanew, std::ios::beg);
file.read((char*)PEObject->NTHeader, sizeof(XIMAGE_NT_HEADERS32));
if (PEObject->NTHeader->Signature != IMAGE_NT_SIGNATURE) {
utils::debugPrint("PE Loader [%s]: \n\tInvalid NT signature 0x%08x.\n", filename, PEObject->NTHeader->Signature);
free(PEObject->NTHeader);
free(PEObject->DOSHeader);
free(PEObject);
file.close();
return NULL;
}
PEObject->HModule = _aligned_malloc(PEObject->NTHeader->OptionalHeader.SizeOfImage, 0x10000);
if (PEObject->HModule == NULL) {
utils::debugPrint("PE Loader [%s]: \n\tUnable to allocate aligned memory for HModule [0x%08x bytes].\n", filename, PEObject->NTHeader->OptionalHeader.SizeOfImage);
free(PEObject->NTHeader);
free(PEObject->DOSHeader);
free(PEObject);
file.close();
return NULL;
}
memset(PEObject->HModule, 0, PEObject->NTHeader->OptionalHeader.SizeOfImage);
file.seekg(0, std::ios::beg);
file.read((char*)PEObject->HModule, PEObject->NTHeader->OptionalHeader.SizeOfHeaders);
utils::debugPrint("PE Loader [%s]: Image 0x%08x.\n", filename, (uint32_t)PEObject->HModule);
free(PEObject->DOSHeader);
PEObject->DOSHeader = (XIMAGE_DOS_HEADER*)PEObject->HModule;
free(PEObject->NTHeader);
PEObject->NTHeader = (XIMAGE_NT_HEADERS32*)((char*)PEObject->HModule + PEObject->DOSHeader->e_lfanew);
if (PEObject->NTHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
{
utils::debugPrint("PE Loader [%s]: \n\tInvalid archetecture 0x%04x.\n", filename, PEObject->NTHeader->FileHeader.Machine);
}
if ((PEObject->NTHeader->FileHeader.Characteristics & IMAGE_FILE_DLL) == 0)
{
utils::debugPrint("PE Loader [%s]: \n\tFile is not a DLL.\n", filename);
}
//This was changed to int64
PEObject->SectionHeader = (XIMAGE_SECTION_HEADER*)(((uint32_t)&PEObject->NTHeader->OptionalHeader) + PEObject->NTHeader->FileHeader.SizeOfOptionalHeader);
for (int i = 0; i < PEObject->NTHeader->FileHeader.NumberOfSections; i++)
{
utils::debugPrint("PE Loader [%s]: Section header found '%s'.\n", filename, PEObject->SectionHeader[i].Name);
if (PEObject->SectionHeader[i].SizeOfRawData)
{
file.seekg(PEObject->SectionHeader[i].PointerToRawData, std::ios::beg);
file.read(((char*)PEObject->HModule) + PEObject->SectionHeader[i].VirtualAddress, PEObject->SectionHeader[i].SizeOfRawData);
}
}
PE_Export(PEObject, filename);
PE_Import(PEObject, filename);
PE_BaseReloc(PEObject, filename);
file.close();
return PEObject;
}
int32_t PEProcess::PE_Export(PEObject_t* PEObject, const char* library)
{
uint32_t VirtualAddress = PEObject->NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
if (VirtualAddress == 0)
{
return 0;
}
PEObject->ExportTable = (XIMAGE_EXPORT_DIRECTORY*)((char*)PEObject->HModule + VirtualAddress);
uint32_t* ExportNameTable = (uint32_t*)((char*)PEObject->HModule + PEObject->ExportTable->AddressOfNames);
uint16_t* ExportOrdinalTable = (uint16_t*)((char*)PEObject->HModule + PEObject->ExportTable->AddressOfNameOrdinals);
uint32_t* ExportAddressTable = (uint32_t*)((char*)PEObject->HModule + PEObject->ExportTable->AddressOfFunctions);
for (uint32_t x = 0; x < PEObject->ExportTable->NumberOfNames; x++) {
char* SymStr = (char*)PEObject->HModule + ExportNameTable[x];
uint32_t* SymVal = (uint32_t*)((char*)PEObject->HModule + ExportAddressTable[ExportOrdinalTable[x]]);
PESymbol::AddSymbol(library, SymStr, ExportOrdinalTable[x], SymVal);
}
return 1;
}
int32_t PEProcess::PE_Import(PEObject_t* PEObject, const char* filename)
{
uint32_t VirtualAddress = PEObject->NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
if (VirtualAddress == 0) return 0;
PEObject->ImportTable = (XIMAGE_IMPORT_DIRECTORY*)((char*)PEObject->HModule + VirtualAddress);
for (uint32_t x = 0; PEObject->ImportTable[x].ImportLookupTable != 0; x++) {
uint32_t* ILT = (uint32_t*)((char*)PEObject->HModule + PEObject->ImportTable[x].ImportLookupTable);
uint32_t* IAT = (uint32_t*)((char*)PEObject->HModule + PEObject->ImportTable[x].ImportAddressTable);
utils::debugPrint("PE Loader [%s]: \n\tDLL Reference: %s\n", filename, (char*)PEObject->HModule+PEObject->ImportTable[x].Name);
for (uint32_t y = 0; ILT[y] != 0; y++) {
if (ILT[y] & IMAGE_ORDINAL_FLAG32) {
IAT[y] = PESymbol::ResolveImportByOrdinal(filename, (char*)PEObject->HModule + PEObject->ImportTable[x].Name, ILT[y] & (~IMAGE_ORDINAL_FLAG32));
utils::debugPrint("\t\tImport by Ordinal 0x%08x : 0x%08x\n", ILT[y]&(~IMAGE_ORDINAL_FLAG32), IAT[y]);
}
else {
char* ImportStr = (char*)PEObject->HModule + (ILT[y] & (~IMAGE_ORDINAL_FLAG32)) + 2;
IAT[y] = PESymbol::ResolveImportByName(filename, (char*)PEObject->HModule + PEObject->ImportTable[x].Name, ImportStr);
utils::debugPrint("\t\tImport by String %s : 0x%08x\n", ImportStr, IAT[y]);
}
}
}
return 1;
}
uint32_t PEProcess::PE_BaseReloc(PEObject_t* PEObject, const char* filename)
{
uint32_t VirtualAddress = PEObject->NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
uint32_t DirectorySize = PEObject->NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
uint32_t Delta = (uint32_t)PEObject->HModule - PEObject->NTHeader->OptionalHeader.ImageBase;
if (VirtualAddress == 0)
{
return 0;
}
if (Delta == 0)
{
return 1;
}
for (uint32_t x = 0; x < DirectorySize;)
{
XIMAGE_BASE_RELOCATION* BaseReloc = (XIMAGE_BASE_RELOCATION*)((char*)PEObject->HModule + VirtualAddress + x);
uint32_t Offset = (uint32_t)PEObject->HModule + BaseReloc->VirtualAddress;
if (BaseReloc->SizeOfBlock)
{
for (uint32_t y = 0; y < BaseReloc->SizeOfBlock - 8; y += 2)
{
XIMAGE_BASE_RELOC_FIXUP* Fixup = (XIMAGE_BASE_RELOC_FIXUP*)((char*)BaseReloc + sizeof(XIMAGE_BASE_RELOCATION) + y);
switch (Fixup[0].Type)
{
case IMAGE_REL_BASED_HIGH:
{
uint16_t* Victim = (uint16_t*)(Offset + Fixup[0].Offset);
uint32_t TEMP;
TEMP = Victim[0] << 16;
TEMP += Delta;
Victim[0] = (uint16_t)(TEMP >> 16);
break;
}
case IMAGE_REL_BASED_LOW:
{
uint16_t* Victim = (uint16_t*)(Offset + Fixup[0].Offset);
uint32_t TEMP;
TEMP = Victim[0];
TEMP += Delta;
Victim[0] = (uint16_t)(TEMP & 0xffff);
break;
}
case IMAGE_REL_BASED_HIGHLOW:
{
uint32_t* Victim = (uint32_t*)(Offset + Fixup[0].Offset);
Victim[0] += Delta;
break; }
case IMAGE_REL_BASED_HIGHADJ:
{
uint32_t* Victim = (uint32_t*)(Offset + Fixup[0].Offset);
Victim[0] += Delta;
break;
}
case IMAGE_REL_BASED_DIR64:
{
__int64* Victim = (__int64*)(Offset + Fixup[0].Offset);
Victim[0] += Delta;
break;
}
}
}
}
x += BaseReloc->SizeOfBlock;
if (BaseReloc->SizeOfBlock % 4)
{
x += 4 - (BaseReloc->SizeOfBlock % 4);
}
}
return 1;
}
void* PEProcess::PE_GetSym(PEObject_t* PEObject, const char* Function)
{
if ((!PEObject) || (!PEObject->HModule) || (!PEObject->ExportTable))
{
return NULL;
}
uint32_t* ExportNameTable = (uint32_t*)((char*)PEObject->HModule + PEObject->ExportTable->AddressOfNames);
uint16_t* ExportOrdinalTable = (uint16_t*)((char*)PEObject->HModule + PEObject->ExportTable->AddressOfNameOrdinals);
uint32_t* ExportAddressTable = (uint32_t*)((char*)PEObject->HModule + PEObject->ExportTable->AddressOfFunctions);
for (uint32_t i = 0; i < PEObject->ExportTable->NumberOfNames; i++)
{
char* Str = (char*)PEObject->HModule + ExportNameTable[i];
if (!strcmp(Function, Str))
{
return ((char*)PEObject->HModule + ExportAddressTable[ExportOrdinalTable[i]]);
}
}
return NULL;
}
char* PEProcess::getPluginName(const char* filePath)
{
char* buffer = NULL;
void (*NXEMain)(char*, uint32_t) = NULL;
PEObject_t* peObject = PEProcess::PE_Load(filePath);
if (!peObject)
{
goto done;
}
NXEMain = (void(__cdecl*)(char*, uint32_t))PEProcess::PE_GetSym(peObject, "getPluginName");
if (!NXEMain)
{
goto done;
}
buffer = (char*)malloc(40);
NXEMain(buffer, 40);
done:
if (peObject)
{
PEProcess::PE_Free(peObject);
}
return buffer;
}
int32_t PEProcess::PE_Run(const char* filePath, PEParam_t* params)
{
int (*NXEMain)(int, char**) = NULL;
PEObject_t* peObject = PEProcess::PE_Load(filePath);
if (!peObject)
{
goto done;
}
NXEMain = (int(__cdecl*)(int, char**))PEProcess::PE_GetSym(peObject, "main");
if (!NXEMain)
{
goto done;
}
return (unsigned long)NXEMain(params->argc, params->argv);
done:
if (peObject)
{
PEProcess::PE_Free(peObject);
}
if (params)
{
for (int i = 0; i < params->argc; i++)
{
if (params->argv[i])
{
free(params->argv[i]);
}
}
free(params);
}
return -1;
}

View file

@ -0,0 +1,193 @@
#pragma once
#include "..\xboxInternals.h"
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
#define IMAGE_SIZEOF_SHORT_NAME 8
#pragma pack(push, 1)
typedef struct XIMAGE_DOS_HEADER { // DOS .EXE header
uint16_t e_magic; // Magic number
uint16_t e_cblp; // uchars on last page of file
uint16_t e_cp; // Pages in file
uint16_t e_crlc; // Relocations
uint16_t e_cparhdr; // Size of header in paragraphs
uint16_t e_minalloc; // Minimum extra paragraphs needed
uint16_t e_maxalloc; // Maximum extra paragraphs needed
uint16_t e_ss; // Initial (relative) SS value
uint16_t e_sp; // Initial SP value
uint16_t e_csum; // Checksum
uint16_t e_ip; // Initial IP value
uint16_t e_cs; // Initial (relative) CS value
uint16_t e_lfarlc; // File address of relocation table
uint16_t e_ovno; // Overlay number
uint16_t e_res[4]; // Reserved ushorts
uint16_t e_oemid; // OEM identifier (for e_oeminfo)
uint16_t e_oeminfo; // OEM information; e_oemid specific
uint16_t e_res2[10]; // Reserved ushorts
int32_t e_lfanew; // File address of new exe header
} XIMAGE_DOS_HEADER;
typedef struct XIMAGE_FILE_HEADER {
uint16_t Machine;
uint16_t NumberOfSections;
uint32_t TimeDateStamp;
uint32_t PointerToSymbolTable;
uint32_t NumberOfSymbols;
uint16_t SizeOfOptionalHeader;
uint16_t Characteristics;
} XIMAGE_FILE_HEADER;
#define IMAGE_DOS_SIGNATURE 0x5A4D
#define IMAGE_NT_SIGNATURE 0x00004550
#define IMAGE_FILE_MACHINE_I386 0x014c
#define IMAGE_FILE_DLL 0x2000
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
#define IMAGE_REL_BASED_HIGH 1
#define IMAGE_REL_BASED_LOW 2
#define IMAGE_REL_BASED_HIGHLOW 3
#define IMAGE_REL_BASED_HIGHADJ 4
#define IMAGE_REL_BASED_DIR64 10
#define IMAGE_ORDINAL_FLAG32 0x80000000
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct XIMAGE_DATA_DIRECTORY {
uint32_t VirtualAddress;
uint32_t Size;
} XIMAGE_DATA_DIRECTORY;
typedef struct XIMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
uint16_t Magic;
uint8_t MajorLinkerVersion;
uint8_t MinorLinkerVersion;
uint32_t SizeOfCode;
uint32_t SizeOfInitializedData;
uint32_t SizeOfUninitializedData;
uint32_t AddressOfEntryPoint;
uint32_t BaseOfCode;
uint32_t BaseOfData;
//
// NT additional fields.
//
uint32_t ImageBase;
uint32_t SectionAlignment;
uint32_t FileAlignment;
uint16_t MajorOperatingSystemVersion;
uint16_t MinorOperatingSystemVersion;
uint16_t MajorImageVersion;
uint16_t MinorImageVersion;
uint16_t MajorSubsystemVersion;
uint16_t MinorSubsystemVersion;
uint32_t Win32VersionValue;
uint32_t SizeOfImage;
uint32_t SizeOfHeaders;
uint32_t CheckSum;
uint16_t Subsystem;
uint16_t DllCharacteristics;
uint32_t SizeOfStackReserve;
uint32_t SizeOfStackCommit;
uint32_t SizeOfHeapReserve;
uint32_t SizeOfHeapCommit;
uint32_t LoaderFlags;
uint32_t NumberOfRvaAndSizes;
XIMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} XIMAGE_OPTIONAL_HEADER32;
typedef struct XIMAGE_NT_HEADERS32 {
uint32_t Signature;
XIMAGE_FILE_HEADER FileHeader;
XIMAGE_OPTIONAL_HEADER32 OptionalHeader;
} XIMAGE_NT_HEADERS32;
typedef struct XIMAGE_EXPORT_DIRECTORY {
uint32_t Characteristics;
uint32_t TimeDateStamp;
uint16_t MajorVersion;
uint16_t MinorVersion;
uint32_t Name;
uint32_t Base;
uint32_t NumberOfFunctions;
uint32_t NumberOfNames;
uint32_t AddressOfFunctions; // RVA from base of image
uint32_t AddressOfNames; // RVA from base of image
uint32_t AddressOfNameOrdinals; // RVA from base of image
} XIMAGE_EXPORT_DIRECTORY;
typedef struct XIMAGE_SECTION_HEADER {
uint8_t Name[IMAGE_SIZEOF_SHORT_NAME];
union {
uint32_t PhysicalAddress;
uint32_t VirtualSize;
} Misc;
uint32_t VirtualAddress;
uint32_t SizeOfRawData;
uint32_t PointerToRawData;
uint32_t PointerToRelocations;
uint32_t PointerToLinenumbers;
uint16_t NumberOfRelocations;
uint16_t NumberOfLinenumbers;
uint32_t Characteristics;
} XIMAGE_SECTION_HEADER;
typedef struct XIMAGE_IMPORT_DIRECTORY {
uint32_t ImportLookupTable;
uint32_t TimeDateStamp;
uint32_t ForwarderChain;
uint32_t Name;
uint32_t ImportAddressTable;
} XIMAGE_IMPORT_DIRECTORY;
typedef struct XIMAGE_BASE_RELOCATION {
uint32_t VirtualAddress;
uint32_t SizeOfBlock;
} XIMAGE_BASE_RELOCATION;
typedef struct XIMAGE_BASE_RELOC_FIXUP {
uint16_t Offset : 12;
uint16_t Type : 4;
} XIMAGE_BASE_RELOC_FIXUP;
typedef struct PEObject_t
{
void* HModule;
XIMAGE_DOS_HEADER* DOSHeader;
XIMAGE_NT_HEADERS32* NTHeader;
XIMAGE_SECTION_HEADER* SectionHeader;
XIMAGE_EXPORT_DIRECTORY* ExportTable;
XIMAGE_IMPORT_DIRECTORY* ImportTable;
uint32_t ImageSize;
} PEObject_t;
typedef struct PEParam_t {
int argc;
char** argv;
} PEEParam_t;
#pragma pack(pop)
class PEProcess
{
public:
static PEObject_t* PE_Alloc();
static void PE_Free(PEObject_t* PEObject);
static PEObject_t* PE_Load(const char* filepath);
static int32_t PE_Export(PEObject_t* PEObject, const char* filename);
static int32_t PE_Import(PEObject_t* PEObject, const char* filename);
static uint32_t PE_BaseReloc(PEObject_t* PEObject, const char* filename);
static void* PE_GetSym(PEObject_t* PEObject, const char* Function);
static char* getPluginName(const char* filePath);
static int32_t PE_Run(const char* filePath, PEParam_t* params);
};

View file

@ -0,0 +1,232 @@
#include "PESymbol.h"
#include "PEProcess.h"
#include "..\utils.h"
#include "..\xboxInternals.h"
#include <string.h>
#include <malloc.h>
static LibraryEntry_t* ImportableSymbols;
LibraryEntry_t* PESymbol::AddLibrary(const char* filename)
{
LibraryEntry_t* NL = (LibraryEntry_t*)malloc(sizeof(LibraryEntry_t));
if (!NL)
{
return NULL;
}
NL->Name = strdup(filename);
NL->Next = NULL;
NL->SymTab = NULL;
NL->Ready = 0;
// Check if libraries have been added yet.
if (ImportableSymbols == NULL)
{
ImportableSymbols = NL;
}
else
{
for (LibraryEntry_t* CL = ImportableSymbols; CL != NULL; CL = CL->Next)
{
if (CL->Next == NULL)
{
CL->Next = NL;
break;
}
}
}
// If we get here then shit has happened.
return NL;
}
LibraryEntry_t* PESymbol::FindLibrary(const char* filename)
{
LibraryEntry_t* CL;
// Check if libraries have been added yet.
if (ImportableSymbols == NULL) {
return NULL;
}
// Atleast one library added, check to see if this one has been.
for (CL = ImportableSymbols; CL != NULL; CL = CL->Next)
{
if ((CL->Name != NULL) && (!_stricmp(CL->Name, filename)))
{
return CL;
}
}
// Requested library not found.
return NULL;
}
LibraryEntry_t* PESymbol::FindOrAddLibrary(const char* filename)
{
LibraryEntry_t* RV = FindLibrary(filename);
if (RV == NULL)
{
RV = AddLibrary(filename);
utils::debugPrint("Library [%s]: Added.\n", filename);
}
return RV;
}
SymbolEntry_t* PESymbol::AddSymbol(const char* filename, const char* Name, uint32_t Ordinal, void* Symbol)
{
LibraryEntry_t* LT = FindOrAddLibrary(filename);
if (LT->SymTab == NULL)
{
LT->SymTab = (SymbolEntry_t*)malloc(sizeof(SymbolEntry_t));
LT->SymTab->Name = strdup(Name);
LT->SymTab->Ordinal = Ordinal;
LT->SymTab->Symbol = Symbol;
LT->SymTab->Next = NULL;
return LT->SymTab;
}
else
{
SymbolEntry_t* CF;
for (CF = LT->SymTab; CF != NULL; CF = CF->Next)
{
if (CF->Next == NULL)
{
CF->Next = (SymbolEntry_t*)malloc(sizeof(SymbolEntry_t));
CF = CF->Next;
if (CF)
{
CF->Name = strdup(Name);
CF->Ordinal = Ordinal;
CF->Symbol = Symbol;
CF->Next = NULL;
}
return CF;
}
}
}
// If we get here then shit has happened.
return NULL;
}
void PESymbol::UnresolvedSymbolCalled()
{
utils::debugPrint("An unresolved symbol was called.\n");
}
uint32_t PESymbol::ResolveImportByOrdinal(const char* Filename, const char* Library, uint32_t Ordinal)
{
SymbolEntry_t* CF;
LibraryEntry_t* IL = FindLibrary(Library);
if (IL == NULL)
{
goto Unresolved;
}
for (CF = IL->SymTab; CF != NULL; CF = CF->Next)
{
if (Ordinal == CF->Ordinal)
{
return (uint32_t)CF->Symbol;
}
}
Unresolved:
utils::debugPrint("Unable to resolve ordinal '%lu' from library '%s' for '%s'.\n", Ordinal, Library, Filename);
return (uint32_t)UnresolvedSymbolCalled;
}
void PESymbol::RemoveLibrary(const char* library)
{
LibraryEntry_t * PL = NULL;
for (LibraryEntry_t* CL = ImportableSymbols; CL != NULL; CL = CL->Next)
{
if ((CL->Name != NULL) && (!_stricmp(CL->Name, library)))
{
if (PL)
{
PL->Next = CL->Next;
}
else ImportableSymbols = CL->Next;
free(CL->Name);
if (CL->SymTab)
{
SymbolEntry_t* NE = NULL;
for (SymbolEntry_t* CE = CL->SymTab; CE != NULL; CE = NE)
{
SymbolEntry_t* NE = CE->Next;
if (CE)
{
if (CE->Name)
{
free(CE->Name);
}
free(CE);
}
}
}
}
PL = CL;
}
}
LibraryEntry_t* PESymbol::FindOrLoadLibrary(const char* library)
{
LibraryEntry_t* RV = FindLibrary(library);
if (RV == NULL)
{
char* fp = (char*)malloc(strlen("HDD0-E:\\Root\\Libs\\") + strlen(library) + 2);
strcpy(fp, "HDD0-E:\\Root\\Libs\\");
strcat(fp, library);
utils::debugPrint("Library [%s]: %s Loading\n", library, fp);
PEObject_t* lib = PEProcess::PE_Load(fp);
if (lib)
{
RV = FindLibrary(library);
RV->Object = lib;
RV->Ready = 1;
}
else
{
RemoveLibrary(library);
}
free(fp);
}
return RV;
}
uint32_t PESymbol::ResolveImportByName(const char* filename, const char* library, const char* symbol)
{
SymbolEntry_t* CF;
LibraryEntry_t* IL = FindOrLoadLibrary(library);
if (IL == NULL)
{
goto Unresolved;
}
while (!IL->Ready)
{
//Sleep(10);
}
for (CF = IL->SymTab; CF != NULL; CF = CF->Next)
{
if (!strcmp(symbol, CF->Name))
{
return (uint32_t)CF->Symbol;
}
}
Unresolved:
utils::debugPrint("Unable to resolve symbol '%s' from library '%s' for '%s'.\n", symbol, library, filename);
return (uint32_t)UnresolvedSymbolCalled;
}

View file

@ -0,0 +1,40 @@
#pragma once
#include "..\xboxInternals.h"
typedef struct SymbolSetup_t {
char* Library;
char* Name;
uint32_t Ordinal;
void* Symbol;
} SymbolSetup_t;
typedef struct SymbolEntry_t {
char* Name;
uint32_t Ordinal;
void* Symbol;
struct SymbolEntry_t* Next;
} SymbolEntry_t;
typedef struct LibraryEntry_t {
char* Name;
SymbolEntry_t* SymTab;
struct LibraryEntry_t* Next;
void* Object;
int Ready;
} LibraryEntry_t;
class PESymbol
{
public:
static LibraryEntry_t* AddLibrary(const char* filename);
static LibraryEntry_t* FindLibrary(const char* filename);
static LibraryEntry_t* FindOrAddLibrary(const char* filename);
static SymbolEntry_t* AddSymbol(const char* filename, const char* name, uint32_t ordinal, void* symbol);
static void UnresolvedSymbolCalled();
static uint32_t ResolveImportByOrdinal(const char* filename, const char* library, uint32_t ordinal);
static LibraryEntry_t* FindOrLoadLibrary(const char* library);
static void RemoveLibrary(const char* Library);
static uint32_t ResolveImportByName(const char* filename, const char* library, const char* symbol);
};

View file

@ -0,0 +1,172 @@
#include "audioSettingsScene.h"
#include "sceneManager.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\inputManager.h"
#include "..\ssfn.h"
#include "..\xboxConfig.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\theme.h"
audioSettingsScene::audioSettingsScene()
{
mSelectedControl = 0;
if (xboxConfig::getAudioModeStereo() == true)
{
mSelectedControl = 1;
}
if (xboxConfig::getAudioModeSurround() == true)
{
mSelectedControl = 2;
}
}
void audioSettingsScene::update()
{
// Back Action
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene();
return;
}
// Select Actions
if (inputManager::buttonPressed(ButtonA))
{
if (mSelectedControl == 0)
{
xboxConfig::setAudioMode(XC_AUDIO_FLAGS_MONO);
}
else if (mSelectedControl == 1)
{
xboxConfig::setAudioMode(XC_AUDIO_FLAGS_STEREO);
}
else if (mSelectedControl == 2)
{
xboxConfig::setAudioMode(XC_AUDIO_FLAGS_SURROUND);
}
else if (mSelectedControl == 3)
{
xboxConfig::setAudioAC3(false);
}
else if (mSelectedControl == 4)
{
xboxConfig::setAudioAC3(true);
}
else if (mSelectedControl == 5)
{
xboxConfig::setAudioDTS(false);
}
else if (mSelectedControl == 6)
{
xboxConfig::setAudioDTS(true);
}
}
// Left Actions
if (inputManager::buttonPressed(ButtonDpadLeft))
{
if (mSelectedControl >= 0 && mSelectedControl <= 2)
{
mSelectedControl = mSelectedControl > 0 ? mSelectedControl - 1 : 2;
}
else if (mSelectedControl >= 3 && mSelectedControl <= 4)
{
mSelectedControl = mSelectedControl > 3 ? mSelectedControl - 1 : 4;
}
else if (mSelectedControl >= 5 && mSelectedControl <= 6)
{
mSelectedControl = mSelectedControl > 5 ? mSelectedControl - 1 : 6;
}
}
// Right Actions
if (inputManager::buttonPressed(ButtonDpadRight))
{
if (mSelectedControl >= 0 && mSelectedControl <= 2)
{
mSelectedControl = mSelectedControl < 2 ? mSelectedControl + 1 : 0;
}
else if (mSelectedControl >= 3 && mSelectedControl <= 4)
{
mSelectedControl = mSelectedControl < 4 ? mSelectedControl + 1 : 3;
}
else if (mSelectedControl >= 5 && mSelectedControl <= 6)
{
mSelectedControl = mSelectedControl < 6 ? mSelectedControl + 1 : 5;
}
}
// Down Actions
if (inputManager::buttonPressed(ButtonDpadDown))
{
if (mSelectedControl >= 0 && mSelectedControl <= 2)
{
mSelectedControl = 3;
}
else if (mSelectedControl >= 3 && mSelectedControl <= 4)
{
mSelectedControl += 2;
}
else if (mSelectedControl >= 5 && mSelectedControl <= 6)
{
mSelectedControl = 0;
}
}
// Up Actions
if (inputManager::buttonPressed(ButtonDpadUp))
{
if (mSelectedControl >= 0 && mSelectedControl <= 2)
{
mSelectedControl = 5;
}
else if (mSelectedControl >= 3 && mSelectedControl <= 4)
{
mSelectedControl = 0;
}
else if (mSelectedControl >= 5 && mSelectedControl <= 6)
{
mSelectedControl -= 2;
}
}
}
void audioSettingsScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Audio settings...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int xPos = 117;
int yPos = (context::getBufferHeight() - (30 + 45 + 30 + 45 + 30 + 30)) / 2;
yPos += theme::getCenterOffset();
drawing::drawBitmapString(context::getBitmapFontSmall(), "Audio Mode", theme::getTextColor(), xPos, yPos);
yPos += 30;
component::button(mSelectedControl == 0, xboxConfig::getAudioModeMono(), "Mono", xPos, yPos, 160, 30);
component::button(mSelectedControl == 1, xboxConfig::getAudioModeStereo(), "Stereo", xPos + 164, yPos, 160, 30);
component::button(mSelectedControl == 2, xboxConfig::getAudioModeSurround(), "Surround", xPos + (164 * 2), yPos, 160, 30);
yPos += 45;
drawing::drawBitmapString(context::getBitmapFontSmall(), "Dolby Digital (AC3)", theme::getTextColor(), xPos, yPos);
yPos += 30;
component::button(mSelectedControl == 3, xboxConfig::getAudioAC3() == false, "Disabled", xPos, yPos, 241, 30);
component::button(mSelectedControl == 4, xboxConfig::getAudioAC3() == true, "Enabled", xPos + 245, yPos, 241, 30);
yPos += 45;
drawing::drawBitmapString(context::getBitmapFontSmall(), "DTS", theme::getTextColor(), xPos, yPos);
yPos += 30;
component::button(mSelectedControl == 5, xboxConfig::getAudioDTS() == false, "Disabled", xPos, yPos, 241, 30);
component::button(mSelectedControl == 6, xboxConfig::getAudioDTS() == true, "Enabled", xPos + 245, yPos, 241, 30);
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA1 Select", theme::getFooterTextColor(), 40, theme::getFooterY());
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}

View file

@ -0,0 +1,13 @@
#pragma once
#include "scene.h"
class audioSettingsScene : public scene
{
public:
audioSettingsScene();
void update();
void render();
private:
int mSelectedControl;
};

View file

@ -0,0 +1,147 @@
#include "audioVideoOptionsScene.h"
#include "sceneManager.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxConfig.h"
#include "..\theme.h"
#include "..\fileSystem.h"
audioVideoOptionsScene::audioVideoOptionsScene()
{
mSelectedControl = 0;
}
void audioVideoOptionsScene::update()
{
// Exit Action
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene();
return;
}
// Down Actions
if (inputManager::buttonPressed(ButtonDpadDown))
{
mSelectedControl = mSelectedControl < 2? mSelectedControl + 1 : 0;
}
// Up Actions
if (inputManager::buttonPressed(ButtonDpadUp))
{
mSelectedControl = mSelectedControl > 0 ? mSelectedControl - 1 : 2;
}
// Left Trigger
if (inputManager::buttonPressed(ButtonTriggerLeft) || inputManager::buttonPressed(ButtonX))
{
if (mSelectedControl == 0)
{
uint8_t musicVolume = settingsManager::getMusicVolume();
musicVolume = (musicVolume >= 5) ? (musicVolume - 5) : 100;
settingsManager::setMusicVolume(musicVolume);
return;
}
if (mSelectedControl == 1)
{
uint8_t soundVolume = settingsManager::getSoundVolume();
soundVolume = (soundVolume >= 5) ? (soundVolume - 5) : 100;
settingsManager::setSoundVolume(soundVolume);
return;
}
if (mSelectedControl == 2)
{
bool vgaEnable = settingsManager::getVgaEnable();
settingsManager::setVgaEnable(!vgaEnable);
return;
}
}
// Right Trigger
if (inputManager::buttonPressed(ButtonTriggerRight) || inputManager::buttonPressed(ButtonY))
{
if (mSelectedControl == 0)
{
uint8_t musicVolume = settingsManager::getMusicVolume();
musicVolume = (musicVolume >= 100) ? 0 : (musicVolume + 5);
settingsManager::setMusicVolume(musicVolume);
return;
}
if (mSelectedControl == 1)
{
uint8_t soundVolume = settingsManager::getSoundVolume();
soundVolume = (soundVolume >= 100) ? 0 : (soundVolume + 5);
settingsManager::setSoundVolume(soundVolume);
return;
}
if (mSelectedControl == 2)
{
bool vgaEnable = settingsManager::getVgaEnable();
settingsManager::setVgaEnable(!vgaEnable);
return;
}
}
}
void audioVideoOptionsScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Audio/Video Options...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
char* musicVolume = stringUtility::formatString("Music Volume: %i%%", settingsManager::getMusicVolume());
char* soundVolume = stringUtility::formatString("Sound Volume: %i%%", settingsManager::getSoundVolume());
char* vgaEnable = stringUtility::formatString("VGA Enabled: %s", settingsManager::getVgaEnable() == true ? "Yes" : "No");
pointerVector<char*>* menuItems = new pointerVector<char*>(false);
menuItems->add(strdup(musicVolume));
menuItems->add(strdup(soundVolume));
menuItems->add(strdup(vgaEnable));
int32_t maxItems = 7;
int32_t start = 0;
if ((int32_t)menuItems->count() >= maxItems)
{
start = min(max(mSelectedControl - (maxItems / 2), 0), (int32_t)menuItems->count() - maxItems);
}
int32_t itemCount = min(start + maxItems, (int32_t)menuItems->count()) - start;
if (itemCount > 0)
{
uint32_t yPos = (context::getBufferHeight() - ((itemCount * 40) - 10)) / 2;
yPos += theme::getCenterOffset();
for (int32_t i = 0; i < itemCount; i++)
{
uint32_t index = start + i;
char* menuText = menuItems->get(index);
component::button(mSelectedControl == index, false, menuText, 193, yPos, 322, 30);
yPos += 40;
}
}
free(vgaEnable);
free(soundVolume);
free(musicVolume);
delete(menuItems);
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA3\xC2\xA4 or \xC2\xB2\xC2\xB3 Change Value", theme::getFooterTextColor(), 40, theme::getFooterY());
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}

View file

@ -0,0 +1,14 @@
#pragma once
#include "scene.h"
#include "sceneManager.h"
class audioVideoOptionsScene : public scene
{
public:
audioVideoOptionsScene();
void update();
void render();
private:
int mSelectedControl;
};

View file

@ -0,0 +1,107 @@
#include "autoBootScene.h"
#include "sceneManager.h"
#include "mainScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxConfig.h"
#include "..\theme.h"
#include "..\driveManager.h"
#include "..\Threads\countdown.h"
autoBootScene::autoBootScene()
{
utils::setLedStates(SMC_LED_STATES_RED_STATE0 | SMC_LED_STATES_RED_STATE1 | SMC_LED_STATES_RED_STATE2 | SMC_LED_STATES_RED_STATE3);
countdown::startThread(settingsManager::getAutoBootDelay() * 1000);
}
void autoBootScene::update()
{
uint32_t trayState = 0;
uint32_t ejectCount = 0x11223344;
HalReadSMCTrayState(&trayState, &ejectCount);
bool safeMode = (trayState == SMC_TRAY_STATE_UNLOADING || ejectCount > 0);
// Exit Action
if (inputManager::buttonPressed(ButtonA))
{
continueBoot();
}
if (inputManager::buttonPressed(ButtonB))
{
safeMode = true;
}
if (safeMode == true)
{
countdown::closeThread();
HalWriteSMBusByte(SMC_SLAVE_ADDRESS, 0x0C, 1);
utils::setLedStates(SMC_LED_STATES_GREEN_STATE0 | SMC_LED_STATES_GREEN_STATE1 | SMC_LED_STATES_GREEN_STATE2 | SMC_LED_STATES_GREEN_STATE3);
sceneManager::popScene();
}
}
void autoBootScene::render()
{
pointerVector<bankDetails*>* banks = settingsManager::getBankInfos();
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Auto booting...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int yPos = (context::getBufferHeight() - (40 + 44)) / 2;
yPos += theme::getCenterOffset();
for (uint32_t i = 0; i < banks->count(); i++)
{
bankDetails* bank = banks->get(i);
if (bank->autoBoot == false)
{
continue;
}
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), bank->name, theme::getTextColor(), horizAlignmentCenter, 40, yPos, 640);
}
yPos += 40;
char* progress = stringUtility::formatString("Booting in %.1f seconds", countdown::getTimeRemaining() / 1000.0f);
component::textBox(progress, false, false, horizAlignmentCenter, 193, yPos, 322, 44);
free(progress);
delete(banks);
if (countdown::getTimeRemaining() == 0)
{
continueBoot();
}
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA1 Continue", theme::getFooterTextColor(), 40, theme::getFooterY());
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Cancel", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
void autoBootScene::continueBoot() {
countdown::closeThread();
pointerVector<bankDetails*>* banks = settingsManager::getBankInfos();
for (uint32_t i = 0; i < banks->count(); i++)
{
bankDetails* bank = banks->get(i);
if (bank->slots > 0 && bank->autoBoot == true)
{
utils::setLedStates(SMC_LED_STATES_GREEN_STATE0 | SMC_LED_STATES_GREEN_STATE1 | SMC_LED_STATES_GREEN_STATE2 | SMC_LED_STATES_GREEN_STATE3);
settingsManager::launchBank(bank->id);
break;
}
}
delete(banks);
}

View file

@ -0,0 +1,12 @@
#pragma once
#include "scene.h"
class autoBootScene : public scene
{
public:
autoBootScene();
void update();
void render();
void continueBoot();
};

View file

@ -0,0 +1,91 @@
#include "backupEepromScene.h"
#include "sceneManager.h"
#include "mainScene.h"
#include "removeScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxConfig.h"
#include "..\theme.h"
#include "..\fileSystem.h"
#include "..\XKUtils\XKEEPROM.h"
backupEepromScene::backupEepromScene()
{
mProgress = strdup("Ready");
mDone = false;
}
backupEepromScene::~backupEepromScene()
{
free(mProgress);
}
void backupEepromScene::update()
{
// Exit Action
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene();
return;
}
// Select Actions
if (inputManager::buttonPressed(ButtonA) && mDone == false)
{
free(mProgress);
if (fileSystem::directoryCreate("HDD0-E:\\PrometheOS") == true && fileSystem::directoryCreate("HDD0-E:\\PrometheOS\\Backup") == true && fileSystem::directoryCreate("HDD0-E:\\PrometheOS\\Backup\\EEPROMs") == true)
{
XKEEPROM* eeprom = new XKEEPROM();
eeprom->ReadFromXBOX();
char* serialString = xboxConfig::getSerialString();
char* versionString = xboxConfig::getXboxVersionString();
char* fileVersionString = stringUtility::replace(versionString, "/", "-");
char* filePath = stringUtility::formatString("HDD0-E:\\PrometheOS\\Backup\\EEPROMs\\%s %s.bin", fileVersionString, serialString);
if (eeprom->WriteToBINFile(filePath) == true)
{
mProgress = strdup("Backup completed");
}
else
{
mProgress = strdup("Backup failed");
}
delete(eeprom);
}
else
{
mProgress = strdup("Backup failed");
}
mDone = true;
}
}
void backupEepromScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Backup EEPROM...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int yPos = (context::getBufferHeight() - (40 + 44)) / 2;
yPos += theme::getCenterOffset();
drawing::drawBitmapString(context::getBitmapFontMedium(), "Status", theme::getHeaderTextColor(), 193, yPos);
yPos += 40;
component::textBox(mProgress, false, false, horizAlignmentCenter, 193, yPos, 322, 44);
if (mDone == false)
{
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA1 Backup", theme::getFooterTextColor(), 40, theme::getFooterY());
}
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}

View file

@ -0,0 +1,15 @@
#pragma once
#include "scene.h"
class backupEepromScene : public scene
{
public:
backupEepromScene();
~backupEepromScene();
void update();
void render();
private:
char* mProgress;
bool mDone;
};

View file

@ -0,0 +1,166 @@
#include "bootOptionsScene.h"
#include "sceneManager.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxConfig.h"
#include "..\theme.h"
#include "..\fileSystem.h"
bootOptionsScene::bootOptionsScene()
{
mSelectedControl = 0;
}
void bootOptionsScene::update()
{
// Exit Action
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene();
return;
}
// Down Actions
if (inputManager::buttonPressed(ButtonDpadDown))
{
mSelectedControl = mSelectedControl < 1 ? mSelectedControl + 1 : 0;
}
// Up Actions
if (inputManager::buttonPressed(ButtonDpadUp))
{
mSelectedControl = mSelectedControl > 0 ? mSelectedControl - 1 : 1;
}
// Left Trigger
if (inputManager::buttonPressed(ButtonTriggerLeft) || inputManager::buttonPressed(ButtonX))
{
if (mSelectedControl == 0)
{
uint8_t splshDelay = settingsManager::getSplashDelay();
if (splshDelay > 0)
{
splshDelay--;
}
else
{
splshDelay = 15;
}
settingsManager::setSplashDelay(splshDelay);
return;
}
if (mSelectedControl == 1)
{
uint8_t autoBootDelay = settingsManager::getAutoBootDelay();
if (autoBootDelay > 5)
{
autoBootDelay -= 5;
}
else if (autoBootDelay > 0)
{
autoBootDelay--;
}
else
{
autoBootDelay = 30;
}
settingsManager::setAutoBootDelay(autoBootDelay);
return;
}
}
// Right Trigger
if (inputManager::buttonPressed(ButtonTriggerRight) || inputManager::buttonPressed(ButtonY))
{
if (mSelectedControl == 0)
{
uint8_t splashDelay = settingsManager::getSplashDelay();
if (splashDelay >= 15)
{
splashDelay = 0;
}
else
{
splashDelay++;
}
settingsManager::setSplashDelay(splashDelay);
return;
}
if (mSelectedControl == 1)
{
uint8_t autoBootDelay = settingsManager::getAutoBootDelay();
if (autoBootDelay >= 30)
{
autoBootDelay = 0;
}
else if (autoBootDelay >= 5)
{
autoBootDelay += 5;
}
else
{
autoBootDelay++;
}
settingsManager::setAutoBootDelay(autoBootDelay);
return;
}
}
}
void bootOptionsScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Boot Options...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
char* splashDelay = stringUtility::formatString("Splash Boot Delay: %i Seconds", settingsManager::getSplashDelay());
char* autoBootDelay = stringUtility::formatString("Auto Boot Delay: %i Seconds", settingsManager::getAutoBootDelay());
pointerVector<char*>* menuItems = new pointerVector<char*>(false);
menuItems->add(strdup(splashDelay));
menuItems->add(strdup(autoBootDelay));
int32_t maxItems = 7;
int32_t start = 0;
if ((int32_t)menuItems->count() >= maxItems)
{
start = min(max(mSelectedControl - (maxItems / 2), 0), (int32_t)menuItems->count() - maxItems);
}
int32_t itemCount = min(start + maxItems, (int32_t)menuItems->count()) - start;
if (itemCount > 0)
{
uint32_t yPos = (context::getBufferHeight() - ((itemCount * 40) - 10)) / 2;
yPos += theme::getCenterOffset();
for (int32_t i = 0; i < itemCount; i++)
{
uint32_t index = start + i;
char* menuText = menuItems->get(index);
component::button(mSelectedControl == index, false, menuText, 193, yPos, 322, 30);
yPos += 40;
}
}
free(autoBootDelay);
free(splashDelay);
delete(menuItems);
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA3\xC2\xA4 or \xC2\xB2\xC2\xB3 Change Value", theme::getFooterTextColor(), 40, theme::getFooterY());
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}

View file

@ -0,0 +1,14 @@
#pragma once
#include "scene.h"
#include "sceneManager.h"
class bootOptionsScene : public scene
{
public:
bootOptionsScene();
void update();
void render();
private:
int mSelectedControl;
};

View file

@ -0,0 +1,718 @@
#include "cerbiosIniEditorScene.h"
#include "keyboardScene.h"
#include "frontLedSelectorScene.h"
#include "sceneManager.h"
#include "scene.h"
#include "filePickerScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxConfig.h"
#include "..\theme.h"
#include "..\fileSystem.h"
#include "..\cerbiosIniHelper.h"
void cerbiosIniEditorScene::onPathClosingCallback(sceneResult result, void* context, scene* scene)
{
cerbiosIniEditorScene* self = (cerbiosIniEditorScene*)context;
if (result == sceneResultCancelled)
{
self->mShowingFilePicker = false;
return;
}
char* path = NULL;
if(self->mShowingFilePicker) {
self->mShowingFilePicker = false;
self->mNeedsSave = true;
filePickerScene* closingScene = (filePickerScene*)scene;
path = closingScene->getFilePath();
}
else
{
keyboardScene* closingScene = (keyboardScene*)scene;
path = closingScene->getText();
}
if (self->mSelectedControl == 3)
{
strcpy(self->mConfig.CdPath1, path);
free(self->mShortCdPath1);
self->mShortCdPath1 = self->shortenString(path);
}
else if (self->mSelectedControl == 4)
{
strcpy(self->mConfig.CdPath2, path);
free(self->mShortCdPath2);
self->mShortCdPath2 = self->shortenString(path);
}
else if (self->mSelectedControl == 5)
{
strcpy(self->mConfig.CdPath3, path);
free(self->mShortCdPath3);
self->mShortCdPath3 = self->shortenString(path);
}
else if (self->mSelectedControl == 6)
{
strcpy(self->mConfig.DashPath1, path);
free(self->mShortDashPath1);
self->mShortDashPath1 = self->shortenString(path);
}
else if (self->mSelectedControl == 7)
{
strcpy(self->mConfig.DashPath2, path);
free(self->mShortDashPath2);
self->mShortDashPath2 = self->shortenString(path);
}
else if (self->mSelectedControl == 8)
{
strcpy(self->mConfig.DashPath3, path);
free(self->mShortDashPath3);
self->mShortDashPath3 = self->shortenString(path);
}
else if (self->mSelectedControl == 9)
{
strcpy(self->mConfig.BootAnimPath, path);
free(self->mShortBootAnimPath);
self->mShortBootAnimPath = self->shortenString(path);
}
free(path);
}
void cerbiosIniEditorScene::onFrontLedClosingCallback(sceneResult result, void* context, scene* scene)
{
cerbiosIniEditorScene* self = (cerbiosIniEditorScene*)context;
if (result == sceneResultCancelled)
{
return;
}
frontLedSelectorScene* closingScene = (frontLedSelectorScene*)scene;
char* ledSequence = closingScene->getLedSequence();
self->mConfig.FrontLed[0] = ledSequence[0];
self->mConfig.FrontLed[1] = ledSequence[1];
self->mConfig.FrontLed[2] = ledSequence[2];
self->mConfig.FrontLed[3] = ledSequence[3];
free(ledSequence);
}
cerbiosIniEditorScene::cerbiosIniEditorScene()
{
mConfig = cerbiosIniHelper::loadConfig();
mConfig.FanSpeed = mConfig.FanSpeed;
mShortCdPath1 = shortenString(mConfig.CdPath1);
mShortCdPath2 = shortenString(mConfig.CdPath2);
mShortCdPath3 = shortenString(mConfig.CdPath3);
mShortDashPath1 = shortenString(mConfig.DashPath1);
mShortDashPath2 = shortenString(mConfig.DashPath2);
mShortDashPath3 = shortenString(mConfig.DashPath3);
mShortBootAnimPath = shortenString(mConfig.BootAnimPath);
mSelectedControl = 0;
mHasFilePicker = false;
mNeedsSave = false;
mShowingFilePicker = false;
mShowingInfo = false;
mMaxOptionCount = 18;
}
cerbiosIniEditorScene::~cerbiosIniEditorScene()
{
free(mShortCdPath1);
free(mShortCdPath2);
free(mShortCdPath3);
free(mShortDashPath1);
free(mShortDashPath2);
free(mShortDashPath3);
free(mShortBootAnimPath);
}
void cerbiosIniEditorScene::update()
{
// Exit Action
if(mShowingInfo) {
if (inputManager::buttonPressed(ButtonB)) {
mShowingInfo = false;
}
return;
}
if (inputManager::buttonPressed(ButtonBlack)) {
mShowingInfo = true;
return;
}
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene();
return;
}
// Defaults Actions
if (inputManager::buttonPressed(ButtonY))
{
cerbiosIniHelper::setConfigDefault(&mConfig);
mNeedsSave = true;
}
// Save Actions
if (mNeedsSave == true && inputManager::buttonPressed(ButtonX))
{
char* buffer = (char*)malloc(65536);
cerbiosIniHelper::buildConfig(&mConfig, buffer);
cerbiosIniHelper::saveConfig(buffer);
free(buffer);
mNeedsSave = false;
}
// Down Actions
if (inputManager::buttonPressed(ButtonDpadDown))
{
mSelectedControl = mSelectedControl < mMaxOptionCount ? mSelectedControl + 1 : 0;
}
// Up Actions
if (inputManager::buttonPressed(ButtonDpadUp))
{
mSelectedControl = mSelectedControl > 0 ? mSelectedControl - 1 : mMaxOptionCount;
}
// Left Trigger
if (inputManager::buttonPressed(ButtonA) || inputManager::buttonPressed(ButtonTriggerLeft))
{
if (mSelectedControl == 0)
{
mConfig.DriveSetup = (mConfig.DriveSetup > 0) ? (mConfig.DriveSetup - 1) : 3;
}
else if (mSelectedControl == 1)
{
mConfig.AVCheck = (mConfig.AVCheck == 0) ? 1 : 0;
}
else if (mSelectedControl == 2)
{
mConfig.Debug = (mConfig.Debug == 0) ? 1 : 0;
}
else if (mSelectedControl == 3)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "CD Path 1:", mConfig.CdPath1), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 4)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "CD Path 2:", mConfig.CdPath2), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 5)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "CD Path 3:", mConfig.CdPath3), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 6)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "Dash Path 1:", mConfig.DashPath1), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 7)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "Dash Path 2:", mConfig.DashPath2), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 8)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "Dash Path 3:", mConfig.DashPath3), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 9)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "Boot Anim Path:", mConfig.BootAnimPath), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 10)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new frontLedSelectorScene(mConfig.FrontLed), "", this, onFrontLedClosingCallback));
}
else if (mSelectedControl == 11)
{
mConfig.FanSpeed = (mConfig.FanSpeed > 0) ? (mConfig.FanSpeed - 10) : 100;
}
else if (mSelectedControl == 12)
{
mConfig.UdmaModeMaster = (mConfig.UdmaModeMaster > 0) ? (mConfig.UdmaModeMaster - 1) : 6;
}
else if (mSelectedControl == 13)
{
mConfig.UdmaModeSlave = (mConfig.UdmaModeSlave > 0) ? (mConfig.UdmaModeSlave - 1) : 6;
}
else if (mSelectedControl == 14)
{
mConfig.Force480p = (mConfig.Force480p == 0) ? 1 : 0;
}
else if (mSelectedControl == 15)
{
mConfig.ForceVGA = (mConfig.ForceVGA == 0) ? 1 : 0;
}
else if (mSelectedControl == 16)
{
mConfig.RtcEnable = (mConfig.RtcEnable == 0) ? 1 : 0;
}
else if (mSelectedControl == 17)
{
mConfig.BlockDashUpdate = (mConfig.BlockDashUpdate == 0) ? 1 : 0;
}
else if (mSelectedControl == 18)
{
mConfig.ResetOnEject = (mConfig.ResetOnEject == 0) ? 1 : 0;
}
mNeedsSave = true;
}
// Right Trigger
if (inputManager::buttonPressed(ButtonTriggerRight))
{
if (mSelectedControl == 0)
{
mConfig.DriveSetup = (mConfig.DriveSetup >= 3) ? 0 : (mConfig.DriveSetup + 1);
}
else if (mSelectedControl == 1)
{
mConfig.AVCheck = (mConfig.AVCheck == 0) ? 1 : 0;
}
else if (mSelectedControl == 2)
{
mConfig.Debug = (mConfig.Debug == 0) ? 1 : 0;
}
else if (mSelectedControl == 3)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "CD Path 1:", mConfig.CdPath1), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 4)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "CD Path 2:", mConfig.CdPath2), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 5)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "CD Path 3:", mConfig.CdPath3), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 6)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "Dash Path 1:", mConfig.DashPath1), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 7)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "Dash Path 2:", mConfig.DashPath2), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 8)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "Dash Path 3:", mConfig.DashPath3), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 9)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new keyboardScene(99, "Please enter path...", "Boot Anim Path:", mConfig.BootAnimPath), "", this, onPathClosingCallback));
}
else if (mSelectedControl == 10)
{
sceneManager::pushScene(new sceneContainer(sceneItemGenericScene, new frontLedSelectorScene(mConfig.FrontLed), "", this, onFrontLedClosingCallback));
}
else if (mSelectedControl == 11)
{
mConfig.FanSpeed = (mConfig.FanSpeed >= 100) ? 0 : (mConfig.FanSpeed + 10);
}
else if (mSelectedControl == 12)
{
mConfig.UdmaModeMaster = (mConfig.UdmaModeMaster >= 6) ? 0 : (mConfig.UdmaModeMaster + 1);
}
else if (mSelectedControl == 13)
{
mConfig.UdmaModeSlave = (mConfig.UdmaModeSlave >= 6) ? 0 : (mConfig.UdmaModeSlave + 1);
}
else if (mSelectedControl == 14)
{
mConfig.Force480p = (mConfig.Force480p == 0) ? 1 : 0;
}
else if (mSelectedControl == 15)
{
mConfig.ForceVGA = (mConfig.ForceVGA == 0) ? 1 : 0;
}
else if (mSelectedControl == 16)
{
mConfig.RtcEnable = (mConfig.RtcEnable == 0) ? 1 : 0;
}
else if (mSelectedControl == 17)
{
mConfig.BlockDashUpdate = (mConfig.BlockDashUpdate == 0) ? 1 : 0;
}
else if (mSelectedControl == 18)
{
mConfig.ResetOnEject = (mConfig.ResetOnEject == 0) ? 1 : 0;
}
mNeedsSave = true;
}
if (mHasFilePicker && inputManager::buttonPressed(ButtonWhite)) {
mShowingFilePicker = true;
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new filePickerScene(filePickerTypeXbe, true, true), "", this, onPathClosingCallback);
sceneManager::pushScene(container);
}
}
char* cerbiosIniEditorScene::getOptionInfo(int selectedControl) {
char *infoStr;
switch(selectedControl) {
case 0: {
infoStr = "Drive Setup (DriveSetup):\n"
"\n"
"Xbox drive setup.\n"
"\n"
"0 = HDD & DVD - Stock setup, DVD drive must be connected or bios\n"
" will fail to boot.\n"
"1 = HDD & No DVD (Legacy) - Allows bios to boot if no DVD drive\n"
" is connected.\n"
"2 = HDD & No DVD (Modern) - Removes DVD drive detect code\n"
" entirely, bios boots faster. DVD drive no longer detected by apps.\n"
"3 = Dual HDD - Allows 2nd HDD to connected in-place of DVD\n"
" drive, HDD mode jumper must be set to slave.\n"
"Default = 1";
} break;
case 1: {
infoStr = "AV Check (AVCheck):\n"
"\n"
"Check for AV cable on bios boot. Flashes yellow and\n"
"green and halts system if no AV cable is connected.\n"
"\n"
"True = Check for AV cable on boot\n"
"False = Skip AV cable check on boot\n"
"Default = True";
} break;
case 2: {
infoStr = "Debug (Debug):\n"
"\n"
"Will check for and boot into C:\\xshell.xbe (XDK Launcher) and\n"
"allows to debug apps. Will look for and load E:\\xbdm.dll (enables\n"
"network communication with XDK on PC with Visual Studio).\n"
"\n"
"True = Allows booting into XDK Launcher and to debug apps.\n"
"False = Will not boot C:\\xshell.xbe and will not load E:\\xbdm.dll\n"
"Default = False";
} break;
case 3:
case 4:
case 5: {
infoStr = "CD Path 1/2/3 (CdPath1, CdPath2, CdPath3):\n"
"\n"
"List of XBEs to look for and load if a DVD disc is detected in\n"
"D: drive on bios boot. Will always fallback to D:\\default.xbe\n"
"\n"
"Default = (all blank)";
} break;
case 6:
case 7:
case 8: {
infoStr = "Dash Path 1/2/3 (DashPath1, DashPath2, DashPath3):\n"
"\n"
"List of dashboard XBEs to look for and load on bios boot. Since\n"
"Cerbios 2.4.2, allows dual-hdd prefixes (HDD0, HDD1), example:\n"
"HDD0-C:\\evoxdash.xbe. Will always fallback to C:\\xboxdash.xbe\n"
"\n"
"Defaults:\n"
" DashPath1 = C:\\evoxdash.xbe\n"
" DashPath2 = C:\\avalaunch.xbe\n"
" DashPath3 = C:\\nexgen.xbe";
} break;
case 9: {
infoStr = "Boot Anim Path (BootAnimPath):\n"
"\n"
"Optional splash animation that plays during bios boot.\n"
"Will always fallback to C:\\BootAnims\\Xbox\\BootAnim.xbe if found.\n"
"\n"
"Default = C:\\BootAnims\\Xbox\\BootAnim.xbe";
} break;
case 10: {
infoStr = "Front Led (FrontLed):\n"
"\n"
"Custom front eject button LED colors set during boot, split into\n"
"4 phases. The pattern will continue to cycle until another application\n"
"takes control of the LEDs.\n"
"LED Ring Color code: G = Green, R = Red, A = Amber, O = Off\n"
"\n"
"Default = GGGG";
} break;
case 11: {
infoStr = "Fan Speed (FanSpeed):\n"
"\n"
"Custom fan speed (in percent) set during boot.\n"
"0 = Auto, 10-100 = Manual Control, Supports increments of 10\n"
"\n"
"Default = 0";
} break;
case 12:
case 13: {
infoStr = "UDMA Mode (UdmaMode, UdmaModeMaster, UdmaModeSlave):\n"
"\n"
"Set HDD UDMA mode on boot. SATA adapters always require 80-Wire\n"
"IDE cable. Since Cerbios 2.4.2, also allows setting UDMA mode for the\n"
"slave HDD when DriveSetup = 3 (Dual HDD mode). Modes:\n"
"0 = Auto (Startech Adapter)\n"
"1 = Auto (Generic Adapter)\n"
"2 = UDMA 2 (Default / Stock)\n"
"3 = UDMA 3 (requires 80-Wire cable)\n"
"4 = UDMA 4 (requires 80-Wire cable)\n"
"5 = UDMA 5 (requires 80-Wire cable)\n"
"6 = UDMA 6 (requires 80-Wire cable, Experimental)\n"
"Default = 2";
} break;
case 14: {
infoStr = "Force 480p (Force480p):\n"
"\n"
"Force games and apps to use 480p HD video mode. Component cable\n"
"required. 720p and 1080i modes are unaffected. PAL AV modes also\n"
"unaffected. 480p option must be enabled in MS Dashboard. Only\n"
"supported on NTSC consoles.\n"
"\n"
"True = Force 480p option enabled\n"
"False = Stock setup, no forcing to 480p will happen\n"
"Default = False";
} break;
case 15: {
infoStr = "Force VGA (ForceVGA):\n"
"\n"
"Force games and apps to output VGA video signal (RGsB). An\n"
"appropriate cable or adapter is required and an appropriate\n"
"(SoG, Sync-on-Green) monitor is required, depending on the\n"
"cable used. This option automatically enables Force480p option.\n"
"1.6 revision consoles are unsupported.\n"
"\n"
"True = Force VGA video output\n"
"False = Stock setup, no forcing VGA output will happen\n"
"Default = False";
} break;
case 16: {
infoStr = "RTC Enable (RtcEnable):\n"
"\n"
"Enables automatic clock syncing with an appropriate external\n"
"battery-backed RTC module connected to the xbox's SMBUS.\n"
"Requires Cerbios 2.4.0 or higher, or PrometheOS 1.4.0 or higher.\n"
"Currently supported modules: DS3231\n"
"\n"
"True = Sync clock on bios boot\n"
"False = Stock setup, no clock syncing will happen\n"
"Default = False";
} break;
case 17: {
infoStr = "Block Dash Update (BlockDashUpdate):\n"
"\n"
"Prevents some XBL games from updating the MS Dashboard, which\n"
"can break softmod installs. Only really useful for softmods running\n"
"Cerbios 2.4.0 or higher in BFM mode.\n"
"\n"
"True = Dashboard update blocking enabled\n"
"False = Stock setup, no blocking will occur\n"
"Default = False";
} break;
case 18: {
infoStr = "Reset on Eject (ResetOnEject):\n"
"\n"
"Restores orignal stock functionality of resetting the xbox when the\n"
"DVD tray is ejected. This will reload your choosen dashboard.\n"
"\n"
"True = Stock reset functionality enabled\n"
"False = Ignores reset command when the tray is eject\n"
"Default = False";
} break;
default: {
infoStr = "NO INFO AVAILABLE FOR THIS OPTION";
}
}
return infoStr;
}
void cerbiosIniEditorScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Cerbios INI Editor...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
const char* driveModes[] = { "HDD & DVD", "HDD & No DVD (Legacy)", "HDD & No DVD (Modern)", "Dual HDD" };
const char* bools[] = { "False", "True" };
const char* udmaModes[] = { "Auto (Startech Adapter)", "Auto (Generic Adapter)", "UDMA 2 (Default / Stock)", "UDMA 3 (Ultra DMA 80-Conductor)", "UDMA 4 (Ultra DMA 80-Conductor)", "UDMA 5 (Ultra DMA 80-Conductor)", "UDMA 6 (Experimental)" };
const char* fanSpeeds[] = { "Auto", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%" };
int32_t maxItems = 7;
int32_t menuItems = mMaxOptionCount + 1;
int32_t start = 0;
if (menuItems >= maxItems)
{
start = min(max(mSelectedControl - (maxItems / 2), 0), menuItems - maxItems);
}
int32_t itemCount = min(start + maxItems, menuItems) - start;
if (itemCount > 0)
{
uint32_t yPos = (context::getBufferHeight() - ((itemCount * 40) - 10)) / 2;
yPos += theme::getCenterOffset();
for (int32_t i = 0; i < itemCount; i++)
{
uint32_t index = start + i;
if (index == 0)
{
component::splitButton(mSelectedControl == index, false, "Drive Setup:", 165, driveModes[mConfig.DriveSetup], 40, yPos, 640, 30);
}
else if (index == 1)
{
component::splitButton(mSelectedControl == index, false, "AV Check:", 165, bools[mConfig.AVCheck], 40, yPos, 640, 30);
}
else if (index == 2)
{
component::splitButton(mSelectedControl == index, false, "Debug:", 165, bools[mConfig.Debug], 40, yPos, 640, 30);
}
else if (index == 3)
{
component::splitButton(mSelectedControl == index, false, "CD Path 1:", 165, mShortCdPath1, 40, yPos, 640, 30);
}
else if (index == 4)
{
component::splitButton(mSelectedControl == index, false, "CD Path 2:", 165, mShortCdPath2, 40, yPos, 640, 30);
}
else if (index == 5)
{
component::splitButton(mSelectedControl == index, false, "CD Path 3:", 165, mShortCdPath3, 40, yPos, 640, 30);
}
else if (index == 6)
{
component::splitButton(mSelectedControl == index, false, "Dash Path 1:", 165, mShortDashPath1, 40, yPos, 640, 30);
}
else if (index == 7)
{
component::splitButton(mSelectedControl == index, false, "Dash Path 2:", 165, mShortDashPath2, 40, yPos, 640, 30);
}
else if (index == 8)
{
component::splitButton(mSelectedControl == index, false, "Dash Path 3:", 165, mShortDashPath3, 40, yPos, 640, 30);
}
else if (index == 9)
{
component::splitButton(mSelectedControl == index, false, "Boot Anim Path:", 165, mShortBootAnimPath, 40, yPos, 640, 30);
}
else if (index == 10)
{
component::splitButton(mSelectedControl == index, false, "Front Led:", 165, mConfig.FrontLed, 40, yPos, 640, 30);
}
else if (index == 11)
{
component::splitButton(mSelectedControl == index, false, "Fan Speed:", 165, fanSpeeds[mConfig.FanSpeed / 10], 40, yPos, 640, 30);
}
else if (index == 12)
{
component::splitButton(mSelectedControl == index, false, "Udma Master:", 165, udmaModes[mConfig.UdmaModeMaster], 40, yPos, 640, 30);
}
else if (index == 13)
{
component::splitButton(mSelectedControl == index, false, "Udma Slave:", 165, udmaModes[mConfig.UdmaModeSlave], 40, yPos, 640, 30);
}
else if (index == 14)
{
component::splitButton(mSelectedControl == index, false, "Force 480p:", 165, bools[mConfig.Force480p], 40, yPos, 640, 30);
}
else if (index == 15)
{
component::splitButton(mSelectedControl == index, false, "Force VGA:", 165, bools[mConfig.ForceVGA], 40, yPos, 640, 30);
}
else if (index == 16)
{
component::splitButton(mSelectedControl == index, false, "Rtc Enable:", 165, bools[mConfig.RtcEnable], 40, yPos, 640, 30);
}
else if (index == 17)
{
component::splitButton(mSelectedControl == index, false, "Block Dash Update:", 165, bools[mConfig.BlockDashUpdate], 40, yPos, 640, 30);
}
else if (index == 18)
{
component::splitButton(mSelectedControl == index, false, "Reset On Eject:", 165, bools[mConfig.ResetOnEject], 40, yPos, 640, 30);
}
yPos += 40;
}
}
mHasFilePicker = false;
switch(mSelectedControl) {
case 3: case 4: case 5:
case 6: case 7: case 8:
case 9: {
mHasFilePicker = true;
} break;
}
uint32_t yPos = (context::getBufferHeight() - ((itemCount * 40) - 10)) / 2;
yPos += theme::getCenterOffset();
if(mShowingInfo) {
char *infoStr = getOptionInfo(mSelectedControl);
component::textBox(infoStr, true, false, horizAlignmentLeft, 60, yPos + 5, 600, 260, true, true);
}
if(!mShowingInfo) {
const char* baseBtns = "\xC2\xA1 or \xC2\xB2\xC2\xB3 Change Value, \xC2\xA4 Defaults";
const char* filePkrBtn = ", \xC2\xB5 Browse";
const char* saveBtn = ", \xC2\xA3 Save";
char* buttons = stringUtility::formatString(
"%s%s%s",
baseBtns,
mHasFilePicker ? filePkrBtn : "",
mNeedsSave ? saveBtn : ""
);
drawing::drawBitmapString(context::getBitmapFontSmall(), buttons, theme::getFooterTextColor(), 40, theme::getFooterY());
free(buttons);
}
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), mShowingInfo ? "\xC2\xA2 Back" : "\xC2\xB6 Info \xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
char* cerbiosIniEditorScene::shortenString(const char* value)
{
int textWidth;
int textHeight;
drawing::measureBitmapString(context::getBitmapFontSmall(), value, &textWidth, &textHeight);
char* temp = strdup(value);
int maxWidth = (640 - 165) - 20;
if (textWidth >= maxWidth)
{
for (int i = 0; i < (int)strlen(value); i++)
{
free(temp);
temp = stringUtility::formatString("...%s", value + i);
drawing::measureBitmapString(context::getBitmapFontSmall(), temp, &textWidth, &textHeight);
if (textWidth < maxWidth)
{
break;
}
}
}
return temp;
}

View file

@ -0,0 +1,34 @@
#pragma once
#include "scene.h"
#include "sceneManager.h"
#include "..\cerbiosIniHelper.h"
class cerbiosIniEditorScene : public scene
{
public:
cerbiosIniEditorScene();
~cerbiosIniEditorScene();
void update();
void render();
char* shortenString(const char* value);
private:
int mSelectedControl;
int mMaxOptionCount;
bool mNeedsSave;
bool mHasFilePicker;
bool mShowingFilePicker;
bool mShowingInfo;
cerbiosConfig mConfig;
char* mShortCdPath1;
char* mShortCdPath2;
char* mShortCdPath3;
char* mShortDashPath1;
char* mShortDashPath2;
char* mShortDashPath3;
char* mShortBootAnimPath;
char* getOptionInfo(int selectedControl);
static void onPathClosingCallback(sceneResult result, void* context, scene* scene);
static void onFrontLedClosingCallback(sceneResult result, void* context, scene* scene);
};

View file

@ -0,0 +1,756 @@
#include "dlcSignerScene.h"
#include "sceneManager.h"
#include "filePickerScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxInternals.h"
#include "..\driveManager.h"
#include "..\fileSystem.h"
#include "..\theme.h"
#include "..\Threads\driveMounter.h"
#define XBEBaseAddress 0x00010000
#define XBEMagic 0x58424548
#define XCSFMagic 0x46534358
#define SHA_CONTEXT_SIZE 116
#define SHA_DIGEST_SIZE 20
dlcSignerScene::dlcSignerScene()
{
driveMounter::startThread(false);
mCurrentSceneId = 0;
mSearchResults = new pointerVector<SearchResult*>(true);
mFilesFound = 0;
}
dlcSignerScene::~dlcSignerScene()
{
freeSearchResults(mSearchResults);
delete(mSearchResults);
}
void dlcSignerScene::update()
{
if (mCurrentSceneId == 0)
{
if (driveMounter::completed() == true)
{
driveMounter::closeThread();
mCurrentSceneId = 1;
return;
}
return;
}
if (mCurrentSceneId == 1)
{
BOOL searchSucceeded = searchContentMetaFiles(mFilesFound, mSearchResults);
mCurrentSceneId = searchSucceeded ? 2 : 5;
return;
}
if (mCurrentSceneId == 2)
{
if (inputManager::buttonPressed(ButtonA))
{
mOnlySignIfInvalid = FALSE;
mCurrentSceneId = 3;
signContent(mSearchResults);
return;
}
if (inputManager::buttonPressed(ButtonY))
{
mOnlySignIfInvalid = TRUE;
mCurrentSceneId = 3;
signContent(mSearchResults);
return;
}
}
if (mCurrentSceneId == 3)
{
mCurrentSceneId = 4;
}
// Back Action
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene();
return;
}
}
void dlcSignerScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "DLC / Update Signer...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int yPos = (context::getBufferHeight() - (40 + 44)) / 2;
yPos += theme::getCenterOffset();
drawing::drawBitmapString(context::getBitmapFontMedium(), "Status", theme::getHeaderTextColor(), 40, yPos);
yPos += 40;
bool showContinue = false;
if (mCurrentSceneId == 0)
{
component::textBox("Mounting Drives...", false, false, horizAlignmentCenter, 40, yPos, 640, 44);
}
else if (mCurrentSceneId == 1)
{
component::textBox("Scanning...", false, false, horizAlignmentCenter, 40, yPos, 640, 44);
}
else if (mCurrentSceneId == 2)
{
if (mSearchResults->count() > 0)
{
char* progress = stringUtility::formatString("Found %d folders containing a total of %d content packages.", mSearchResults->count(), mFilesFound);
component::textBox(progress, false, false, horizAlignmentCenter, 40, yPos, 640, 44);
free(progress);
}
else
{
component::textBox("Search completed. No content packages found", false, false, horizAlignmentCenter, 40, yPos, 640, 44);
}
}
else if (mCurrentSceneId == 3)
{
component::textBox("Signing...", false, false, horizAlignmentCenter, 40, yPos, 640, 44);
}
else if (mCurrentSceneId == 4)
{
char* progress = stringUtility::formatString("Signing complete. %d files signed, %d failed, %d skipped", mNumFilesSigned, mNumFilesFailed, mNumFilesSkipped);
component::textBox(progress, false, false, horizAlignmentCenter, 40, yPos, 640, 44);
free(progress);
}
else if (mCurrentSceneId == 5)
{
component::textBox("Failed", false, false, horizAlignmentCenter, 40, yPos, 640, 44);
}
if (mCurrentSceneId == 2 && mSearchResults->count() > 0)
{
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA1 Sign All, \xC2\xA4 Sign Only Invalid", theme::getFooterTextColor(), 40, theme::getFooterY());
}
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
void dlcSignerScene::signContent(pointerVector<SearchResult*>* SearchResults)
{
BOOL Error_FileAccess = FALSE;
BOOL Error_BadFileSize = FALSE;
BOOL Error_BadHeaderSize = FALSE;
BOOL Error_BadMagic = FALSE;
BOOL Warn_SkippedBecauseValid = FALSE;
BOOL Warn_IsSimpleContent = FALSE;
mNumFilesSigned = 0;
mNumFilesFailed = 0;
mNumFilesSkipped = 0;
mWarningSimpleContentFiles = 0;
const PCHAR TitleDataRegion = "T:\\"; //symlink of TitleId specific TDATA folder
const PCHAR UserDataRegion = "U:\\"; //symlink of TitleId specific UDATA folder
for(DWORD SearchResultIndex = 0; SearchResultIndex < SearchResults->count(); SearchResultIndex++) {
SearchResult* CurrentSearchResult = SearchResults->get(SearchResultIndex);
if (CurrentSearchResult->FileCount == 0)
continue;
setAlternateTitleId(CurrentSearchResult->TitleId);
CHAR AlternateTitleDriveLetter = { 0 };
XMountAlternateTitle(TitleDataRegion, CurrentSearchResult->TitleId, &AlternateTitleDriveLetter);
for(DWORD FileIndex = 0; FileIndex < CurrentSearchResult->Files->count(); FileIndex++) {
PCHAR CurrentFile = CurrentSearchResult->Files->get(FileIndex);
if (!signContentMeta(CurrentFile, CurrentSearchResult->TitleId, mOnlySignIfInvalid,
Error_FileAccess, Error_BadFileSize, Error_BadHeaderSize, Error_BadMagic, Warn_SkippedBecauseValid, Warn_IsSimpleContent))
{
if (Error_FileAccess || Error_BadFileSize || Error_BadHeaderSize || Error_BadMagic)
mNumFilesFailed++;
if (Warn_SkippedBecauseValid)
mNumFilesSkipped++;
}
else
{
mNumFilesSigned++;
if (Warn_IsSimpleContent && (strlen(CurrentFile) > 0))
{
mWarningSimpleContentFiles++;
}
}
}
XUnmountAlternateTitle(AlternateTitleDriveLetter);
}
}
BOOL dlcSignerScene::searchContentMetaFiles(DWORD &TotalFiles, pointerVector<SearchResult*>* Results)
{
/*
1. Mount E:\ partition
2. Search E:\TDATA\ for valid TitleId folders and build list of TitleId folders
3. Loop all TitleId's, overwrite AlternateTitleId in XBE header memory with current TitleId from loop, and mount AlternateTitle drive W:\
4. Search W:\ for $C and $U folders
5. If W:\$C exists, search W:\$C for valid OfferId folders and build list of OfferId folders
6. Grab ContentMeta.xbx from all OfferId folders in W:\$C if exists
7. Grab ContentMeta.xbx from W:\$U if exists
*/
const PCHAR TitleDataRegion = "T:\\"; //symlink of TitleId specific TDATA folder
const PCHAR UserDataRegion = "U:\\"; //symlink of TitleId specific UDATA folder
WIN32_FIND_DATA SearchContext;
HANDLE SearchHandle;
PCHAR SearchCriteria = (PCHAR)malloc(MAX_PATH);
ZeroMemory(SearchCriteria, MAX_PATH);
sprintf(SearchCriteria, "HDD0-E:\\TDATA\\*");
if ((SearchHandle = FindFirstFile(SearchCriteria, &SearchContext)) == INVALID_HANDLE_VALUE) {
/*if (ConsoleIsInitialized())
{
ConsoleWriteLine(L" ERROR: Failed to access E:\\ or E:\\TDATA is empty");
}*/
free(SearchCriteria);
return FALSE;
}
BYTE* TitleIds = (BYTE*)malloc((2048 * 4)); // there's ~1000 games for the Xbox (+ breathing room + homebrew titles)
ZeroMemory(TitleIds, (2048 * 4));
DWORD CurrentTitleId = 0;
DWORD TitleIdCount = 0;
if ((strlen(SearchContext.cFileName) == 8) &&
ValidHexString(SearchContext.cFileName, 8) &&
((SearchContext.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY))
{
CopyHexToBytes(SearchContext.cFileName, 8, (BYTE*)&CurrentTitleId, TRUE); // convert hex to uint32, reverse to little endian
if (CurrentTitleId != 0 && CurrentTitleId != 0xFFFFFFFF) {
*(DWORD*)(TitleIds + (TitleIdCount * 4)) = CurrentTitleId; //store title id
TitleIdCount++;
}
}
while(FindNextFile(SearchHandle, &SearchContext)) {
if ((strlen(SearchContext.cFileName) == 8) &&
ValidHexString(SearchContext.cFileName, 8) &&
((SearchContext.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY))
{
CopyHexToBytes(SearchContext.cFileName, 8, (BYTE*)&CurrentTitleId, TRUE); // convert hex to uint32, reverse to little endian
if (CurrentTitleId != 0 && CurrentTitleId != 0xFFFFFFFF) {
*(DWORD*)(TitleIds + (TitleIdCount * 4)) = CurrentTitleId; //store title id
TitleIdCount++;
}
}
}
FindClose(SearchHandle);
if (TitleIdCount == 0) {
free(SearchCriteria);
free(TitleIds);
//if (ConsoleIsInitialized())
// ConsoleWriteLine(L" ERROR: No valid content folders found");
return FALSE;
}
//for some unicode formatting
PWCHAR PrintBuffer = (PWCHAR)malloc((125 * sizeof(WCHAR)));
CHAR AlternateTitleDriveLetter = { 0 };
//Results = new pointerVector<SearchResult*>;
for(DWORD i = 0; i < TitleIdCount; i++) {
if (getAlternateTitleId() != *(DWORD*)(TitleIds + (i * 4))) {
if (AlternateTitleDriveLetter != '\0') {
XUnmountAlternateTitle(AlternateTitleDriveLetter);
AlternateTitleDriveLetter = '\0';
}
if (*(DWORD*)(TitleIds + (i * 4)) == 0)
continue;
setAlternateTitleId(*(DWORD*)(TitleIds + (i * 4))); //write title id into XBE header to trick XAPI into giving access when asking to mount
XMountAlternateTitle(TitleDataRegion, *(DWORD*)(TitleIds + (i * 4)), &AlternateTitleDriveLetter); //mount alternate title id, pass T:\\ to force mounting to W:\\ drive
}
BOOL ContentFolderExists = FALSE;
BOOL UpdateFolderExists = FALSE;
ZeroMemory(SearchCriteria, MAX_PATH);
sprintf(SearchCriteria, "%c:\\$c", AlternateTitleDriveLetter);
if ((SearchHandle = FindFirstFile(SearchCriteria, &SearchContext)) != INVALID_HANDLE_VALUE) {
ContentFolderExists = TRUE;
FindClose(SearchHandle);
}
ZeroMemory(SearchCriteria, MAX_PATH);
sprintf(SearchCriteria, "%c:\\$u", AlternateTitleDriveLetter);
if ((SearchHandle = FindFirstFile(SearchCriteria, &SearchContext)) != INVALID_HANDLE_VALUE) {
UpdateFolderExists = TRUE;
FindClose(SearchHandle);
}
if (!ContentFolderExists && !UpdateFolderExists)
continue;
//begin file search
SearchResult* Result = new SearchResult;
Result->TitleId = *(DWORD*)(TitleIds + (i * 4));
Result->FileCount = 0;
Result->Files = new pointerVector<PCHAR>(false);
if (ContentFolderExists) {
ZeroMemory(SearchCriteria, MAX_PATH);
sprintf(SearchCriteria, "%c:\\$c\\ContentMeta.xbx", AlternateTitleDriveLetter);
//check if a ContentMeta file exists in the root of $C (not usually)
if ((SearchHandle = FindFirstFile(SearchCriteria, &SearchContext)) != INVALID_HANDLE_VALUE) {
PCHAR File = (PCHAR)malloc(MAX_PATH);
ZeroMemory(File, MAX_PATH);
sprintf(File, "%c:\\$c\\ContentMeta.xbx", AlternateTitleDriveLetter);
Result->Files->add(File);
Result->FileCount++;
FindClose(SearchHandle);
}
//check for offerid folders
PCHAR OfferIds = (PCHAR)malloc(16 * 100); //allocate for 100 offerid folders (overkill)
DWORD OfferIdsCount = 0;
ZeroMemory(SearchCriteria, MAX_PATH);
sprintf(SearchCriteria, "%c:\\$c\\*", AlternateTitleDriveLetter);
if ((SearchHandle = FindFirstFile(SearchCriteria, &SearchContext)) != INVALID_HANDLE_VALUE) {
if ((strlen(SearchContext.cFileName) == 16) &&
ValidHexString(SearchContext.cFileName, 16) &&
((SearchContext.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY))
{
sprintf((OfferIds + OfferIdsCount), SearchContext.cFileName);
OfferIdsCount++;
}
while(FindNextFile(SearchHandle, &SearchContext)) {
if ((strlen(SearchContext.cFileName) == 16) &&
ValidHexString(SearchContext.cFileName, 16) &&
((SearchContext.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY))
{
sprintf((OfferIds + (OfferIdsCount * 16)), SearchContext.cFileName);
OfferIdsCount++;
}
}
FindClose(SearchHandle);
}
//search for ContentMeta.xbx files within offerid folders
if (OfferIdsCount > 0) {
for(DWORD i = 0; i < OfferIdsCount; i++) {
ZeroMemory(SearchCriteria, MAX_PATH);
sprintf(SearchCriteria, "%c:\\$c\\%.16s\\ContentMeta.xbx", AlternateTitleDriveLetter, (OfferIds + (i * 16)));
if ((SearchHandle = FindFirstFile(SearchCriteria, &SearchContext)) != INVALID_HANDLE_VALUE) {
PCHAR File = (PCHAR)malloc(MAX_PATH);
ZeroMemory(File, MAX_PATH);
sprintf(File, "%c:\\$c\\%.16s\\ContentMeta.xbx", AlternateTitleDriveLetter, (OfferIds + (i * 16)));
Result->Files->add(File);
Result->FileCount++;
FindClose(SearchHandle);
}
}
}
free(OfferIds);
}
if (UpdateFolderExists) {
ZeroMemory(SearchCriteria, MAX_PATH);
sprintf(SearchCriteria, "%c:\\$u\\ContentMeta.xbx", AlternateTitleDriveLetter);
if ((SearchHandle = FindFirstFile(SearchCriteria, &SearchContext)) != INVALID_HANDLE_VALUE) {
PCHAR File = (PCHAR)malloc(MAX_PATH);
ZeroMemory(File, MAX_PATH);
sprintf(File, "%c:\\$u\\ContentMeta.xbx", AlternateTitleDriveLetter);
Result->Files->add(File);
Result->FileCount++;
FindClose(SearchHandle);
}
}
Results->add(Result);
TotalFiles += Result->FileCount;
}
if (AlternateTitleDriveLetter != '\0')
{
XUnmountAlternateTitle(AlternateTitleDriveLetter);
}
free(SearchCriteria);
free(TitleIds);
free(PrintBuffer);
return TRUE;
}
VOID dlcSignerScene::freeSearchResults(pointerVector<SearchResult*>* Results) {
for(DWORD result_index = 0; result_index < Results->count(); result_index++)
{
SearchResult* result = Results->get(result_index);
if (result)
{
if (result->Files)
{
delete result->Files;
}
}
}
}
BOOL dlcSignerScene::signContentMeta(PCHAR File, DWORD TitleId, BOOL OnlySignIfInvalid, BOOL &FailedToAccessFile, BOOL &BadFileSize, BOOL &BadHeaderSize, BOOL &WasInvalidMagic, BOOL &WasSkippedBecauseValid, BOOL &WasSimpleContentMeta)
{
FailedToAccessFile = FALSE;
BadFileSize = FALSE;
WasInvalidMagic = FALSE;
WasSkippedBecauseValid = FALSE;
WasSimpleContentMeta = FALSE;
if (!File)
{
return FALSE;
}
const DWORD MinimumHeaderSize = 0x6C;
BOOL UseTitleIdFromMetadata = (TitleId == 0 || TitleId == 0xFFFFFFFF);
HANDLE FileHandle = NULL;
if ((FileHandle = CreateFile(File, GENERIC_ALL, GENERIC_ALL, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) == INVALID_HANDLE_VALUE) {
FailedToAccessFile = TRUE;
return FALSE;
}
DWORD FileSize = GetFileSize(FileHandle, NULL);
if (FileSize < MinimumHeaderSize)
{
BadFileSize = TRUE;
CloseHandle(FileHandle);
return FALSE;
}
PBYTE FileBuffer = (PBYTE)malloc(FileSize);
DWORD BytesRead = 0;
if (!ReadFile(FileHandle, FileBuffer, FileSize, &BytesRead, NULL) || BytesRead != FileSize) {
FailedToAccessFile = TRUE;
CloseHandle(FileHandle);
free(FileBuffer);
return FALSE;
}
if (*(DWORD*)(FileBuffer + 0x14) != XCSFMagic) {
WasInvalidMagic = TRUE;
CloseHandle(FileHandle);
free(FileBuffer);
return FALSE;
}
DWORD HeaderSize = *(DWORD*)(FileBuffer + 0x18);
if (HeaderSize < MinimumHeaderSize)
{
BadHeaderSize = TRUE;
CloseHandle(FileHandle);
free(FileBuffer);
return FALSE;
}
DWORD InternalTitleId = 0;
if (UseTitleIdFromMetadata)
{
InternalTitleId = *(DWORD*)(FileBuffer + 0x24);
}
PBYTE Signature = (PBYTE)malloc(SHA_DIGEST_SIZE);
calculateContentHeaderSignature((UseTitleIdFromMetadata ? InternalTitleId : TitleId), (FileBuffer + 0x14), (HeaderSize - 0x14), Signature);
BOOL SignaturesMatch = (memcmp(FileBuffer, Signature, SHA_DIGEST_SIZE) == 0);
if (OnlySignIfInvalid && SignaturesMatch)
{
WasSkippedBecauseValid = TRUE;
CloseHandle(FileHandle);
free(FileBuffer);
free(Signature);
return FALSE;
}
SetFilePointer(FileHandle, 0, NULL, FILE_BEGIN);
DWORD BytesWritten = 0;
if (!WriteFile(FileHandle, Signature, SHA_DIGEST_SIZE, &BytesWritten, NULL) || BytesWritten != SHA_DIGEST_SIZE) {
FailedToAccessFile = TRUE;
CloseHandle(FileHandle);
free(FileBuffer);
free(Signature);
return FALSE;
}
FlushFileBuffers(FileHandle);
CloseHandle(FileHandle);
free(FileBuffer);
free(Signature);
if ((strstr(File, "$c") != NULL) || (strstr(File, "$C") != NULL))
{
if (HeaderSize == MinimumHeaderSize)
{
WasSimpleContentMeta = TRUE;
}
}
return TRUE;
}
BOOL dlcSignerScene::calculateContentHeaderSignature(DWORD TitleId, PBYTE buffer, DWORD length, PBYTE result)
{
if (buffer && length > 0 && result)
{
PBYTE ContentKey = (PBYTE)malloc(SHA_DIGEST_SIZE);
//calc content key (HMAC SHA1 hash of TitleId bytes using XboxHDKey as the key)
XcHMAC(&XboxHDKey[0], 0x10, (PBYTE)&TitleId, 4, NULL, NULL, ContentKey);
//calc signature (HMAC SHA1 hash of supplied data using "content key" as the key)
XcHMAC(ContentKey, SHA_DIGEST_SIZE, buffer, length, NULL, NULL, result);
free(ContentKey);
return TRUE;
}
return FALSE;
}
DWORD dlcSignerScene::getAlternateTitleId()
{
//NOTE: only using the first alternate title id, it's possible to use up to 16 total
//NOTE(feudalnate): might be a good idea to cache the alternate title id's address instead of fetching every time
DWORD CertificateAddress = *(DWORD*)(XBEBaseAddress + 0x118); //get certificate address from XBE header
DWORD AlternateTitleIdsAddress = (CertificateAddress + 0x5C); //alternate titleids are located 0x5C from beginning of certificate (in all cert. revisions)
return *(DWORD*)AlternateTitleIdsAddress;
}
VOID dlcSignerScene::setAlternateTitleId(DWORD AlternateTitleId)
{
DWORD CertificateAddress = *(DWORD*)(XBEBaseAddress + 0x118);
DWORD AlternateTitleIdsAddress = (CertificateAddress + 0x5C);
*(DWORD*)AlternateTitleIdsAddress = AlternateTitleId;
}
BOOL dlcSignerScene::checkXBEHeader()
{
if (memoryPageWritable((LPVOID)XBEBaseAddress))
{
if (*(DWORD*)XBEBaseAddress == XBEMagic)
{
return TRUE;
}
}
return FALSE;
}
BOOL dlcSignerScene::memoryPageWritable(LPVOID Address)
{
/*
WinNT memory page protection flags (one or more will _always_ be set)
PAGE_NOACCESS 0x01
PAGE_READONLY 0x02
PAGE_READWRITE 0x04
PAGE_WRITECOPY 0x08
PAGE_EXECUTE 0x10
PAGE_EXECUTE_READ 0x20
PAGE_EXECUTE_READWRITE 0x40
PAGE_EXECUTE_WRITECOPY 0x80
PAGE_GUARD 0x100
PAGE_NOCACHE 0x200
PAGE_WRITECOMBINE 0x400
*/
DWORD Flags = XQueryMemoryProtect(Address);
if ( (Flags == 0) || ((Flags & PAGE_GUARD) == PAGE_GUARD) || ((Flags & PAGE_NOACCESS) == PAGE_NOACCESS) )
{
return FALSE;
}
if ( ((Flags & PAGE_READWRITE) == PAGE_READWRITE) || ((Flags & PAGE_EXECUTE_READWRITE) == PAGE_EXECUTE_READWRITE) )
{
return TRUE;
}
return FALSE;
}
BOOL dlcSignerScene::ValidHexString(CHAR* string, DWORD length) {
//this could be done better/faster
if (!string || length == 0 || (length % 2) != 0)
return FALSE;
const CHAR* valid_chars = "0123456789abcdefABCDEF";
const DWORD valid_chars_len = 22;
BOOL valid;
CHAR c, v;
for(DWORD i = 0; i < length; i++) {
valid = FALSE;
c = *(CHAR*)(string + i);
for(DWORD x = 0; x < valid_chars_len; x++) {
v = *(CHAR*)(valid_chars + x);
if (c == v) {
valid = TRUE;
break;
}
}
if (!valid)
return FALSE;
}
return TRUE;
}
VOID dlcSignerScene::CopyHexToBytes(CHAR* string, DWORD length, BYTE* buffer, BOOL reverse)
{
if (string && length > 0 && (length % 2) == 0 && buffer) {
CHAR c;
BYTE b;
DWORD buffer_index = 0;
for(DWORD i = 0; i < length; i += 2) {
//first nibble
c = *(CHAR*)(string + i);
if (c >= '0' && c <= '9')
b = (BYTE)((c - '0') << 4);
else if (c >= 'A' && c <= 'F')
b = (BYTE)((c - 'A' + 10) << 4);
else
b = (BYTE)((c - 'a' + 10) << 4);
//second nibble
c = *(CHAR*)(string + (i + 1));
if (c >= '0' && c <= '9')
b = (BYTE)(b | (c - '0'));
else if (c >= 'A' && c <= 'F')
b = (BYTE)(b | (c - 'A' + 10));
else
b = (BYTE)(b | (c - 'a' + 10));
*(BYTE*)(buffer + buffer_index) = b;
buffer_index++;
}
if (reverse) {
DWORD x = 0;
DWORD y = (length / 2);
while (x < y) {
b = *(BYTE*)(buffer + x);
*(BYTE*)(buffer + x) = *(BYTE*)(buffer + (y - 1));
*(BYTE*)(buffer + (y - 1)) = b;
x++;
y--;
}
}
}
}

View file

@ -0,0 +1,42 @@
#pragma once
#include "scene.h"
#include "..\pointerVector.h"
#include "..\xboxInternals.h"
struct SearchResult {
DWORD TitleId;
DWORD FileCount;
pointerVector<PCHAR>* Files;
};
class dlcSignerScene : public scene
{
public:
dlcSignerScene();
~dlcSignerScene();
void update();
void render();
private:
uint32_t mCurrentSceneId;
pointerVector<SearchResult*>* mSearchResults;
DWORD mFilesFound;
BOOL mOnlySignIfInvalid;
DWORD mWarningSimpleContentFiles;
DWORD mNumFilesSigned;
DWORD mNumFilesFailed;
DWORD mNumFilesSkipped;
void signContent(pointerVector<SearchResult*>* SearchResults);
BOOL searchContentMetaFiles(DWORD &TotalFiles, pointerVector<SearchResult*>* Results);
VOID freeSearchResults(pointerVector<SearchResult*>* Results);
BOOL signContentMeta(PCHAR File, DWORD TitleId, BOOL OnlySignIfInvalid, BOOL &FailedToAccessFile, BOOL &BadFileSize, BOOL &BadHeaderSize, BOOL &WasInvalidMagic, BOOL &WasSkippedBecauseValid, BOOL &WasSimpleContentMeta);
BOOL calculateContentHeaderSignature(DWORD TitleId, PBYTE buffer, DWORD length, PBYTE result);
DWORD getAlternateTitleId();
VOID setAlternateTitleId(DWORD AlternateTitleId);
BOOL checkXBEHeader();
BOOL memoryPageWritable(LPVOID Address);
BOOL ValidHexString(CHAR* string, DWORD length);
VOID CopyHexToBytes(CHAR* string, DWORD length, BYTE* buffer, BOOL reverse);
};

View file

@ -0,0 +1,100 @@
#include "editFlowScene.h"
#include "sceneManager.h"
#include "launchScene.h"
#include "removeScene.h"
#include "editScene.h"
#include "flashBankScene.h"
#include "audioSettingsScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxInternals.h"
#include "..\fileSystem.h"
void editFlowScene::onEditClosingCallback(sceneResult result, void* context, scene* scene)
{
editFlowScene* self = (editFlowScene*)context;
if (result == sceneResultCancelled)
{
self->mCurrentSceneId = 3;
return;
}
editScene* closingScene = (editScene*)scene;
self->mBankId = closingScene->getBankId();
self->mCurrentSceneId = 1;
}
void editFlowScene::onKeyboardClosingCallback(sceneResult result, void* context, scene* scene)
{
editFlowScene* self = (editFlowScene*)context;
if (result == sceneResultCancelled)
{
self->mCurrentSceneId = 3;
return;
}
keyboardScene* closingScene = (keyboardScene*)scene;
self->mBankName = closingScene->getText();
self->mCurrentSceneId = context::getModchip()->getSupportInfo(true).supportsLed == true ? 2 : 3;
}
void editFlowScene::onLedColorClosingCallback(sceneResult result, void* context, scene* scene)
{
editFlowScene* self = (editFlowScene*)context;
if (result == sceneResultCancelled)
{
self->mCurrentSceneId = 3;
return;
}
ledColorSelectorScene* closingScene = (ledColorSelectorScene*)scene;
settingsManager::editBank(self->mBankId, self->mBankName, closingScene->getLedColor());
self->mCurrentSceneId = 3;
}
editFlowScene::editFlowScene()
{
mCurrentSceneId = 0;
mBankId = 0;
mBankName = NULL;
}
void editFlowScene::update()
{
if (mCurrentSceneId == 0)
{
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new editScene(), "", this, onEditClosingCallback);
sceneManager::pushScene(container);
return;
}
if (mCurrentSceneId == 1)
{
bankInfo bank = settingsManager::getBankInfo(mBankId);
char* bankName = strdup(bank.name);
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new keyboardScene(63, "Please enter a bank name...", "Bank Name:", bankName), "", this, onKeyboardClosingCallback);
free(bankName);
sceneManager::pushScene(container);
return;
}
if (mCurrentSceneId == 2)
{
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new ledColorSelectorScene(), "", this, onLedColorClosingCallback);
sceneManager::pushScene(container);
return;
}
if (mCurrentSceneId == 3)
{
sceneManager::popScene();
}
}
void editFlowScene::render()
{
}

View file

@ -0,0 +1,24 @@
#pragma once
#include "scene.h"
#include "editScene.h"
#include "keyboardScene.h"
#include "ledColorSelectorScene.h"
#include "flashBankScene.h"
#include "..\xboxInternals.h"
class editFlowScene : public scene
{
public:
editFlowScene();
void update();
void render();
private:
uint32_t mCurrentSceneId;
uint8_t mBankId;
char* mBankName;
static void onEditClosingCallback(sceneResult result, void* context, scene* scene);
static void onKeyboardClosingCallback(sceneResult result, void* context, scene* scene);
static void onLedColorClosingCallback(sceneResult result, void* context, scene* scene);
};

View file

@ -0,0 +1,113 @@
#include "editScene.h"
#include "sceneManager.h"
#include "audioSettingsScene.h"
#include "videoSettingsScene.h"
#include "mainScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\alignment.h"
#include "..\theme.h"
editScene::editScene()
{
mSelectedControl = 0;
mBanks = settingsManager::getBankInfos();
mBankId = 0;
}
editScene::~editScene()
{
delete(mBanks);
}
void editScene::update()
{
// Exit Action
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene(sceneResultCancelled);
return;
}
// Select Actions
if (inputManager::buttonPressed(ButtonA))
{
for (uint32_t i = 0; i < mBanks->count(); i++)
{
if (mSelectedControl != i)
{
continue;
}
mBankId = (uint8_t)i;
sceneManager::popScene(sceneResultDone);
return;
}
}
// Down Actions
if (inputManager::buttonPressed(ButtonDpadDown))
{
mSelectedControl = mSelectedControl < (int)(mBanks->count() - 1) ? mSelectedControl + 1 : 0;
}
// Up Actions
if (inputManager::buttonPressed(ButtonDpadUp))
{
mSelectedControl = mSelectedControl > 0 ? mSelectedControl - 1 : (int)(mBanks->count() - 1);
}
}
void editScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please select a bank to edit...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int32_t maxItems = 7;
int32_t start = 0;
if ((int32_t)mBanks->count() >= maxItems)
{
start = min(max(mSelectedControl - (maxItems / 2), 0), (int32_t)mBanks->count() - maxItems);
}
int32_t itemCount = min(start + maxItems, (int32_t)mBanks->count()) - start;
if (itemCount > 0)
{
uint32_t yPos = (context::getBufferHeight() - ((itemCount * 40) - 10)) / 2;
yPos += theme::getCenterOffset();
for (int32_t i = 0; i < itemCount; i++)
{
uint32_t index = start + i;
bankDetails* bank = mBanks->get(index);
component::button(mSelectedControl == index, false, bank->name, 40, yPos, 640, 30);
yPos += 40;
}
}
else
{
int yPos = ((context::getBufferHeight() - 44) / 2);
yPos += theme::getCenterOffset();
component::textBox("No items", false, false, horizAlignmentCenter, 40, yPos, 640, 44);
}
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA1 Select", theme::getFooterTextColor(), 40, theme::getFooterY());
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Cancel", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
uint8_t editScene::getBankId()
{
return mBankId;
}

View file

@ -0,0 +1,20 @@
#pragma once
#include "scene.h"
#include "..\pointerVector.h"
#include "..\settingsManager.h"
class editScene : public scene
{
public:
editScene();
~editScene();
void update();
void render();
uint8_t getBankId();
private:
int mSelectedControl;
pointerVector<bankDetails*>* mBanks;
uint8_t mBankId;
};

View file

@ -0,0 +1,318 @@
#include "filePickerScene.h"
#include "sceneManager.h"
#include "audioSettingsScene.h"
#include "videoSettingsScene.h"
#include "mainScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\driveManager.h"
#include "..\fileSystem.h"
#include "..\pointerVector.h"
#include "..\theme.h"
#include "..\Threads\driveMounter.h"
pointerVector<fileSystem::FileInfoDetail*>* filePickerScene::getFileInfoDetails()
{
if (strlen(mCurrentPath) == 0)
{
pointerVector<fileSystem::FileInfoDetail*>* fileInfoDetails = new pointerVector<fileSystem::FileInfoDetail*>(true);
for (uint32_t i = 0; i < mMountedDrives->count(); i++)
{
if(mHideMMU) {
char* mountPoint = stringUtility::formatString("%s:", mMountedDrives->get(i));
char* mountAlias = driveManager::convertMountPointToMountPointAlias(mountPoint);
free(mountPoint);
if (stringUtility::startsWith(mountAlias, "MMU", true)) {
free(mountAlias);
continue;
}
free(mountAlias);
}
char* mountPoint = mMountedDrives->get(i);
fileSystem::FileInfoDetail* fileInfoDetail = new fileSystem::FileInfoDetail();
fileInfoDetail->path = stringUtility::formatString("%s:", mountPoint);
fileInfoDetail->isDirectory = true;
fileInfoDetail->isFile = false;
fileInfoDetails->add(fileInfoDetail);
}
return fileInfoDetails;
}
pointerVector<fileSystem::FileInfoDetail*>* result = fileSystem::fileGetFileInfoDetails(mCurrentPath);
if (result != NULL)
{
for (int32_t i = (int32_t)result->count() - 1; i >= 0; i--)
{
fileSystem::FileInfoDetail* fileInfoDetail = result->get(i);
bool valid = fileInfoDetail->isDirectory;
if (fileInfoDetail->isFile)
{
if (mFilePickerType == filePickerTypeBios)
{
valid = context::getModchip()->isValidBankSize(fileInfoDetail->size);
}
else if (mFilePickerType == filePickerTypeEeprom)
{
valid = fileInfoDetail->size == 256;
}
else if (mFilePickerType == filePickerTypeUpdate)
{
valid = context::getModchip()->isValidFlashSize(false, fileInfoDetail->size);
}
else if (mFilePickerType == filePickerTypeUpdateRecovery)
{
valid = context::getModchip()->isValidFlashSize(true, fileInfoDetail->size);
}
else if (mFilePickerType == filePickerTypeXbe)
{
char* ext = fileSystem::getExtension(fileInfoDetail->path);
valid = stricmp(ext, ".xbe") == 0;
free(ext);
}
}
if (valid == false)
{
result->remove(i);
}
}
}
return result;
}
filePickerScene::filePickerScene(filePickerType filePickerType, bool useDevPath, bool hideMMU)
{
driveMounter::startThread(false);
mHideMMU = hideMMU;
mUseDevPath = useDevPath;
mInitialized = false;
mFilePickerType = filePickerType;
mSelectedControl = 0;
mScrollPosition = 0;
mMountedDrives = NULL;
mCurrentPath = NULL;
mFileInfoDetails = NULL;
mFilePath = NULL;
}
filePickerScene::~filePickerScene()
{
delete(mMountedDrives);
free(mCurrentPath);
delete(mFileInfoDetails);
free(mFilePath);
}
void filePickerScene::update()
{
if (mInitialized == false)
{
if (driveMounter::completed() == true)
{
bool exists = false;
driveMounter::closeThread();
mMountedDrives = driveManager::getMountedDrives();
bool biosFolderExists = false;
mCurrentPath = strdup("");
//mCurrentPath = fileSystem::directoryExists("C:\\Bios", biosFolderExists) && biosFolderExists == true ? strdup("C:\\Bios") : strdup("");
mFileInfoDetails = getFileInfoDetails();
mInitialized = true;
}
return;
}
// Cancel Action
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene(sceneResultCancelled);
return;
}
// Parent Path
if (inputManager::buttonPressed(ButtonX))
{
char* newPath = fileSystem::getDirectory(mCurrentPath);
free(mCurrentPath);
mCurrentPath = newPath;
delete(mFileInfoDetails);
mFileInfoDetails = getFileInfoDetails();
mSelectedControl = 0;
mScrollPosition = 0;
}
// Select Actions
if (inputManager::buttonPressed(ButtonA))
{
if (mFileInfoDetails != NULL)
{
for (uint32_t i = 0; i < mFileInfoDetails->count(); i++)
{
if (mSelectedControl != i)
{
continue;
}
fileSystem::FileInfoDetail* fileInfoDetail = mFileInfoDetails->get(i);
if (fileInfoDetail->isDirectory)
{
char* newPath = strdup(fileInfoDetail->path);
free(mCurrentPath);
mCurrentPath = newPath;
delete(mFileInfoDetails);
mFileInfoDetails = getFileInfoDetails();
mSelectedControl = 0;
mScrollPosition = 0;
break;
}
else if (fileInfoDetail->isFile)
{
if(mUseDevPath) {
char* drvLtr = fileSystem::getDriveLetter(fileInfoDetail->path);
char* drvPart = driveManager::getDrivePartition(drvLtr);
char* rootPath = fileSystem::getRootPath(fileInfoDetail->path);
mFilePath = stringUtility::formatString("%s%s", drvPart, rootPath);
free(rootPath);
free(drvPart);
free(drvLtr);
} else {
mFilePath = strdup(fileInfoDetail->path);
}
sceneManager::popScene(sceneResultDone);
return;
}
}
}
}
// Down Actions
if (inputManager::buttonPressed(ButtonDpadDown))
{
if (mFileInfoDetails != NULL)
{
mSelectedControl = mSelectedControl < (int)(mFileInfoDetails->count() - 1) ? mSelectedControl + 1 : 0;
}
}
// Up Actions
if (inputManager::buttonPressed(ButtonDpadUp))
{
if (mFileInfoDetails != NULL)
{
mSelectedControl = mSelectedControl > 0 ? mSelectedControl - 1 : (int)(mFileInfoDetails->count() - 1);
}
}
}
void filePickerScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
if (mFilePickerType == filePickerTypeBios)
{
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please select BIOS to flash...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
}
else if (mFilePickerType == filePickerTypeEeprom)
{
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please select Eeprom to flash...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
}
else if (mFilePickerType == filePickerTypeUpdate)
{
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please select PrometheOS to flash...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
}
else if (mFilePickerType == filePickerTypeUpdateRecovery)
{
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please select Recovery to flash...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
}
else if (mFilePickerType == filePickerTypeXbe)
{
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please select XBE...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
}
if (mInitialized == false)
{
component::textBox("Please Wait...", false, false, horizAlignmentCenter, 40, 218, 640, 44);
}
else if (mFileInfoDetails != NULL)
{
int32_t maxItems = 7;
int32_t start = 0;
if ((int32_t)mFileInfoDetails->count() >= maxItems)
{
start = min(max(mSelectedControl - (maxItems / 2), 0), (int32_t)mFileInfoDetails->count() - maxItems);
}
int32_t itemCount = min(start + maxItems, (int32_t)mFileInfoDetails->count()) - start;
if (itemCount > 0)
{
int32_t yPos = (context::getBufferHeight() - ((itemCount * 40) - 10)) / 2;
yPos += theme::getCenterOffset();
for (int32_t i = 0; i < itemCount; i++)
{
uint32_t index = start + i;
fileSystem::FileInfoDetail* fileInfoDetail = mFileInfoDetails->get(index);
if (strlen(mCurrentPath) == 0)
{
char* tempFileName = fileSystem::getFileName(fileInfoDetail->path);
char* fileName = driveManager::convertMountPointToMountPointAlias(tempFileName);
component::fileButton(mSelectedControl == index, false, fileInfoDetail->isFile, fileName, 40, yPos, 640, 30);
free(fileName);
free(tempFileName);
}
else
{
char* fileName = fileSystem::getFileName(fileInfoDetail->path);
component::fileButton(mSelectedControl == index, false, fileInfoDetail->isFile, fileName, 40, yPos, 640, 30);
free(fileName);
}
yPos += 40;
}
}
else
{
int yPos = ((context::getBufferHeight() - 44) / 2);
yPos += theme::getCenterOffset();
component::textBox("No items", false, false, horizAlignmentCenter, 40, yPos, 640, 44);
}
}
else
{
int yPos = ((context::getBufferHeight() - 44) / 2);
yPos += theme::getCenterOffset();
component::textBox("No items", false, false, horizAlignmentCenter, 40, yPos, 640, 44);
}
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA1 Select \xC2\xA3 Parent", mInitialized ? theme::getFooterTextColor() : theme::getTextDisabledColor(), 40, theme::getFooterY());
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Cancel", mInitialized ? theme::getFooterTextColor() : theme::getTextDisabledColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
char* filePickerScene::getFilePath()
{
return strdup(mFilePath);
}

View file

@ -0,0 +1,38 @@
#pragma once
#include "scene.h"
#include "..\pointerVector.h"
#include "..\fileSystem.h"
enum filePickerType
{
filePickerTypeBios = 0,
filePickerTypeEeprom = 1,
filePickerTypeUpdate = 2,
filePickerTypeUpdateRecovery = 3,
filePickerTypeXbe = 4
};
class filePickerScene : public scene
{
public:
filePickerScene(filePickerType filePickerType, bool useDevPath = false, bool hideMMU = false);
~filePickerScene();
void update();
void render();
char* getFilePath();
private:
pointerVector<fileSystem::FileInfoDetail*>* getFileInfoDetails();
private:
bool mInitialized;
bool mUseDevPath;
bool mHideMMU;
filePickerType mFilePickerType;
int mSelectedControl;
int mScrollPosition;
pointerVector<char*>* mMountedDrives;
char* mCurrentPath;
pointerVector<fileSystem::FileInfoDetail*>* mFileInfoDetails;
char* mFilePath;
};

View file

@ -0,0 +1,114 @@
#include "flashBackupScene.h"
#include "sceneManager.h"
#include "..\drawing.h"
#include "..\ssfn.h"
#include "..\component.h"
#include "..\fileSystem.h"
#include "..\utils.h"
#include "..\theme.h"
#include "..\stringUtility.h"
#include "..\Threads\flashBackup.h"
flashBackupScene::flashBackupScene(bool recovery)
{
mProgress = strdup("");
mDone = false;
flashBackup::startThread(recovery);
}
flashBackupScene::~flashBackupScene()
{
free(mProgress);
}
void flashBackupScene::update()
{
// Back Action
if (mDone == true)
{
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene(sceneResultDone);
}
return;
}
processResponse(flashBackup::getResponse());
if (flashBackup::completed() == true)
{
flashBackup::closeThread();
mDone = true;
}
}
void flashBackupScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please wait...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int yPos = (context::getBufferHeight() - (40 + 44)) / 2;
yPos += theme::getCenterOffset();
drawing::drawBitmapString(context::getBitmapFontMedium(), "Status", theme::getHeaderTextColor(), 193, yPos);
yPos += 40;
component::textBox(mProgress, false, false, horizAlignmentCenter, 193, yPos, 322, 44);
if (mDone == true)
{
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
}
void flashBackupScene::setProgress(const char* message)
{
free(mProgress);
mProgress = strdup(message);
}
void flashBackupScene::processResponse(flashBackup::flashBackupResponse response)
{
uint32_t currentStep;
uint32_t totalSteps;
flashBackup::getProgress(currentStep, totalSteps);
if (response == flashBackup::flashBackupResponseNone)
{
setProgress("");
}
else if (response == flashBackup::flashBackupProcessing)
{
setProgress("Processing");
}
else if (response == flashBackup::flashBackupFailedToCreateDirectory)
{
setProgress("Failed to create file");
}
else if (response == flashBackup::flashBackupFailedToCreateFile)
{
setProgress("Failed to create file");
}
else if (response == flashBackup::flashBackupFailedToWriteFile)
{
setProgress("Failed to write to file");
}
else if (response == flashBackup::flashBackupReading)
{
char* progress = stringUtility::formatString("Step %i of %i - Reading", currentStep, totalSteps);
setProgress(progress);
free(progress);
}
else if (response == flashBackup::flashBackupWriting)
{
char* progress = stringUtility::formatString("Step %i of %i - Writing", currentStep, totalSteps);
setProgress(progress);
free(progress);
}
else if (response == flashBackup::flashBackupDone)
{
setProgress("Done");
}
}

View file

@ -0,0 +1,22 @@
#pragma once
#include "scene.h"
#include "..\utils.h"
#include "..\Threads\flashBackup.h"
#include "..\xboxInternals.h"
class flashBackupScene : public scene
{
public:
flashBackupScene(bool recovery);
~flashBackupScene();
void update();
void render();
private:
void setProgress(const char* message);
void processResponse(flashBackup::flashBackupResponse response);
private:
bool mDone;
char* mProgress;
};

View file

@ -0,0 +1,114 @@
#include "flashBankScene.h"
#include "sceneManager.h"
#include "..\drawing.h"
#include "..\ssfn.h"
#include "..\component.h"
#include "..\fileSystem.h"
#include "..\utils.h"
#include "..\settingsManager.h"
#include "..\theme.h"
#include "..\Threads\flashBank.h"
flashBankScene::flashBankScene(const char* filePath, const char* bankName, uint8_t ledColor)
{
mProgress = strdup("");
mDone = false;
flashBank::startThread(filePath, bankName, ledColor);
}
flashBankScene::~flashBankScene()
{
free(mProgress);
}
void flashBankScene::update()
{
// Back Action
if (mDone == true && inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene(sceneResultDone);
return;
}
if (mDone == false)
{
processResponse(flashBank::getResponse());
if (flashBank::completed() == true)
{
flashBank::closeThread();
mDone = true;
}
}
}
void flashBankScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please wait...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int yPos = (context::getBufferHeight() - (40 + 44)) / 2;
yPos += theme::getCenterOffset();
drawing::drawBitmapString(context::getBitmapFontMedium(), "Status", theme::getHeaderTextColor(), 193, yPos);
yPos += 40;
component::textBox(mProgress, false, false, horizAlignmentCenter, 193, yPos, 322, 44);
if (mDone == true)
{
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
}
void flashBankScene::setProgress(const char* message)
{
free(mProgress);
mProgress = strdup(message);
}
void flashBankScene::processResponse(flashBank::flashBankResponse response)
{
if (response == flashBank::flashBankResponseNone)
{
setProgress("");
}
else if (response == flashBank::flashBankProcessing)
{
setProgress("Processing");
}
else if (response == flashBank::flashBankFailedToLoadFile)
{
setProgress("Failed to load file");
}
else if (response == flashBank::flashBankOptimizing)
{
setProgress("Optimizing");
}
else if (response == flashBank::flashBankNotEnoughSlots)
{
setProgress("Not enough slots");
}
else if (response == flashBank::flashBankErasing)
{
setProgress("Erasing");
}
else if (response == flashBank::flashBankWriting)
{
setProgress("Writing");
}
else if (response == flashBank::flashBankVerifying)
{
setProgress("Verifying");
}
else if (response == flashBank::flashBankVerificationFailed)
{
setProgress("Verification failed");
}
else if (response == flashBank::flashBankDone)
{
setProgress("Done");
}
}

View file

@ -0,0 +1,22 @@
#pragma once
#include "scene.h"
#include "..\utils.h"
#include "..\Threads\flashBank.h"
#include "..\xboxInternals.h"
class flashBankScene : public scene
{
public:
flashBankScene(const char* filePath, const char* bankName, uint8_t ledColor);
~flashBankScene();
void update();
void render();
private:
void setProgress(const char* message);
void processResponse(flashBank::flashBankResponse response);
private:
bool mDone;
char* mProgress;
};

View file

@ -0,0 +1,118 @@
#include "flashFlowScene.h"
#include "keyboardScene.h"
#include "sceneManager.h"
#include "launchScene.h"
#include "removeScene.h"
#include "filePickerScene.h"
#include "ledColorSelectorScene.h"
#include "flashBankScene.h"
#include "audioSettingsScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxInternals.h"
#include "..\fileSystem.h"
void flashFlowScene::onFilePickerClosingCallback(sceneResult result, void* context, scene* scene)
{
flashFlowScene* self = (flashFlowScene*)context;
if (result == sceneResultCancelled)
{
self->mCurrentSceneId = 4;
return;
}
filePickerScene* closingScene = (filePickerScene*)scene;
self->mFilePath = closingScene->getFilePath();
self->mCurrentSceneId = 1;
}
void flashFlowScene::onKeyboardClosingCallback(sceneResult result, void* context, scene* scene)
{
flashFlowScene* self = (flashFlowScene*)context;
if (result == sceneResultCancelled)
{
self->mCurrentSceneId = 4;
return;
}
keyboardScene* closingScene = (keyboardScene*)scene;
self->mBankName = closingScene->getText();
self->mCurrentSceneId = context::getModchip()->getSupportInfo(true).supportsLed == true ? 2 : 3;
}
void flashFlowScene::onLedColorClosingCallback(sceneResult result, void* context, scene* scene)
{
flashFlowScene* self = (flashFlowScene*)context;
if (result == sceneResultCancelled)
{
self->mCurrentSceneId = 4;
return;
}
ledColorSelectorScene* closingScene = (ledColorSelectorScene*)scene;
self->mLedColor = closingScene->getLedColor();
self->mCurrentSceneId = 3;
}
void flashFlowScene::onFlashBankClosingCallback(sceneResult result, void* context, scene* scene)
{
flashFlowScene* self = (flashFlowScene*)context;
self->mCurrentSceneId = 4;
}
flashFlowScene::flashFlowScene()
{
mCurrentSceneId = 0;
mFilePath = NULL;
mBankName = NULL;
mLedColor = 0;
}
flashFlowScene::~flashFlowScene()
{
free(mFilePath);
}
void flashFlowScene::update()
{
if (mCurrentSceneId == 0)
{
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new filePickerScene(filePickerTypeBios), "", this, onFilePickerClosingCallback);
sceneManager::pushScene(container);
return;
}
if (mCurrentSceneId == 1)
{
char* fileName = fileSystem::getFileNameWithoutExtension(mFilePath);
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new keyboardScene(63, "Please enter a bank name...", "Bank Name:", fileName), "", this, onKeyboardClosingCallback);
sceneManager::pushScene(container);
return;
}
if (mCurrentSceneId == 2)
{
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new ledColorSelectorScene(), "", this, onLedColorClosingCallback);
sceneManager::pushScene(container);
return;
}
if (mCurrentSceneId == 3)
{
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new flashBankScene(mFilePath, mBankName, mLedColor), "", this, onFlashBankClosingCallback);
sceneManager::pushScene(container);
}
if (mCurrentSceneId == 4)
{
sceneManager::popScene();
}
}
void flashFlowScene::render()
{
}

View file

@ -0,0 +1,27 @@
#pragma once
#include "scene.h"
#include "filePickerScene.h"
#include "keyboardScene.h"
#include "ledColorSelectorScene.h"
#include "flashBankScene.h"
#include "..\xboxInternals.h"
class flashFlowScene : public scene
{
public:
flashFlowScene();
~flashFlowScene();
void update();
void render();
private:
uint32_t mCurrentSceneId;
char* mFilePath;
char* mBankName;
uint8_t mLedColor;
static void onFilePickerClosingCallback(sceneResult result, void* context, scene* scene);
static void onKeyboardClosingCallback(sceneResult result, void* context, scene* scene);
static void onLedColorClosingCallback(sceneResult result, void* context, scene* scene);
static void onFlashBankClosingCallback(sceneResult result, void* context, scene* scene);
};

View file

@ -0,0 +1,72 @@
#include "flashUpdateFlowScene.h"
#include "sceneManager.h"
#include "filePickerScene.h"
#include "flashUpdateScene.h"
#include "audioSettingsScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxInternals.h"
#include "..\fileSystem.h"
void flashUpdateFlowScene::onFilePickerClosingCallback(sceneResult result, void* context, scene* scene)
{
flashUpdateFlowScene* self = (flashUpdateFlowScene*)context;
if (result == sceneResultCancelled)
{
self->mCurrentSceneId = 2;
return;
}
filePickerScene* closingScene = (filePickerScene*)scene;
self->mFilePath = closingScene->getFilePath();
self->mCurrentSceneId = 1;
}
void flashUpdateFlowScene::onRFlashUpdateClosingCallback(sceneResult result, void* context, scene* scene)
{
flashUpdateFlowScene* self = (flashUpdateFlowScene*)context;
self->mCurrentSceneId = 2;
}
flashUpdateFlowScene::flashUpdateFlowScene(bool recovery)
{
mCurrentSceneId = 0;
mRecovery = recovery;
mFilePath = NULL;
}
flashUpdateFlowScene::~flashUpdateFlowScene()
{
free(mFilePath);
}
void flashUpdateFlowScene::update()
{
if (mCurrentSceneId == 0)
{
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new filePickerScene(mRecovery ? filePickerTypeUpdateRecovery : filePickerTypeUpdate), "", this, onFilePickerClosingCallback);
sceneManager::pushScene(container);
return;
}
if (mCurrentSceneId == 1)
{
sceneContainer* container = new sceneContainer(sceneItemGenericScene, new flashUpdateScene(mRecovery, mFilePath), "", this, onFilePickerClosingCallback);
sceneManager::pushScene(container);
return;
}
if (mCurrentSceneId == 2)
{
sceneManager::popScene();
}
}
void flashUpdateFlowScene::render()
{
}

View file

@ -0,0 +1,20 @@
#pragma once
#include "scene.h"
#include "..\xboxInternals.h"
class flashUpdateFlowScene : public scene
{
public:
flashUpdateFlowScene(bool recovery);
~flashUpdateFlowScene();
void update();
void render();
private:
uint32_t mCurrentSceneId;
bool mRecovery;
char* mFilePath;
static void onFilePickerClosingCallback(sceneResult result, void* context, scene* scene);
static void onRFlashUpdateClosingCallback(sceneResult result, void* context, scene* scene);
};

View file

@ -0,0 +1,183 @@
#include "flashUpdateScene.h"
#include "sceneManager.h"
#include "..\drawing.h"
#include "..\ssfn.h"
#include "..\component.h"
#include "..\fileSystem.h"
#include "..\utils.h"
#include "..\theme.h"
#include "..\stringUtility.h"
#include "..\Threads\flashUpdate.h"
flashUpdateScene::flashUpdateScene(bool recovery, const char* filePath)
{
mProgress = strdup("Ready");
mStarted = false;
mDone = false;
mFailed = false;
mFilePath = strdup(filePath);
mRecovery = recovery;
mUpdate = true;
}
flashUpdateScene::~flashUpdateScene()
{
free(mProgress);
free(mFilePath);
}
void flashUpdateScene::update()
{
if (mStarted == false)
{
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene(sceneResultCancelled);
return;
}
else if (inputManager::buttonPressed(ButtonX))
{
mStarted = true;
flashUpdate::startThread(mRecovery, mUpdate, mFilePath);
}
else if (inputManager::buttonPressed(ButtonY))
{
mUpdate = !mUpdate;
}
return;
}
// Back Action
if (mDone == true)
{
if (mFailed == false && inputManager::buttonPressed(ButtonB))
{
#ifndef TOOLS
if (mRecovery == true)
{
sceneManager::popScene(sceneResultDone);
return;
}
else
{
utils::reboot();
}
#else
sceneManager::popScene(sceneResultDone);
#endif
}
else if (mFailed == true && inputManager::buttonPressed(ButtonB))
{
mDone = false;
mFailed = false;
flashUpdate::startThread(mRecovery, mUpdate, mFilePath);
}
return;
}
if (mDone == false)
{
processResponse(flashUpdate::getResponse());
if (flashUpdate::completed() == true)
{
flashUpdate::closeThread();
mDone = true;
}
}
}
void flashUpdateScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please wait...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int yPos = (context::getBufferHeight() - (40 + 44)) / 2;
yPos += theme::getCenterOffset();
drawing::drawBitmapString(context::getBitmapFontMedium(), "Status", theme::getHeaderTextColor(), 193, yPos);
yPos += 40;
component::textBox(mProgress, false, false, horizAlignmentCenter, 193, yPos, 322, 44);
if (mStarted == false)
{
char* options = stringUtility::formatString("\xC2\xA3 To Confirm Update \xC2\xA4 Toggle Update/Restore (%s)", mUpdate ? "Update" : "Restore");
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), options, theme::getFooterTextColor(), horizAlignmentLeft, 40, theme::getFooterY(), 640);
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
free(options);
}
else if (mDone == true)
{
#ifndef TOOLS
if (mRecovery == true)
{
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), mFailed == true ? "\xC2\xA2 Retry" : "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
else
{
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), mFailed == true ? "\xC2\xA2 Retry" : "\xC2\xA2 Reboot", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
#else
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), mFailed == true ? "\xC2\xA2 Retry" : "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
#endif
}
}
void flashUpdateScene::setProgress(const char* message)
{
free(mProgress);
mProgress = strdup(message);
}
void flashUpdateScene::processResponse(flashUpdate::flashUpdateResponse response)
{
uint32_t currentStep;
uint32_t totalSteps;
flashUpdate::getProgress(currentStep, totalSteps);
if (response == flashUpdate::flashUpdateResponseNone)
{
setProgress("");
}
else if (response == flashUpdate::flashUpdateProcessing)
{
setProgress("Processing");
}
else if (response == flashUpdate::flashUpdateFailedToLoadFile)
{
setProgress("Failed to load file");
}
else if (response == flashUpdate::flashUpdateErasing)
{
char* progress = stringUtility::formatString("Step %i of %i - Erasing", currentStep, totalSteps);
setProgress(progress);
free(progress);
}
else if (response == flashUpdate::flashUpdateWriting)
{
char* progress = stringUtility::formatString("Step %i of %i - Writing", currentStep, totalSteps);
setProgress(progress);
free(progress);
}
else if (response == flashUpdate::flashUpdateVerifying)
{
char* progress = stringUtility::formatString("Step %i of %i - Verifying", currentStep, totalSteps);
setProgress(progress);
free(progress);
}
else if (response == flashUpdate::flashUpdateVerificationFailed)
{
mFailed = true;
char* progress = stringUtility::formatString("Step %i of %i - Failed", currentStep, totalSteps);
setProgress(progress);
free(progress);
}
else if (response == flashUpdate::flashUpdateDone)
{
setProgress("Done");
}
}

View file

@ -0,0 +1,27 @@
#pragma once
#include "scene.h"
#include "..\utils.h"
#include "..\Threads\flashUpdate.h"
#include "..\xboxInternals.h"
class flashUpdateScene : public scene
{
public:
flashUpdateScene(bool recovery, const char* filePath);
~flashUpdateScene();
void update();
void render();
private:
void setProgress(const char* message);
void processResponse(flashUpdate::flashUpdateResponse response);
private:
bool mStarted;
bool mDone;
bool mFailed;
char* mProgress;
char* mFilePath;
bool mRecovery;
bool mUpdate;
};

View file

@ -0,0 +1,151 @@
#include "formatDriveScene.h"
#include "sceneManager.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxConfig.h"
#include "..\theme.h"
#include "..\timeUtility.h"
#include "..\harddrive.h"
#include "..\Threads\hddFormat.h"
#include "..\Threads\hddInfo.h"
#include "..\XKUtils\XKHDD.h"
formatDriveScene::formatDriveScene(int32_t harddrive)
{
mHarddrive = harddrive;
mCounter = 0;
mProgress = strdup("Please wait...");
mIdeModel = strdup("Unknown");
mIdeSerial = strdup("Unknown");
mProcessing = false;
mInitialized = false;
mAllowFormat = false;
hddInfo::startThread(!!harddrive);
}
formatDriveScene::~formatDriveScene()
{
free(mProgress);
free(mIdeModel);
free(mIdeSerial);
}
void formatDriveScene::update()
{
if (mInitialized == false)
{
return;
}
// Exit Action
if (mProcessing == false && inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene();
return;
}
if(!mAllowFormat) {
return;
}
if (inputManager::buttonPressed(ButtonA))
{
if (mCounter >= 0 && mCounter < 1)
{
free(mProgress);
mProgress = strdup("Please Confirm again...");
mCounter++;
return;
}
}
if (mCounter == 1 && inputManager::buttonPressed(ButtonX)) {
mCounter++;
return;
}
if (mCounter == 2)
{
mProcessing = true;
hddFormat::startThread(mHarddrive);
free(mProgress);
mProgress = strdup("Please wait...");
mCounter++;
return;
}
if (mCounter == 3 && hddFormat::completed() == true)
{
mProcessing = false;
free(mProgress);
hddFormat::hddFormatResponse response = hddFormat::getResponse();
mProgress = strdup(response == hddFormat::hddFormatResponseFailure ? "Format failed." : "Format success.");
mCounter = 0;
return;
}
}
void formatDriveScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
char* title = stringUtility::formatString("Format %s Drive...", mHarddrive == 0 ? "Primary" : "Secondary");
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), title, theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
free(title);
int yPos = (context::getBufferHeight() - (30 + 30 + 40 + 44)) / 2;
yPos += theme::getCenterOffset();
char* ideModel = stringUtility::formatString("Model: %s", mIdeModel);
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), ideModel, theme::getTextColor(), horizAlignmentCenter, 40, yPos, 640);
free(ideModel);
yPos += 30;
char* ideSerial = stringUtility::formatString("Serial: %s", mIdeSerial);
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), ideSerial, theme::getTextColor(), horizAlignmentCenter, 40, yPos, 640);
free(ideSerial);
yPos += 30;
drawing::drawBitmapString(context::getBitmapFontMedium(), "Status", theme::getHeaderTextColor(), 193, yPos);
yPos += 40;
if (mInitialized == false)
{
if (hddInfo::completed() == true)
{
free(mIdeModel);
free(mIdeSerial);
mIdeModel = hddInfo::getModel();
mIdeSerial = hddInfo::getSerial();
hddInfo::closeThread();
mInitialized = true;
mAllowFormat = hddInfo::getResponse() != hddInfo::hddInfoResponseTimeout;
free(mProgress);
if(mAllowFormat) {
mProgress = strdup("Please Confirm...");
}
else {
mProgress = strdup("Unable to detect HDD");
}
}
}
component::textBox(mProgress, false, false, horizAlignmentCenter, 193, yPos, 322, 44);
if(!mProcessing) {
drawing::drawBitmapString(context::getBitmapFontSmall(), mCounter == 1 ? "\xC2\xA3 Confirm Again" : "\xC2\xA1 Confirm", mInitialized && mAllowFormat ? theme::getFooterTextColor() : theme::getTextDisabledColor(), 40, theme::getFooterY());
}
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", mProcessing == false && mInitialized ? theme::getFooterTextColor() : theme::getTextDisabledColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}

View file

@ -0,0 +1,25 @@
#pragma once
#include "scene.h"
#include "sceneManager.h"
#include "../pointerMap.h"
class formatDriveScene : public scene
{
public:
formatDriveScene(int32_t harddrive);
~formatDriveScene();
void update();
void render();
private:
int32_t mHarddrive;
int32_t mCounter;
char* mProgress;
bool mProcessing;
bool mNeedsReboot;
char* mIdeModel;
char* mIdeSerial;
bool mInitialized;
bool mAllowFormat;
};

View file

@ -0,0 +1,190 @@
#include "frontLedSelectorScene.h"
#include "sceneManager.h"
#include "launchScene.h"
#include "removeScene.h"
#include "audioSettingsScene.h"
#include "mainScene.h"
#include "..\context.h"
#include "..\drawing.h"
#include "..\component.h"
#include "..\ssfn.h"
#include "..\inputManager.h"
#include "..\settingsManager.h"
#include "..\hdmiDevice.h"
#include "..\stringUtility.h"
#include "..\xboxInternals.h"
#include "..\theme.h"
frontLedSelectorScene::frontLedSelectorScene(const char* ledSequence)
{
mSelectedControl = 0;
mLedSequence[0] = ledSequence[0];
mLedSequence[1] = ledSequence[1];
mLedSequence[2] = ledSequence[2];
mLedSequence[3] = ledSequence[3];
}
void frontLedSelectorScene::update()
{
// Cancel Action
if (inputManager::buttonPressed(ButtonB))
{
sceneManager::popScene(sceneResultDone);
return;
}
// Select Actions
if (inputManager::buttonPressed(ButtonA))
{
const char colors[5] = { "GRAO" };
if (mSelectedControl >= 0 && mSelectedControl <= 3)
{
mLedSequence[0] = colors[mSelectedControl];
}
else if (mSelectedControl >= 4 && mSelectedControl <= 7)
{
mLedSequence[1] = colors[mSelectedControl - 4];
}
else if (mSelectedControl >= 8 && mSelectedControl <= 11)
{
mLedSequence[2] = colors[mSelectedControl - 8];
}
else if (mSelectedControl >= 12 && mSelectedControl <= 15)
{
mLedSequence[3] = colors[mSelectedControl - 12];
}
}
// Left Actions
if (inputManager::buttonPressed(ButtonDpadLeft))
{
if (mSelectedControl >= 0 && mSelectedControl <= 3)
{
mSelectedControl = mSelectedControl > 0 ? mSelectedControl - 1 : 3;
}
else if (mSelectedControl >= 4 && mSelectedControl <= 7)
{
mSelectedControl = mSelectedControl > 4 ? mSelectedControl - 1 : 7;
}
else if (mSelectedControl >= 8 && mSelectedControl <= 11)
{
mSelectedControl = mSelectedControl > 8 ? mSelectedControl - 1 : 11;
}
else if (mSelectedControl >= 12 && mSelectedControl <= 15)
{
mSelectedControl = mSelectedControl > 12 ? mSelectedControl - 1 : 15;
}
}
// Right Actions
if (inputManager::buttonPressed(ButtonDpadRight))
{
if (mSelectedControl >= 0 && mSelectedControl <= 3)
{
mSelectedControl = mSelectedControl < 3 ? mSelectedControl + 1 : 0;
}
else if (mSelectedControl >= 4 && mSelectedControl <= 7)
{
mSelectedControl = mSelectedControl < 7 ? mSelectedControl + 1 : 4;
}
else if (mSelectedControl >= 8 && mSelectedControl <= 11)
{
mSelectedControl = mSelectedControl < 11 ? mSelectedControl + 1 : 8;
}
else if (mSelectedControl >= 12 && mSelectedControl <= 15)
{
mSelectedControl = mSelectedControl < 15 ? mSelectedControl + 1 : 12;
}
}
// Down Actions
if (inputManager::buttonPressed(ButtonDpadDown))
{
if (mSelectedControl >= 0 && mSelectedControl <= 3)
{
mSelectedControl += 4;
}
else if (mSelectedControl >= 4 && mSelectedControl <= 7)
{
mSelectedControl += 4;
}
else if (mSelectedControl >= 8 && mSelectedControl <= 11)
{
mSelectedControl += 4;
}
else if (mSelectedControl >= 12 && mSelectedControl <= 15)
{
mSelectedControl -= 12;
}
}
// Up Actions
if (inputManager::buttonPressed(ButtonDpadUp))
{
if (mSelectedControl >= 0 && mSelectedControl <= 3)
{
mSelectedControl += 12;
}
else if (mSelectedControl >= 4 && mSelectedControl <= 7)
{
mSelectedControl -= 4;
}
else if (mSelectedControl >= 8 && mSelectedControl <= 11)
{
mSelectedControl -= 4;
}
else if (mSelectedControl >= 12 && mSelectedControl <= 15)
{
mSelectedControl -= 4;
}
}
}
void frontLedSelectorScene::render()
{
component::panel(theme::getPanelFillColor(), theme::getPanelStrokeColor(), 16, 16, 688, 448);
drawing::drawBitmapStringAligned(context::getBitmapFontMedium(), "Please select a Front LED Colors...", theme::getHeaderTextColor(), theme::getHeaderAlign(), 40, theme::getHeaderY(), 640);
int32_t ledX = 112;
int32_t ledY = (context::getBufferHeight() - (4 * 48) - 4) / 2;
ledY += theme::getCenterOffset();
component::text("State 1:", false, horizAlignmentLeft, ledX + (100 * 0), ledY + (48 * 0), 96, 44);
component::button(mSelectedControl == 0, mLedSequence[0] == 'G', "Green", ledX + (100 * 1), ledY + (48 * 0), 96, 44);
component::button(mSelectedControl == 1, mLedSequence[0] == 'R', "Red", ledX + (100 * 2), ledY + (48 * 0), 96, 44);
component::button(mSelectedControl == 2, mLedSequence[0] == 'A', "Amber", ledX + (100 * 3), ledY + (48 * 0), 96, 44);
component::button(mSelectedControl == 3, mLedSequence[0] == 'O', "Off", ledX + (100 * 4), ledY + (48 * 0), 96, 44);
component::text("State 2:", false, horizAlignmentLeft, ledX + (100 * 0), ledY + (48 * 1), 96, 44);
component::button(mSelectedControl == 4, mLedSequence[1] == 'G', "Green", ledX + (100 * 1), ledY + (48 * 1), 96, 44);
component::button(mSelectedControl == 5, mLedSequence[1] == 'R', "Red", ledX + (100 * 2), ledY + (48 * 1), 96, 44);
component::button(mSelectedControl == 6, mLedSequence[1] == 'A', "Amber", ledX + (100 * 3), ledY + (48 * 1), 96, 44);
component::button(mSelectedControl == 7, mLedSequence[1] == 'O', "Off", ledX + (100 * 4), ledY + (48 * 1), 96, 44);
component::text("State 3:", false, horizAlignmentLeft, ledX + (100 * 0), ledY + (48 * 2), 96, 44);
component::button(mSelectedControl == 8, mLedSequence[2] == 'G', "Green", ledX + (100 * 1), ledY + (48 * 2), 96, 44);
component::button(mSelectedControl == 9, mLedSequence[2] == 'R', "Red", ledX + (100 * 2), ledY + (48 * 2), 96, 44);
component::button(mSelectedControl == 10, mLedSequence[2] == 'A', "Amber", ledX + (100 * 3), ledY + (48 * 2), 96, 44);
component::button(mSelectedControl == 11, mLedSequence[2] == 'O', "Off", ledX + (100 * 4), ledY + (48 * 2), 96, 44);
component::text("State 4:", false, horizAlignmentLeft, ledX + (100 * 0), ledY + (48 * 3), 96, 44);
component::button(mSelectedControl == 12, mLedSequence[3] == 'G', "Green", ledX + (100 * 1), ledY + (48 * 3), 96, 44);
component::button(mSelectedControl == 13, mLedSequence[3] == 'R', "Red", ledX + (100 * 2), ledY + (48 * 3), 96, 44);
component::button(mSelectedControl == 14, mLedSequence[3] == 'A', "Amber", ledX + (100 * 3), ledY + (48 * 3), 96, 44);
component::button(mSelectedControl == 15, mLedSequence[3] == 'O', "Off", ledX + (100 * 4), ledY + (48 * 3), 96, 44);
drawing::drawBitmapString(context::getBitmapFontSmall(), "\xC2\xA1 Select", theme::getFooterTextColor(), 40, theme::getFooterY());
drawing::drawBitmapStringAligned(context::getBitmapFontSmall(), "\xC2\xA2 Back", theme::getFooterTextColor(), horizAlignmentRight, 40, theme::getFooterY(), 640);
}
char* frontLedSelectorScene::getLedSequence()
{
return stringUtility::formatString("%c%c%c%c", mLedSequence[0], mLedSequence[1], mLedSequence[2], mLedSequence[3]);
}

View file

@ -0,0 +1,17 @@
#pragma once
#include "scene.h"
#include "..\xboxInternals.h"
class frontLedSelectorScene : public scene
{
public:
frontLedSelectorScene(const char* ledSequence);
void update();
void render();
char* getLedSequence();
private:
int mSelectedControl;
char mLedSequence[4];
};

Some files were not shown because too many files have changed in this diff Show more