commit b863647055736d187d52c5983d298e514cc26215 Author: anonymous Date: Fri Jul 11 21:30:41 2025 +0200 Upload diff --git a/Cerbios Bios/BootAnims/Modern/BootAnim.xbe b/Cerbios Bios/BootAnims/Modern/BootAnim.xbe new file mode 100644 index 0000000..b3d40e2 Binary files /dev/null and b/Cerbios Bios/BootAnims/Modern/BootAnim.xbe differ diff --git a/Cerbios Bios/BootAnims/Modern/bootanim.ini b/Cerbios Bios/BootAnims/Modern/bootanim.ini new file mode 100644 index 0000000..6820c87 --- /dev/null +++ b/Cerbios Bios/BootAnims/Modern/bootanim.ini @@ -0,0 +1,22 @@ +;Render Xbox Logo +XSplitRender = true + +;Render Xbox Text +TextRender = true + +;Background Color +BackgroundColor = #7477FF + +;Foreground Color (Text & Logo) +ForegroundColor = #FFFFFF + +;Animation Times (Frames) +Stable = 60 +BackgroundFadeIn = 30 +BackgroundHold = 30 +BackgroundFadeOut = 30 +ForegroundFadeIn = 30 +ForegroundHold = 30 +ForegroundFadeOut = 30 +BarnDoor = 20 +XSplit = 20 diff --git a/Cerbios Bios/BootAnims/Nyan Cat/BootAnim.xbe b/Cerbios Bios/BootAnims/Nyan Cat/BootAnim.xbe new file mode 100644 index 0000000..52d3cde Binary files /dev/null and b/Cerbios Bios/BootAnims/Nyan Cat/BootAnim.xbe differ diff --git a/Cerbios Bios/BootAnims/Nyan Cat/LICENSE b/Cerbios Bios/BootAnims/Nyan Cat/LICENSE new file mode 100644 index 0000000..0f6497c --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/LICENSE @@ -0,0 +1,24 @@ +Based on the works of K Lange, Peter Gordon, and Chris Torres + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to +do so, subject to the following conditions: +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the documentation + and/or other materials provided with the distribution. +* Neither the name of CERBIOS, nor the names of its contributors + may be used to endorse or promote products derived from this Software + without specific prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. diff --git a/Cerbios Bios/BootAnims/Nyan Cat/Readme.nfo b/Cerbios Bios/BootAnims/Nyan Cat/Readme.nfo new file mode 100644 index 0000000..0e8e839 --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/Readme.nfo @@ -0,0 +1,50 @@ + + +TTTTTTTTTTTTTTTTTTTTTTT HHHHHHHHH HHHHHHHHH DDDDDDDDDDDDD +T:::::::::::::::::::::T H:::::::H H:::::::H D::::::::::::DDD +T:::::::::::::::::::::T H:::::::H H:::::::H D:::::::::::::::DD +T:::::TT:::::::TT:::::T HH::::::H H::::::HH DDD:::::DDDDD:::::D +TTTTTT T:::::T TTTTTT H:::::H H:::::H D:::::D D:::::D + T:::::T H:::::H H:::::H D:::::D D:::::D + T:::::T H::::::HHHHH::::::H D:::::D D:::::D + T:::::T H:::::::::::::::::H D:::::D D:::::D + T:::::T H:::::::::::::::::H D:::::D D:::::D + T:::::T H::::::HHHHH::::::H D:::::D D:::::D + T:::::T H:::::H H:::::H D:::::D D:::::D + T:::::T H:::::H H:::::H D:::::D D:::::D + TT:::::::TT HH::::::H H::::::HH DDD:::::DDDDD:::::D + T:::::::::T ...... H:::::::H H:::::::H ...... D:::::::::::::::DD + T:::::::::T .::::. H:::::::H H:::::::H .::::. D::::::::::::DDD + TTTTTTTTTTT ...... HHHHHHHHH HHHHHHHHH ...... DDDDDDDDDDDDD + + + +----------- +DESCRIPTION +----------- + +Custom Boot animation for Cerbios V2.X based on the greatest internet meme NYAN CAT. + +----------------------------------------------------- + Instructions +----------------------------------------------------- + +Create a new folder called (Nyan Cat) in the root of your C:\Bootanims\ +Copy default.xbe into Nyan Cat Folder +Update Cerbios.ini with new path name + +BootAnimPath = \Device\Harddisk0\Partition2\BootAnims\Nyan Cat\default.xbe + + +----------------------------------------------------- + + +------ +THANKS +------ + +Team Cerbios for the amazing work they have done so far with this amazing bios & breathing some new life into the scene. +Massive shout out to all groups that are still working with the OG XBOX & making some sweet stuff after all these years. + +Source Code released & included for other teams to improve on & hopefully assist with creating new boot animations. We dont obfuscate or hide our code behind patch loaders or IPS. + diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/animation.h b/Cerbios Bios/BootAnims/Nyan Cat/source/animation.h new file mode 100644 index 0000000..86940e9 --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/animation.h @@ -0,0 +1,818 @@ +/* + * Pop Tart Cat animation frames + */ +#ifndef ANIMATION_H +#define ANIMATION_H + +const char frame0[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$''$-$$@','',,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$$$$$$$'**'$$$@''**',,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&'''++'@$$$$$-$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"++++++++++++++++++**''+'@$$$$$$$$'***''''****',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'**'''@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"++########++++++++''**''@$$$$$$-'*************',,,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$'***.'****.'**',,,,,,,,,,,,,,,,," +"####################''''@$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"##========########====''@@$$$-$$'*%%********%%',,,,,,,,,,,,,,,,," +"======================='@@@$$$$$$'***''''''**',,,,,,,,,,,,,,,,,," +"==;;;;;;;;.=======;;;;'''@@@@@@@@@'*********',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;'***''''''''''''''''''',,,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;'**'','*',,,,,'*','**',,,,,,,,,,,,,,,,,,,,," +";;,,,,,.,,;;;.;;;;,,,'''',,'',,,,,,,'',,'',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame1[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++'+++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"++++++++++++++++++'*'++'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"++########++++++++'*''''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################****'@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"###################''**'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"##========########==='''@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +"======================='@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +"==;;;;;;;;========;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**','*',,,,,,**','**',,,,,,,,,,,,,,,,,,,," +";;,,,.,,,,;;;;;;;;,,,,''',,,'',,,,,,''',,''',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,..,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame2[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,..,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +">>,,,,,,,>>>>>>>>,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"##+++++++########++++++'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"######################''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################'''''@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"==#######========#'****'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"==================='''='@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +";;=======;;;;;;;;======'@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";.;;;;;;;;;;;;;;;;;;;;;'*'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +".,.;;;;;;,,,,,,,,;;;;;;'**',**',,,,,,**','**',,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,''',,''',,,,,,''',,''',,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame3[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"##+++++++########++++++'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"#####################'''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"==#######========##****'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"=================='*'=='@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +";;=======;;;;;;;;=='==='@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,,;;;;;'**','*',,,,,,'*','**',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,''',,,'',,,,,,,'',,''',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame4[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>>''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$''$-$$@','',,,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$$$$'**'$$$@''**',,,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'''++'@$$$$$$$$'***''''****',,,,,,,,,,,,,,,,,," +"++########+++++++'**''''@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"#################'****''@$$$$$$-'*************',,,,,,,,,,,,,,,,," +"##################''''*'@$-$$$$$'***.'****.'**',,,,,,,,,,,,,,,,," +"##========########==='''@$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"======================='@@$$$-$$'*%%********%%',,,,,,,,,,,,,,,,," +"==;;;;;;;;========;;;;''@@@$$$$$$'***''''''**',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;''''@@@@@@@@@'*********',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;'***'''''''''''''''''''',,,,,,,,,,,,,,,,,,,," +";;,,,,,,,,;;;;;;;;,,'**','**,,,,,,'**,'**',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,''',,,'',,,,,,,'',,''',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,..,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame5[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>>''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$''$$$@@','',,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$'**'-$$@''**',,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$$$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"+++++++++++++++++++'+++'@$$$$$-$$'***''''****',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'*'++'@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"++########++++++++'*''''@$$$$$$$'*************',,,,,,,,,,,,,,,,," +"###################****'@$$$$$$-'***.'****.'**',,,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"##========########==='''@$$$$$$$'*%%********%%',,,,,,,,,,,,,,,,," +"======================='@@$$$-$$$'***''''''**',,,,,,,,,,,,,,,,,," +"==;;;;;;;;========;;;;''@@@$$$$$$$'*********',,,,,,,,,,,,,,,,,,." +";;;;;;;;;;;;;;;;;;;;;'*''@@@@@@@@@@''''''''',,,,,,,,,,,,,,,,,,,." +";;;;;;;;;;;;;;;;;;;;'***''''''''''''''''*',,,,,,,,,,,,,,,,,,,,,," +";;,,,,,,,,;;;;;;;;,,'**','**,,,,,,'**,'**',,,,,,,,,,,,,,,,,,..,." +",,,,,,,,,,,,,,,,,,,,''',,''',,,,,,''',,''',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame6[] = +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,..,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$''$-$$@','',,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$$$$$$$'**'$$$@''**',,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&'''&&'@$$$$$-$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'*''+'@$$$$$$$$'***''''****',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'**'''@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"##+++++++########++'**''@$$$$$$-'*************',,,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$'***.'****.'**',,,,,,,,,,,,,,,,," +"####################''''@$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"==#######========#####''@@$$$-$$'*%%********%%',,,,,,,,,,,,,,,,," +"======================='@@@$$$$$$'***''''''**',,,,,,,,,,,,,,,,,," +";;=======;;;;;;;;====='''@@@@@@@@@'*********',,,,,,,,,,,.,,,,,,," +";;;;;;;;;;;;;;;;;;;;;'***''''''''''''''''''',,,,,,,,,,.,,,.,,,,," +";;;;;;;;;;;;;;;;;;;;;'**'','*',,,,,'**,'**',,,,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,,;;;;'''',,'',,,,,,,'',,'',,,,,,,,,,,.,,,,,.,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame7[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++'+++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"++++++++++++++++++'*'++'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"##+++++++########+'*''''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################****'@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"###################''**'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"==#######========####'''@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +"======================='@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;=======;;;;;;;;======''@@@@@@@@@@'*********',,,.,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**','*',,,,,,**','**',,,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,,;;;;;''',,,'',,,,,,''',,''',,.,,,,.,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame8[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,..,...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>>''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"++########++++++++#####'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"######################''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################'''''@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"##========########'****'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"==================='''='@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +"==;;;;;;;;========;;;;;'@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;'*'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +";;,,,,,,,,;;;;;;;;,,,,,'**',**',,,,,,**'.'**',,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,''',,''',,,,,,''',,''',,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,"; + +const char frame9[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>>''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"++########++++++++#####'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"#####################'''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"##========########=****'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"=================='*'=='@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +"==;;;;;;;;========;';;;'@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +";;,,,,,,,,;;;;;;;;,,,,'**','*',,..,.**','**',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,''',,,'',,,,.,''',,''',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,"; + +const char frame10[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$''$-$$@','',,,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$$$$'**'$$$@''**',,,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'''++'@$$$$$$$$'***''''****',,,,,,,,,,,,,,,,,," +"##+++++++########'**''''@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"#################'****''@$$$$$$-'*************',,,,,,,,,,,,,,,,," +"##################''''*'@$-$$$$$'***.'****.'**',,,,,,,,,,,,,,,,," +"==#######========####'''@$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"======================='@@$$$-$$'*%%********%%',,,,,,,,,,,,,,,,," +";;=======;;;;;;;;=====''@@@$$$$$$'***''''''**',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;''''@@@@@@@@@'*********',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;'***'''''''''''''''''''',,,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,,;;;'**'.'**..,,,,'**''**',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,''',,,'',,,,,,,''',''',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame11[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$''$$$@@','',,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$'**'-$$@''**',,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$$$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"+++++++++++++++++++'+++'@$$$$$-$$'***''''****',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'*'++'@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"##+++++++########+'*''''@$$$$$$$'*************',,,,,,,,,,,,,,,,," +"###################****'@$$$$$$-'***.'****.'**',,,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"==#######========####'''@$$$$$$$'*%%********%%',,,,,,,,,,,,,,,,," +"======================='@@$$$-$$$'***''''''**',,,,,,,,,,,,,,,,,," +";;=======;;;;;;;;=.===''@@@$$$$$$$'*********',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;.'*''@@@@@@@@@@''''''''',,,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;'***''''''''''''''''*',,,,,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,.;;;'**','**,,,,,,'**''**',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,''',,''',,,,,,''',,''',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char * frames[] = { + frame0, + frame1, + frame2, + frame3, + frame4, + frame5, + frame6, + frame7, + frame8, + frame9, + frame10, + frame11, + NULL +}; + +#define FRAME_WIDTH 64 +#define FRAME_HEIGHT 64 + +#endif diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/default.vcproj b/Cerbios Bios/BootAnims/Nyan Cat/source/default.vcproj new file mode 100644 index 0000000..aa9001d --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/default.vcproj @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/dsstdfx.bin b/Cerbios Bios/BootAnims/Nyan Cat/source/dsstdfx.bin new file mode 100644 index 0000000..0308a0f Binary files /dev/null and b/Cerbios Bios/BootAnims/Nyan Cat/source/dsstdfx.bin differ diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/dsstdfx_bin.h b/Cerbios Bios/BootAnims/Nyan Cat/source/dsstdfx_bin.h new file mode 100644 index 0000000..b692ac8 --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/dsstdfx_bin.h @@ -0,0 +1,1167 @@ +const unsigned char dsstdfx_bin[] = { +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +0x00, 0x00, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00, 0xa8, 0x27, 0x00, 0x00, 0xe6, 0x07, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x44, 0x23, 0xef, 0xaf, 0x6a, 0xa8, 0x9f, +0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0x9b, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, +0xb7, 0xcc, 0xd2, 0x75, 0x6c, 0x58, 0x5e, 0xb6, 0xa8, 0x01, 0xf8, 0x0b, 0x05, 0xf5, 0x70, 0x3d, +0xd9, 0x27, 0x05, 0x12, 0xe2, 0x9e, 0x88, 0x8d, 0xe9, 0xbe, 0xcf, 0x75, 0xfe, 0x3d, 0x01, 0x86, +0xbc, 0xf5, 0x6e, 0x46, 0xcf, 0x69, 0xbf, 0x21, 0x15, 0x58, 0x40, 0x2c, 0x60, 0x1a, 0x80, 0xc3, +0x66, 0xd1, 0xb0, 0x6a, 0x72, 0x8d, 0xb9, 0x27, 0x84, 0x24, 0xfe, 0x7c, 0xe8, 0x10, 0x54, 0x56, +0x6c, 0x89, 0x46, 0xb1, 0x89, 0xbb, 0x90, 0x0b, 0xfa, 0xe2, 0x3f, 0x4d, 0x90, 0x92, 0x9c, 0xa1, +0xd2, 0x49, 0x94, 0x54, 0x5b, 0x15, 0x1b, 0x50, 0xd9, 0x28, 0x8c, 0x51, 0x62, 0xaf, 0xc0, 0x81, +0x95, 0x34, 0x6e, 0xd6, 0x1b, 0x2c, 0x41, 0x38, 0xf1, 0x26, 0x05, 0x92, 0x01, 0xc3, 0x14, 0x55, +0x5f, 0xe9, 0x6c, 0xc1, 0x0a, 0x77, 0x32, 0xda, 0x0d, 0x44, 0x23, 0xef, 0x8d, 0x6a, 0xa8, 0x9f, +0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, +0xb7, 0xcc, 0xd2, 0x75, 0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, +0x14, 0x27, 0x05, 0x12, 0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, +0xea, 0xf5, 0x6e, 0x46, 0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, +0xb0, 0x84, 0xb6, 0x6a, 0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, +0xf5, 0xa9, 0x6c, 0xb1, 0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, +0x92, 0x3c, 0x72, 0x54, 0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, +0x15, 0x34, 0x6e, 0xd6, 0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, +0x1b, 0xe9, 0x4c, 0xc1, 0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, +0xdd, 0xa9, 0x6b, 0x41, 0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, +0x74, 0xeb, 0x48, 0x42, 0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, +0xd6, 0xb9, 0x4e, 0x34, 0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, +0xad, 0xa0, 0xe8, 0x73, 0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, +0xa0, 0xe5, 0x66, 0x43, 0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, +0x87, 0xb1, 0x33, 0xa5, 0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, +0x85, 0xd5, 0xbe, 0x7e, 0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, +0x9d, 0x8e, 0xb9, 0xe8, 0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, +0xbc, 0x79, 0xb4, 0x65, 0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, +0x63, 0x29, 0x65, 0x3c, 0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, +0x1c, 0xc8, 0x5c, 0x39, 0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, +0x73, 0x3a, 0x41, 0x30, 0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, +0xda, 0xf5, 0xe0, 0x83, 0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, +0x5b, 0x6f, 0x29, 0x20, 0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, +0xb6, 0x04, 0xf6, 0x8a, 0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, +0xf8, 0xdc, 0x7f, 0xd1, 0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, +0xf7, 0xef, 0x88, 0x4d, 0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, +0x63, 0xed, 0xea, 0x00, 0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, +0x76, 0x0d, 0x7a, 0xca, 0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, +0xc1, 0x52, 0x9f, 0x5d, 0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, +0xdb, 0x0a, 0x1c, 0x19, 0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, +0xb3, 0x83, 0x37, 0x2b, 0xd5, 0x5d, 0xe1, 0x73, 0x0d, 0x44, 0x23, 0xef, 0x04, 0x6a, 0xa8, 0x9f, +0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0x9b, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, +0xb7, 0xcc, 0xd2, 0x75, 0x6c, 0x58, 0x5e, 0xb6, 0xa8, 0x01, 0xf8, 0x0b, 0x05, 0xf5, 0x70, 0x3d, +0xd9, 0x27, 0x05, 0x12, 0xe2, 0x9e, 0x88, 0x8d, 0xe9, 0xbe, 0xcf, 0x75, 0xfe, 0x3d, 0x01, 0x86, +0xbc, 0xf5, 0x6e, 0x46, 0xcf, 0x69, 0xbf, 0x21, 0x15, 0x58, 0x40, 0x2c, 0x60, 0x1a, 0x80, 0xc3, +0x66, 0xd1, 0xb0, 0x6a, 0x72, 0x8d, 0xb9, 0x27, 0x84, 0x24, 0xfe, 0x7c, 0xe8, 0x10, 0x54, 0x56, +0x6c, 0x89, 0x46, 0xb1, 0x89, 0xbb, 0x90, 0x0b, 0xfa, 0xe2, 0x3f, 0x4d, 0x90, 0x92, 0x9c, 0xa1, +0xd2, 0x49, 0x94, 0x54, 0x5b, 0x15, 0x1b, 0x50, 0xd9, 0x28, 0x8c, 0x51, 0x62, 0xaf, 0xc0, 0x81, +0x95, 0x34, 0x6e, 0xd6, 0x1b, 0x2c, 0x41, 0x38, 0xf1, 0x26, 0x05, 0x92, 0x01, 0xc3, 0x14, 0x55, +0x5f, 0xe9, 0x6c, 0xc1, 0x0a, 0x77, 0x32, 0xda, 0x0d, 0x44, 0x23, 0xef, 0x32, 0x6b, 0xa8, 0x9f, +0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0xd7, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, +0xb7, 0xcc, 0xd2, 0x75, 0xec, 0x7c, 0x17, 0xb6, 0xd6, 0x01, 0xf8, 0x0b, 0x45, 0x87, 0x47, 0x3d, +0xaf, 0x27, 0x25, 0x12, 0xc1, 0xf3, 0xa5, 0x8d, 0xb7, 0x7a, 0xd4, 0x75, 0x6c, 0xd9, 0xda, 0x86, +0xd4, 0xf7, 0xa6, 0x46, 0x63, 0x92, 0x84, 0x21, 0x91, 0x99, 0x44, 0x2c, 0x50, 0x52, 0x3c, 0xc3, +0x26, 0x89, 0xbc, 0x6a, 0x6f, 0x8d, 0xb9, 0x27, 0x0a, 0x05, 0xe3, 0x7c, 0xe8, 0xff, 0x56, 0x56, +0x9c, 0xa9, 0x6c, 0xb1, 0x12, 0x7a, 0x91, 0x0b, 0xfa, 0x52, 0x2d, 0x4d, 0x60, 0x1e, 0x00, 0xa1, +0xb4, 0x3c, 0x92, 0x54, 0xdc, 0x3a, 0x3d, 0x50, 0x9d, 0x28, 0xac, 0x51, 0x62, 0xc3, 0xdd, 0x81, +0x55, 0xa0, 0x52, 0xd6, 0x73, 0x33, 0x2d, 0x38, 0xf1, 0x5e, 0xc9, 0x92, 0x01, 0xef, 0x58, 0x55, +0xb9, 0xa9, 0xa1, 0xc1, 0x0a, 0x9f, 0x6e, 0xda, 0x22, 0x9a, 0x55, 0x58, 0xb6, 0x92, 0x5d, 0x50, +0x5d, 0x90, 0xa8, 0x41, 0x4a, 0xab, 0xbe, 0x02, 0xf6, 0x3f, 0xdf, 0x6e, 0x6f, 0x52, 0x34, 0x47, +0x74, 0xf1, 0xaa, 0x42, 0x7b, 0x21, 0x46, 0x12, 0xfe, 0xe0, 0x80, 0x2d, 0x50, 0x26, 0xfc, 0xa3, +0xae, 0xbc, 0x52, 0x34, 0x4c, 0xf2, 0xa1, 0xa2, 0x06, 0xfc, 0x92, 0x44, 0xe4, 0x84, 0x7c, 0x31, +0xed, 0x34, 0x0c, 0x73, 0x99, 0x88, 0x5a, 0x57, 0x5c, 0x91, 0xa8, 0x41, 0xca, 0x6b, 0x1e, 0x32, +0x39, 0x9b, 0x6c, 0x43, 0xc9, 0xff, 0x1e, 0xb2, 0xae, 0xd4, 0x3c, 0xcb, 0xed, 0x6e, 0xcf, 0x89, +0xb9, 0xc2, 0x6f, 0xa5, 0x94, 0x08, 0xcd, 0x8b, 0xd9, 0xa7, 0xe4, 0x75, 0x6c, 0x50, 0xb7, 0x06, +0x94, 0x01, 0x22, 0x7e, 0x37, 0x9d, 0xbd, 0x66, 0xe4, 0x55, 0x46, 0xd0, 0xa2, 0x63, 0x29, 0xd9, +0xc7, 0x8f, 0xb9, 0xe8, 0xc2, 0x78, 0xab, 0x9f, 0x42, 0x3b, 0xb5, 0x64, 0xf2, 0xcc, 0x99, 0x97, +0xfe, 0x3d, 0xba, 0x65, 0xf0, 0x19, 0x7b, 0x47, 0xf4, 0x55, 0x21, 0x22, 0x15, 0x5e, 0xa6, 0x1c, +0xff, 0xef, 0x66, 0x3c, 0x9e, 0xd7, 0x22, 0x52, 0x1e, 0x18, 0x7f, 0x51, 0xbc, 0xcf, 0x1c, 0xd1, +0xad, 0xb8, 0x56, 0x39, 0x4b, 0x19, 0x83, 0xc2, 0xb6, 0xbc, 0x3a, 0xca, 0x25, 0xac, 0x71, 0x59, +0xdd, 0xae, 0x49, 0x30, 0xe2, 0x8b, 0xbe, 0xa3, 0xc2, 0x7c, 0xb2, 0x64, 0xf4, 0x6c, 0x14, 0x37, +0x0c, 0xe1, 0xc8, 0x83, 0x69, 0x4f, 0xa4, 0x86, 0xc8, 0xf5, 0xee, 0x06, 0xb3, 0x74, 0x2b, 0x5d, +0x64, 0x6f, 0x29, 0x20, 0x3a, 0xb7, 0x2b, 0xbc, 0x2f, 0x26, 0xab, 0x3a, 0xec, 0x19, 0x63, 0xc2, +0xb6, 0x3d, 0xcc, 0x8a, 0xf9, 0xc5, 0x95, 0x95, 0x4b, 0x09, 0x6e, 0xc5, 0x9f, 0xb4, 0x0d, 0x49, +0xd9, 0xd2, 0x47, 0xd1, 0xa2, 0x92, 0x22, 0x29, 0x29, 0x62, 0x07, 0xa3, 0xf9, 0x96, 0xc8, 0x14, +0xff, 0x19, 0x84, 0x4d, 0xd0, 0x02, 0x02, 0x01, 0x12, 0x14, 0xfe, 0x8e, 0x7f, 0x5a, 0x78, 0x65, +0x63, 0x14, 0x18, 0x00, 0x6a, 0x67, 0x8a, 0x1e, 0x80, 0xa5, 0x8f, 0xbc, 0x14, 0xf6, 0x72, 0xba, +0x22, 0xf6, 0x7b, 0xca, 0x21, 0x75, 0x2d, 0x59, 0x61, 0x8e, 0xd7, 0xa0, 0xc2, 0xdd, 0xa2, 0x14, +0x7b, 0x21, 0x4e, 0x5d, 0xe4, 0xce, 0x1e, 0x50, 0x6d, 0x18, 0x86, 0xd1, 0xa4, 0xb3, 0x0c, 0xc9, +0x19, 0x72, 0xd6, 0x19, 0x3e, 0x40, 0x79, 0x5c, 0xa2, 0x6f, 0x09, 0x20, 0x06, 0x3d, 0x52, 0xac, +0xa7, 0xba, 0x89, 0x2b, 0xc9, 0x5d, 0xe1, 0x73, 0xce, 0x40, 0x1b, 0x17, 0x40, 0xe0, 0x67, 0x3c, +0x6b, 0xe7, 0xe5, 0x82, 0x69, 0x87, 0x1c, 0x66, 0x5a, 0x38, 0x84, 0xd0, 0x9c, 0x35, 0x4c, 0xa9, +0x33, 0x57, 0xed, 0x0b, 0xc8, 0xe4, 0x65, 0xbd, 0xaf, 0x53, 0x8b, 0xaa, 0x96, 0xbd, 0x11, 0xcb, +0x24, 0x5f, 0xf1, 0x89, 0x88, 0x84, 0x35, 0x65, 0x57, 0x6d, 0x2a, 0x20, 0xba, 0x13, 0x58, 0xcc, +0x16, 0x94, 0xbe, 0x59, 0x60, 0xe4, 0x55, 0xb0, 0xaf, 0x02, 0x78, 0x4b, 0x65, 0x15, 0x5b, 0xc1, +0xa7, 0x91, 0x50, 0x3a, 0xc0, 0x18, 0x83, 0xc2, 0x28, 0xd1, 0xb0, 0xea, 0x57, 0xac, 0x89, 0x0f, +0x04, 0x1b, 0x83, 0x4d, 0x60, 0xc2, 0x19, 0xd1, 0x5e, 0x08, 0xfc, 0x89, 0x06, 0x95, 0xc0, 0x25, +0x86, 0x5d, 0x22, 0x1c, 0xc4, 0x1e, 0xc6, 0x6c, 0x95, 0xe6, 0xb5, 0x67, 0x99, 0x0d, 0xf9, 0x87, +0x4f, 0x35, 0x6d, 0xc6, 0xdd, 0xa4, 0x88, 0x89, 0x1e, 0x3a, 0x13, 0x95, 0x42, 0xf5, 0x5d, 0xb4, +0x82, 0x00, 0xf8, 0x8b, 0x82, 0x85, 0x14, 0x55, 0xa5, 0x19, 0x7f, 0x51, 0x81, 0x13, 0xfc, 0x01, +0x52, 0x54, 0xfd, 0x0e, 0x3f, 0x22, 0x44, 0xad, 0xf1, 0x73, 0x34, 0xab, 0xa6, 0x7d, 0xb1, 0x9b, +0x85, 0xbe, 0x32, 0xa4, 0x14, 0xfd, 0x71, 0x3b, 0x28, 0xd6, 0xe2, 0x02, 0x08, 0xa7, 0x0a, 0x4e, +0xa8, 0xfe, 0x21, 0x21, 0x38, 0xe1, 0x66, 0xbc, 0xdf, 0x97, 0x4f, 0xba, 0x8c, 0xb9, 0x93, 0x0a, +0xc3, 0x8f, 0xe9, 0xfd, 0x27, 0xe8, 0x6a, 0xbe, 0xf6, 0x12, 0x0f, 0x1a, 0x3d, 0x5f, 0x27, 0x5c, +0x6f, 0x9f, 0x47, 0x30, 0x54, 0x1b, 0x00, 0x03, 0x96, 0x71, 0x7d, 0x5e, 0x57, 0x2e, 0x02, 0x20, +0xe5, 0x5c, 0x02, 0x1c, 0xb8, 0x76, 0xd8, 0x0c, 0x4f, 0xdb, 0xc3, 0x7d, 0x75, 0xfb, 0xe0, 0x76, +0xcb, 0xf3, 0x70, 0x47, 0x19, 0xe1, 0x57, 0xb1, 0x00, 0xc1, 0x58, 0x3b, 0xcd, 0xc9, 0x42, 0xe2, +0x18, 0xd9, 0xb4, 0xe8, 0xd7, 0x6c, 0x29, 0xdf, 0x9c, 0x0f, 0xf9, 0x88, 0xc2, 0x30, 0xff, 0x85, +0xd9, 0xb4, 0x4e, 0x36, 0x6b, 0x1c, 0x97, 0x12, 0x96, 0x58, 0xa4, 0xdd, 0xbb, 0x32, 0xaa, 0x98, +0xa6, 0x7e, 0xb1, 0xe4, 0x07, 0x68, 0xcd, 0xef, 0xba, 0x93, 0x3f, 0x2f, 0x80, 0x16, 0x14, 0x53, +0x13, 0x28, 0x8c, 0xd1, 0x2f, 0x6f, 0x48, 0xa9, 0x04, 0x02, 0x77, 0x4b, 0x17, 0xe0, 0xd7, 0x71, +0x4b, 0x32, 0x10, 0x97, 0x7b, 0x03, 0x56, 0xb4, 0x31, 0xd4, 0xae, 0xeb, 0xb3, 0x2b, 0xc9, 0xef, +0xd6, 0x06, 0x25, 0x9f, 0x7a, 0x80, 0xb6, 0x24, 0x3f, 0x48, 0x8c, 0x4c, 0x64, 0x94, 0xbc, 0xa1, +0x85, 0xbc, 0x32, 0xb4, 0x12, 0x0d, 0x49, 0x2a, 0xe7, 0xa0, 0x47, 0x33, 0x11, 0xcb, 0x95, 0x13, +0x4a, 0x58, 0xa4, 0x5d, 0x58, 0x7c, 0x5c, 0x40, 0x35, 0x64, 0x85, 0x52, 0xa3, 0x53, 0x5c, 0xb1, +0xaf, 0x95, 0x4e, 0xbb, 0x8a, 0xb7, 0x13, 0x4a, 0x1a, 0x6a, 0x0c, 0x91, 0x13, 0x03, 0x74, 0x45, +0x69, 0xb0, 0x40, 0xb2, 0x10, 0xfd, 0xf0, 0xfb, 0x52, 0xd6, 0xbe, 0x6e, 0x11, 0x0a, 0xf8, 0x07, +0x8a, 0x40, 0x88, 0x4e, 0xe1, 0x54, 0xdc, 0x71, 0x0d, 0x40, 0x1b, 0x97, 0x3d, 0x80, 0xb7, 0x24, +0x83, 0xb3, 0x04, 0x9c, 0xb8, 0xbe, 0xb7, 0x24, 0x68, 0x1d, 0x82, 0xcc, 0x1e, 0xff, 0x46, 0xa9, +0x28, 0xc0, 0x57, 0xbb, 0xcd, 0x39, 0x72, 0x3a, 0xf5, 0x66, 0xa5, 0xe2, 0x23, 0x02, 0xc4, 0x68, +0xc7, 0x70, 0x2f, 0xa7, 0xd3, 0xbc, 0xb0, 0x1b, 0x51, 0x01, 0x78, 0xfc, 0x28, 0x36, 0x0b, 0xde, +0xe4, 0x9a, 0xd3, 0xf8, 0x73, 0x69, 0xab, 0x1e, 0x40, 0xdf, 0x42, 0xac, 0x81, 0x7b, 0xb0, 0x9b, +0x42, 0x8f, 0xf2, 0x94, 0x82, 0x75, 0x1d, 0xd4, 0x98, 0x8b, 0xbc, 0xe9, 0x46, 0x25, 0x47, 0xaf, +0x2c, 0x43, 0x17, 0x1b, 0xbd, 0xf9, 0x59, 0xcc, 0x57, 0x4b, 0x7b, 0xd9, 0x1e, 0x28, 0x41, 0xb8, +0x71, 0x76, 0xb2, 0xea, 0x0d, 0x6d, 0x29, 0xdf, 0xa0, 0x21, 0x5b, 0xa8, 0xd6, 0x3d, 0x70, 0x3b, +0x61, 0x67, 0x25, 0x22, 0xc3, 0x52, 0x6c, 0x3c, 0x72, 0x65, 0xa5, 0x62, 0x99, 0x4f, 0x7f, 0xc0, +0xde, 0xc4, 0xd6, 0xfa, 0x2f, 0x1c, 0xd1, 0x6e, 0x4a, 0xb1, 0x4f, 0x37, 0xcb, 0xc4, 0x42, 0xe2, +0xa6, 0x3c, 0xd9, 0x68, 0xe8, 0x38, 0x03, 0x87, 0x4f, 0xb7, 0x4e, 0x36, 0x11, 0x6d, 0x19, 0x52, +0xb6, 0xa8, 0x4c, 0xb1, 0x12, 0xa3, 0x7e, 0xdb, 0xa2, 0xee, 0x87, 0x28, 0x56, 0xa9, 0xaf, 0x83, +0xcf, 0xf4, 0x6e, 0x46, 0xa3, 0x04, 0xf8, 0x01, 0x81, 0x54, 0x1e, 0x9e, 0xf7, 0xac, 0x74, 0x34, +0xab, 0xa1, 0x67, 0xc3, 0x5d, 0x77, 0x32, 0xda, 0x1c, 0x5b, 0x73, 0x48, 0xe1, 0x53, 0xdd, 0x71, +0x8d, 0x30, 0x6f, 0x47, 0xe0, 0x94, 0x3d, 0xe1, 0x17, 0xd9, 0x34, 0x28, 0xd3, 0xdb, 0x21, 0x53, +0x9e, 0x28, 0xab, 0xe1, 0xd1, 0x6f, 0x2e, 0xd8, 0x9b, 0x9b, 0x53, 0x38, 0x4c, 0x17, 0x03, 0x82, +0x56, 0xa0, 0xe4, 0x16, 0x3a, 0xe0, 0x67, 0x3c, 0x2f, 0x17, 0x02, 0x92, 0x00, 0xc3, 0x94, 0x95, +0x4e, 0x39, 0x74, 0xd5, 0xa2, 0xc5, 0xa5, 0x98, 0x45, 0xbc, 0xd1, 0xf4, 0x2c, 0xdc, 0xb5, 0x7e, +0x50, 0x37, 0xcc, 0x56, 0x61, 0xe5, 0xd5, 0xf0, 0x0d, 0x92, 0x40, 0x2f, 0xcf, 0xe1, 0xf6, 0xf3, +0x90, 0x45, 0x86, 0xcf, 0x20, 0xf4, 0x6c, 0xb9, 0x63, 0x08, 0xfa, 0x0a, 0x75, 0x10, 0x4f, 0xad, +0xac, 0x01, 0x77, 0x4b, 0x65, 0x4d, 0xf3, 0xa1, 0x55, 0x69, 0x7c, 0xc4, 0x1f, 0xf2, 0x6d, 0x39, +0x35, 0x66, 0x86, 0x52, 0x21, 0x13, 0xfc, 0x81, 0x52, 0xb4, 0xad, 0x66, 0x86, 0x65, 0x99, 0xa7, +0xc4, 0xb8, 0x91, 0x44, 0x94, 0xa1, 0xb7, 0xa1, 0x44, 0x3e, 0x92, 0x54, 0x8b, 0xa5, 0x35, 0xe0, +0xa3, 0x0e, 0xfa, 0x08, 0xc6, 0xf5, 0x70, 0xbd, 0x41, 0x44, 0x15, 0x1a, 0xbd, 0x15, 0xd9, 0x8c, +0x37, 0x3b, 0x94, 0xd5, 0x22, 0x05, 0xc5, 0x68, 0xc9, 0xf0, 0xef, 0x07, 0x84, 0x26, 0x48, 0xad, +0x66, 0x49, 0x1c, 0x1b, 0xbd, 0xa1, 0xb1, 0x8c, 0x45, 0x6e, 0xf9, 0x85, 0x89, 0x85, 0x35, 0x65, +0x19, 0xb8, 0xc4, 0x70, 0x9c, 0x0a, 0x78, 0x47, 0x86, 0x65, 0x86, 0x62, 0x63, 0xe2, 0x54, 0xb0, +0xff, 0xc1, 0xd8, 0xfb, 0xf2, 0x63, 0x26, 0xde, 0x5e, 0xda, 0xb3, 0xe8, 0x28, 0xeb, 0x69, 0x3f, +0x73, 0xe7, 0xc6, 0x72, 0xaa, 0xdb, 0x1d, 0xd7, 0x36, 0x49, 0x1c, 0x19, 0xbe, 0xca, 0xe5, 0xec, +0xcf, 0x13, 0xa0, 0x5f, 0xba, 0x4e, 0xde, 0xf0, 0x8d, 0x80, 0xff, 0x1f, 0x7f, 0x5e, 0x07, 0xcc, +0x2c, 0x0a, 0x7b, 0xc9, 0xa6, 0x04, 0x2c, 0xc9, 0x5e, 0x4a, 0x7c, 0xc9, 0xd6, 0x34, 0x4d, 0x29, +0x2f, 0x52, 0x24, 0xa3, 0xe9, 0x3f, 0xd6, 0x74, 0xcb, 0xf0, 0x8f, 0x57, 0xe1, 0xa5, 0x35, 0xe0, +0x97, 0x8e, 0xba, 0xe8, 0x46, 0xa7, 0x07, 0xcf, 0x9f, 0x8b, 0x3b, 0xa9, 0x96, 0x1c, 0xdf, 0x0b, +0x7a, 0x22, 0x0e, 0xfd, 0xbc, 0xa6, 0xaa, 0x8e, 0xb8, 0x3d, 0xd4, 0x65, 0xc4, 0xcd, 0xb8, 0xa7, +0x2e, 0xb4, 0xa6, 0xa4, 0x9c, 0x3c, 0x71, 0x2b, 0x6a, 0x1b, 0x5a, 0x63, 0xe5, 0xcf, 0x1e, 0x50, +0x6d, 0x2e, 0x06, 0x11, 0x3f, 0x63, 0xa4, 0x9d, 0xbf, 0x47, 0xed, 0xe4, 0x34, 0xb5, 0x65, 0x5f, +0xe0, 0xbb, 0x37, 0xd0, 0x6b, 0x88, 0x3b, 0xe9, 0x13, 0x87, 0x65, 0x3f, 0x55, 0x98, 0x42, 0xe2, +0x6f, 0x03, 0x75, 0x48, 0x66, 0x45, 0x58, 0x31, 0x61, 0xe0, 0x68, 0xc3, 0x09, 0x27, 0x47, 0xaa, +0xb4, 0x02, 0x77, 0x4b, 0x65, 0xc5, 0x18, 0xd1, 0x92, 0xd6, 0x5d, 0x09, 0xc6, 0xf5, 0x70, 0x3d, +0xf4, 0x25, 0x05, 0x12, 0xbd, 0x23, 0x44, 0x2d, 0x67, 0x93, 0x44, 0xb3, 0xa0, 0xbb, 0x90, 0x0b, +0xfa, 0x6a, 0xa8, 0xdd, 0x6f, 0x0c, 0xf9, 0x48, 0xd9, 0xda, 0xe0, 0x01, 0x9f, 0x69, 0xaa, 0x9e, +0x3c, 0xbf, 0xd1, 0x74, 0xec, 0x22, 0xb9, 0x96, 0xfc, 0x79, 0xd3, 0xf5, 0x64, 0xa9, 0x8b, 0x8e, +0x38, 0x0b, 0x34, 0x35, 0x8c, 0xd8, 0xc2, 0x22, 0x9b, 0xc2, 0xd7, 0x4c, 0x60, 0x43, 0x9d, 0xa1, +0xd5, 0x3a, 0x10, 0x14, 0x3d, 0x60, 0x27, 0x5c, 0x5f, 0x16, 0xa5, 0x40, 0x4a, 0xbf, 0xfe, 0x22, +0xfa, 0x9c, 0x42, 0xac, 0x10, 0x10, 0x92, 0x1b, 0x02, 0x15, 0x22, 0x1c, 0xb8, 0xee, 0x27, 0x4c, +0xd7, 0x4b, 0xf5, 0x71, 0x82, 0xd0, 0x16, 0x57, 0x5d, 0xe9, 0xec, 0x01, 0x2a, 0x2f, 0xb4, 0xfe, +0x10, 0xa7, 0xde, 0x7e, 0xf3, 0xc6, 0x1a, 0xd6, 0x9c, 0x39, 0x8f, 0xd9, 0x12, 0xb0, 0x8f, 0x08, +0x59, 0x0e, 0x60, 0xbd, 0x85, 0x85, 0xb5, 0x2a, 0x0a, 0x83, 0xeb, 0x83, 0x49, 0x69, 0x96, 0x96, +0x1c, 0xda, 0xb0, 0xe5, 0x94, 0xc8, 0xa5, 0x9f, 0x20, 0xda, 0xad, 0x64, 0xf4, 0x8c, 0x35, 0xd7, +0x6c, 0xdc, 0xb2, 0xe9, 0x31, 0x6d, 0xa9, 0x1f, 0x00, 0x6f, 0xa6, 0xdc, 0xbd, 0xcc, 0x19, 0xf8, +0x91, 0xa6, 0xca, 0xee, 0x14, 0x10, 0xff, 0x4f, 0x28, 0xbe, 0x41, 0x31, 0x55, 0x9b, 0x40, 0x63, +0xe6, 0x82, 0xac, 0x50, 0x22, 0x93, 0x9d, 0x11, 0xa3, 0x98, 0xc4, 0x6d, 0xf0, 0x9b, 0x79, 0x37, +0x6c, 0x91, 0x43, 0x33, 0xdf, 0x9a, 0xc0, 0xa3, 0x46, 0x8c, 0xb5, 0xe4, 0x44, 0x2d, 0xc9, 0x6f, +0xf8, 0x26, 0x15, 0x17, 0x38, 0x60, 0xa7, 0x1c, 0xff, 0x71, 0x23, 0x8c, 0x40, 0x02, 0x55, 0xb5, +0xa2, 0xc1, 0xd8, 0x7b, 0xed, 0x18, 0x3a, 0x56, 0x5c, 0x19, 0x7f, 0x51, 0xcc, 0x12, 0x7c, 0xc1, +0xe5, 0x91, 0x50, 0xba, 0x8a, 0xb9, 0x93, 0x0a, 0x7a, 0x6b, 0x01, 0x9d, 0xf8, 0x40, 0xee, 0x74, +0xbb, 0xc1, 0xd2, 0x77, 0x6e, 0x88, 0xbb, 0xa6, 0x44, 0xf5, 0x8e, 0xb4, 0x0c, 0xa1, 0xef, 0x1a, +0x02, 0xee, 0x66, 0x3c, 0x26, 0xd8, 0x22, 0x52, 0xde, 0xd8, 0x5f, 0xc1, 0x4b, 0x85, 0xb5, 0x2a, +0x19, 0xb7, 0xbd, 0xf3, 0x2d, 0xeb, 0x68, 0xbf, 0xa0, 0x43, 0x1b, 0x9a, 0xf7, 0x41, 0x57, 0xb4, +0xdb, 0x94, 0x4e, 0x3b, 0x54, 0x99, 0xc3, 0xa2, 0xc6, 0xcc, 0x55, 0x34, 0x50, 0x62, 0x24, 0x72, +0x4e, 0x5e, 0x2e, 0xb7, 0x5b, 0x8d, 0x09, 0xca, 0x3a, 0x4a, 0x9b, 0x59, 0x0d, 0xe4, 0xd5, 0x70, +0xd1, 0x70, 0x30, 0x27, 0xd3, 0xae, 0x83, 0x33, 0x2e, 0x60, 0x87, 0x53, 0x5c, 0x53, 0xdc, 0xf1, +0x0d, 0x62, 0xdf, 0xef, 0xbf, 0x66, 0x26, 0xdf, 0x23, 0xcf, 0x59, 0xb8, 0x8e, 0x5f, 0x0f, 0xaa, +0x2a, 0xf2, 0x74, 0xcb, 0xf0, 0x07, 0xfa, 0xc9, 0x99, 0x24, 0xd9, 0xe9, 0xf6, 0xad, 0x28, 0xdf, +0x67, 0xcf, 0x59, 0xb8, 0x8e, 0xe6, 0x32, 0x4a, 0xaa, 0x7f, 0xe1, 0x01, 0x3a, 0xe7, 0x6a, 0xbe, +0xe2, 0x12, 0x8f, 0xda, 0x39, 0x71, 0xaf, 0x18, 0x01, 0x2e, 0x9b, 0x4c, 0xd0, 0x8e, 0xc2, 0x21, +0xfe, 0x9c, 0x42, 0xac, 0xa0, 0xfc, 0x6e, 0xbb, 0x34, 0xc6, 0xd5, 0xfa, 0xad, 0x78, 0xa9, 0x8e, +0xb8, 0x40, 0x6f, 0xa5, 0x14, 0x2c, 0xc4, 0x6b, 0x6c, 0xac, 0x4a, 0x97, 0xfb, 0xc0, 0x97, 0x14, +0xfb, 0xd3, 0xc0, 0x8d, 0x30, 0xef, 0x5e, 0xb5, 0xa4, 0x81, 0xb8, 0xeb, 0x06, 0xd8, 0x33, 0x5f, +0xea, 0x2f, 0x89, 0x50, 0x10, 0x5e, 0x16, 0xd1, 0x29, 0x48, 0x9c, 0xd9, 0x9e, 0xe1, 0x6a, 0x38, +0x47, 0x78, 0x34, 0x22, 0xe9, 0xd2, 0xac, 0x9c, 0xc7, 0xff, 0x71, 0x44, 0x64, 0x44, 0x58, 0xb1, +0x07, 0xde, 0xe1, 0xcb, 0xd5, 0xc0, 0xa7, 0x19, 0x0d, 0x1e, 0x81, 0xcc, 0x4f, 0x7f, 0x06, 0x49, +0x6d, 0xea, 0x6b, 0xc1, 0x0a, 0xa7, 0x07, 0x4a, 0xb1, 0x34, 0x0e, 0xb1, 0x12, 0xab, 0x85, 0x0b, +0xcb, 0xc4, 0x56, 0x0d, 0x70, 0x8f, 0x0e, 0x4d, 0xf6, 0x2b, 0x0b, 0x11, 0x71, 0x8e, 0x0e, 0x4d, +0x6b, 0xeb, 0x6b, 0x41, 0xca, 0x87, 0x37, 0x62, 0xb5, 0xb2, 0xcf, 0xd0, 0x52, 0x7e, 0x86, 0x89, +0xd3, 0xfa, 0x73, 0x45, 0x64, 0xc4, 0x18, 0xd1, 0xe2, 0x56, 0x1d, 0xa9, 0xe6, 0xc8, 0xab, 0x9b, +0x56, 0xbe, 0x51, 0xb4, 0xdb, 0x4d, 0xe9, 0x7a, 0xc5, 0xf6, 0xed, 0x06, 0x75, 0x91, 0x0f, 0x4d, +0xed, 0xab, 0xcb, 0x71, 0x72, 0xdb, 0x9d, 0x97, 0x80, 0xa7, 0xc5, 0xd5, 0xcc, 0xc5, 0xa5, 0x98, +0xd3, 0xfe, 0x71, 0x44, 0xa0, 0x21, 0x77, 0xc1, 0x13, 0x84, 0x36, 0x2a, 0x55, 0x4d, 0xd4, 0x73, +0x1c, 0x2e, 0x09, 0x37, 0x9b, 0xad, 0x39, 0xe2, 0xb2, 0x8c, 0xba, 0xe8, 0x72, 0x98, 0x13, 0xcf, +0x77, 0x4b, 0x1b, 0x99, 0xfe, 0x11, 0x02, 0x04, 0xe7, 0x4b, 0x9b, 0x6e, 0x6f, 0xda, 0x1d, 0xd7, +0xc6, 0x57, 0x9d, 0x69, 0x46, 0x78, 0xa3, 0x97, 0x24, 0xb9, 0xd4, 0xf5, 0x7b, 0x1d, 0xd1, 0x6e, +0x3c, 0x33, 0x0f, 0x97, 0x7b, 0xd0, 0x22, 0xd4, 0x4c, 0x97, 0xbd, 0x59, 0x5e, 0x41, 0xda, 0xf0, +0x70, 0x0e, 0x79, 0xff, 0xf7, 0xdb, 0x30, 0x5e, 0xf4, 0x2f, 0x89, 0xd0, 0x51, 0x7e, 0x06, 0xc9, +0x41, 0x4a, 0x9b, 0x59, 0x5e, 0x41, 0x5a, 0xb0, 0x98, 0x5e, 0xa1, 0xeb, 0x35, 0x3d, 0xcc, 0x6f, +0xbb, 0x6d, 0xaa, 0x67, 0x43, 0x79, 0x23, 0x57, 0x68, 0xe9, 0x6c, 0xc1, 0x0a, 0x15, 0x90, 0x1a, +0x42, 0x5e, 0x82, 0x4c, 0xe2, 0x12, 0xfc, 0x81, 0xd5, 0xc5, 0x8d, 0x46, 0xe3, 0x04, 0xf8, 0x01, +0x90, 0x55, 0x1e, 0x9e, 0x77, 0x6c, 0x54, 0xc4, 0x73, 0xc5, 0x35, 0xaa, 0x12, 0xbd, 0x11, 0x4b, +0x5a, 0x1b, 0xcc, 0x81, 0xea, 0x17, 0xff, 0x86, 0x53, 0xb4, 0x4e, 0xb6, 0xdb, 0x4d, 0x69, 0x3a, +0x59, 0x66, 0xa5, 0x62, 0xd9, 0xbd, 0x7c, 0x30, 0x2d, 0xe0, 0xc7, 0xf3, 0x4e, 0xeb, 0xe8, 0xff, +0x10, 0x66, 0x5e, 0x2e, 0x4f, 0x0a, 0xc8, 0x83, 0x56, 0x37, 0x05, 0x16, 0xab, 0xdf, 0x69, 0x3c, +0xf4, 0xa7, 0xc5, 0x72, 0x71, 0xdb, 0x1d, 0xd7, 0x87, 0x09, 0xfc, 0x89, 0x06, 0x8d, 0x19, 0xb5, +0x2b, 0x08, 0x1c, 0xfb, 0x79, 0x1c, 0xd1, 0xee, 0xf8, 0x93, 0x3f, 0x2f, 0x4f, 0x70, 0xe2, 0x03, +0xd6, 0x94, 0xdd, 0x7e, 0x72, 0x46, 0xda, 0xf6, 0x0c, 0x62, 0xdf, 0x6f, 0xef, 0x5a, 0x70, 0x37, +0x5c, 0x25, 0x0a, 0x13, 0xb1, 0x23, 0x44, 0xad, 0x58, 0x56, 0x6d, 0x4b, 0x81, 0x95, 0x3d, 0xe1, +0x35, 0x7c, 0xb8, 0xe8, 0xab, 0x2d, 0x49, 0xaf, 0xa8, 0x13, 0x15, 0x8b, 0x85, 0xb3, 0x97, 0xa5, +0xd6, 0xfd, 0x12, 0x84, 0xf4, 0x80, 0xbb, 0xa5, 0x3f, 0xbd, 0x52, 0x34, 0xcc, 0x10, 0x5f, 0xd2, +0x1e, 0x72, 0xd7, 0x19, 0x1b, 0x21, 0x67, 0xac, 0xa7, 0xbf, 0x89, 0xab, 0x15, 0x24, 0xed, 0x9b, +0x42, 0x8d, 0xcd, 0x14, 0x6b, 0x95, 0x8d, 0x8c, 0x47, 0x3b, 0x93, 0x55, 0x4c, 0x54, 0xe1, 0x70, +0x47, 0xb0, 0x50, 0x37, 0x9b, 0x2d, 0x79, 0xc2, 0xa0, 0x84, 0x36, 0xaa, 0x15, 0x2d, 0xc4, 0xeb, +0xaf, 0x8f, 0x3a, 0x9f, 0x77, 0x6c, 0xd4, 0x04, 0x93, 0x56, 0xf7, 0x1e, 0x67, 0x93, 0x0c, 0xcc, +0xa7, 0x8b, 0x3b, 0x29, 0x96, 0x5d, 0x00, 0x03, 0x20, 0x54, 0x9e, 0x5e, 0x57, 0xc1, 0x5f, 0xc0, +0x25, 0x80, 0xbc, 0xea, 0x32, 0xed, 0x69, 0x3f, 0x70, 0x76, 0xc7, 0x02, 0xa9, 0x77, 0x2f, 0xde, +0x65, 0x0f, 0xf9, 0x88, 0x06, 0x0a, 0x59, 0xd5, 0x6b, 0x5c, 0x72, 0xc9, 0xa1, 0xb5, 0x8d, 0x89, +0x0a, 0x2f, 0x99, 0x55, 0xe5, 0xd0, 0x9f, 0x90, 0x3d, 0x88, 0xb7, 0x65, 0xb2, 0x31, 0xce, 0xe7, +0xf3, 0x98, 0x54, 0x38, 0xd2, 0xd9, 0xa3, 0x12, 0xcc, 0x0d, 0x2a, 0x9d, 0xdc, 0xbe, 0x16, 0x54, +0x2e, 0xbc, 0xc2, 0xf1, 0x8a, 0xab, 0x88, 0x0f, 0xcc, 0x0e, 0x29, 0x9d, 0xd8, 0x3e, 0x56, 0xb4, +0xab, 0xaf, 0x96, 0x4b, 0xa5, 0xd5, 0xbc, 0xa1, 0x6d, 0x7d, 0x32, 0x24, 0xd4, 0x0c, 0xc0, 0x93, +0x78, 0x6d, 0xfa, 0x85, 0x08, 0x45, 0x55, 0x35, 0xaa, 0x74, 0x5e, 0x43, 0x46, 0xd6, 0xa2, 0x12, +0xc0, 0x0d, 0x2a, 0x9d, 0x1f, 0x7e, 0xb6, 0xa4, 0xc0, 0x79, 0xd1, 0xf4, 0x76, 0xf8, 0xee, 0xfe, +0x08, 0x17, 0x7d, 0x4e, 0xdf, 0x82, 0xb9, 0xa1, 0x57, 0xbc, 0x52, 0xb4, 0x58, 0x8d, 0x89, 0x8a, +0x19, 0x3a, 0x93, 0xd5, 0x5c, 0x20, 0x4a, 0xa8, 0x2b, 0x42, 0x17, 0x9b, 0x7d, 0x51, 0xe2, 0xf4, +0x1f, 0xd1, 0x60, 0xbf, 0xdb, 0x4b, 0x68, 0x3a, 0x90, 0x66, 0x25, 0xa2, 0xaa, 0xb2, 0xbc, 0xa4, +0x39, 0x3d, 0x12, 0x94, 0xae, 0x35, 0xfd, 0x84, 0xb1, 0x75, 0xae, 0x66, 0x46, 0xf9, 0xe3, 0xf7, +0xf3, 0x91, 0xc0, 0x6f, 0x6f, 0x60, 0xda, 0x07, 0x54, 0x55, 0xfd, 0x0e, 0xc9, 0xe3, 0x64, 0x3d, +0xef, 0x57, 0xe6, 0xf2, 0x73, 0x16, 0xd2, 0xef, 0x24, 0x12, 0xff, 0x0f, 0x86, 0x8f, 0x0e, 0x4d, +0x54, 0xaa, 0x4b, 0x31, 0x8c, 0x26, 0xfa, 0x83, 0x6d, 0x34, 0x0e, 0x96, 0xf8, 0x44, 0x76, 0xc4, +0x6d, 0x35, 0x91, 0x5a, 0x57, 0x11, 0x7f, 0x40, 0xf5, 0x54, 0x21, 0x22, 0xea, 0x1f, 0x46, 0xac, +0x67, 0xf3, 0x74, 0x4b, 0xfd, 0x55, 0xdd, 0x71, 0xcd, 0xc0, 0xdb, 0xf7, 0xcc, 0x28, 0xcb, 0xee, +0x38, 0x46, 0x05, 0x8f, 0x61, 0x82, 0x34, 0x65, 0x34, 0xb8, 0xc4, 0x70, 0xd4, 0xcb, 0x18, 0x57, +0xdc, 0x87, 0x2a, 0x11, 0x82, 0xe3, 0x45, 0xad, 0xd2, 0x43, 0x97, 0xdb, 0x1d, 0x1f, 0x0e, 0x58, +0xe1, 0x5e, 0x1e, 0xa0, 0x01, 0xff, 0xf6, 0x84, 0x83, 0xe0, 0x38, 0x26, 0x71, 0x1c, 0x81, 0x43, +0x25, 0x31, 0x80, 0x52, 0xda, 0x53, 0xdc, 0x71, 0x4d, 0x00, 0xfb, 0x87, 0xf3, 0x39, 0xd2, 0x65, +0xe3, 0x5d, 0x1d, 0x20, 0x44, 0x1a, 0x01, 0xcc, 0x67, 0xde, 0xb1, 0xe9, 0x13, 0xed, 0x69, 0x3f, +0x1f, 0xb2, 0x3f, 0x32, 0x73, 0x9b, 0x40, 0x63, 0xe6, 0x82, 0xac, 0xd0, 0x62, 0xf3, 0xcd, 0x69, +0xb4, 0x32, 0x8f, 0x57, 0x5b, 0xbe, 0x5e, 0xc0, 0xb5, 0xb4, 0x51, 0xba, 0xf8, 0x39, 0x53, 0xaa, +0xda, 0x97, 0xcd, 0xfb, 0x07, 0xe9, 0xeb, 0xfe, 0xbf, 0x02, 0x27, 0x1e, 0xc1, 0x1e, 0xc6, 0x6c, +0x47, 0x83, 0xbc, 0x67, 0x19, 0x31, 0xce, 0x67, 0x64, 0x9d, 0xbd, 0xf0, 0xde, 0x8e, 0x3f, 0x6f, +0xf8, 0xa6, 0xd5, 0xf7, 0x8b, 0xa8, 0x8b, 0x0e, 0xc7, 0x0e, 0xa9, 0xdd, 0x3e, 0x6e, 0xae, 0x98, +0xc1, 0x10, 0x53, 0xa4, 0xd4, 0xbc, 0xb0, 0x1b, 0x5f, 0x1e, 0x81, 0x4c, 0x60, 0x44, 0x9d, 0xa1, +0x45, 0x8c, 0xb5, 0x64, 0x8f, 0xcc, 0x99, 0x97, 0x8c, 0xec, 0x3a, 0xa5, 0x32, 0xfc, 0x71, 0x3b, +0xa1, 0x73, 0x5f, 0x42, 0x4c, 0x17, 0x02, 0x02, 0x96, 0x24, 0x09, 0x8e, 0x9b, 0x77, 0x33, 0x75, +0x4b, 0x01, 0x7b, 0x47, 0x3d, 0x29, 0x4a, 0x21, 0x55, 0x49, 0x8c, 0x4c, 0x7f, 0x92, 0xbc, 0x21, +0xd6, 0x09, 0xac, 0x5c, 0xfe, 0xce, 0x1e, 0xd0, 0x1d, 0xe6, 0x7a, 0xd9, 0x5e, 0xf1, 0x4e, 0x28, +0x0c, 0x62, 0xa7, 0xe3, 0x19, 0x21, 0x8f, 0x18, 0x01, 0x6e, 0x26, 0x1c, 0xe9, 0x9e, 0x86, 0x8c, +0x87, 0x6e, 0xf9, 0x05, 0x22, 0x64, 0x25, 0x5d, 0xb0, 0x7a, 0x63, 0x40, 0xd2, 0xd7, 0x22, 0x52, +0x5e, 0x98, 0xbf, 0x71, 0xb8, 0xee, 0xef, 0xd7, 0x9c, 0x39, 0x8f, 0xd9, 0x56, 0x4c, 0x58, 0x18, +0x01, 0xee, 0x66, 0x3c, 0x80, 0x16, 0x02, 0x82, 0x4a, 0x34, 0x8e, 0x56, 0xdb, 0xc0, 0x26, 0xd0, +0x1d, 0xb8, 0xc2, 0xf9, 0x2e, 0x31, 0xe7, 0x9e, 0x50, 0x8f, 0xaf, 0xe4, 0x29, 0x6c, 0x29, 0xdf, +0x20, 0x26, 0x96, 0xb8, 0x8e, 0x69, 0x0f, 0x2a, 0x0a, 0x62, 0x07, 0x23, 0x39, 0xb6, 0xab, 0xfc, +0x8f, 0xaf, 0x61, 0x5e, 0xfa, 0x0e, 0xde, 0x80, 0x55, 0x1e, 0x11, 0xf6, 0xce, 0x68, 0x0b, 0x5e, +0x60, 0x15, 0xa6, 0x40, 0xa7, 0x97, 0xa2, 0xa2, 0xc6, 0xc7, 0xad, 0x04, 0x55, 0xa4, 0xa5, 0x8d, +0xc5, 0x86, 0x37, 0x25, 0x54, 0xc0, 0xef, 0xa3, 0x3a, 0x3c, 0x12, 0x94, 0xfc, 0xd0, 0xb3, 0x14, +0xfb, 0x29, 0x9a, 0x4d, 0xe0, 0xc2, 0x25, 0x51, 0x5d, 0x10, 0x28, 0x81, 0xea, 0xe5, 0xba, 0x16, +0x5e, 0x59, 0x04, 0x1d, 0xb8, 0x65, 0xe7, 0x6c, 0x37, 0x83, 0x31, 0xa7, 0xa5, 0x3c, 0x51, 0x2b, +0x6a, 0x0b, 0x2c, 0x83, 0x69, 0x57, 0x76, 0xe6, 0xbc, 0x4d, 0x7a, 0x58, 0xde, 0x88, 0x22, 0xb0, +0x2d, 0xf8, 0x1c, 0x7b, 0xcd, 0x09, 0x5b, 0xc6, 0x34, 0x2f, 0x19, 0x7a, 0x94, 0x09, 0xdb, 0x06, +0x14, 0xef, 0xc1, 0x0e, 0xe2, 0x62, 0x84, 0x1d, 0xff, 0x64, 0xfe, 0x6c, 0x99, 0x8a, 0x98, 0xa7, +0x75, 0x7d, 0x52, 0xa4, 0x89, 0xe1, 0x65, 0xbb, 0xac, 0xfb, 0x71, 0x4a, 0xe5, 0x79, 0xd2, 0x11, +0xfd, 0x64, 0xae, 0x0d, 0x3c, 0xe2, 0xe4, 0x7d, 0xcf, 0x99, 0x8f, 0xc6, 0x63, 0xf4, 0x4c, 0x29, +0xe4, 0x23, 0x87, 0xd3, 0xa1, 0x63, 0xa9, 0x99, 0x76, 0xbf, 0xd1, 0xf4, 0x30, 0x68, 0x2b, 0x5e, +0xe0, 0x81, 0x2b, 0x10, 0x02, 0x23, 0x65, 0xbd, 0x3c, 0x07, 0xf5, 0x8a, 0x05, 0x95, 0xc0, 0x25, +0x1b, 0x5c, 0x22, 0x1c, 0x44, 0xde, 0x66, 0x3c, 0x25, 0x26, 0x07, 0x92, 0xf4, 0x0a, 0xf6, 0x85, +0xc3, 0xc5, 0xd4, 0x76, 0x6a, 0x08, 0xfb, 0x86, 0x40, 0x74, 0xb0, 0xe6, 0x03, 0x6c, 0x89, 0x1f, +0x80, 0xff, 0x1e, 0xfc, 0x5a, 0xa6, 0x2a, 0x4e, 0xe6, 0x6a, 0x29, 0xa1, 0x7a, 0x57, 0x28, 0x44, +0xe7, 0x25, 0x86, 0x52, 0xe1, 0xa4, 0xbe, 0x11, 0x0d, 0x68, 0x1e, 0x9d, 0xfc, 0x3e, 0x56, 0x34, +0x6b, 0x19, 0x2c, 0x03, 0xa9, 0xee, 0x06, 0x2e, 0x68, 0x1a, 0x6b, 0x63, 0x59, 0x9f, 0x1c, 0x60, +0xe5, 0x5d, 0xac, 0x50, 0xe2, 0x03, 0x79, 0x41, 0xf4, 0xa4, 0x46, 0x32, 0xcd, 0x5b, 0xe0, 0xf3, +0x92, 0xd0, 0xe0, 0x7f, 0xe7, 0x59, 0xf8, 0x76, 0x4c, 0xdf, 0x6e, 0xd7, 0x5b, 0xf0, 0x4e, 0xa8, +0xb8, 0xc2, 0x57, 0xbb, 0x8d, 0x67, 0x72, 0x2a, 0x6a, 0x12, 0x04, 0x93, 0xfd, 0xc3, 0x94, 0x15, +0x7b, 0x89, 0x42, 0x3d, 0xc8, 0xff, 0x5e, 0xd2, 0x9e, 0x31, 0xf8, 0xe9, 0xb6, 0x3f, 0xab, 0x0f, +0x38, 0xdb, 0x44, 0xad, 0x38, 0x3a, 0xd0, 0x6b, 0x4a, 0x80, 0x70, 0x57, 0xdb, 0x00, 0xfa, 0x00, +0x14, 0x94, 0x3e, 0x2e, 0xcb, 0x5a, 0x60, 0x33, 0x58, 0xa1, 0xc6, 0xf3, 0x84, 0x2a, 0x4a, 0xaf, +0x98, 0xe3, 0xd9, 0xfb, 0x3d, 0x69, 0xab, 0x9e, 0x54, 0xf5, 0x73, 0xc4, 0x0f, 0x22, 0xcf, 0x69, +0x89, 0x72, 0x4f, 0x27, 0xbb, 0x9c, 0x21, 0x63, 0x32, 0x2e, 0x8c, 0x50, 0x95, 0x1d, 0x7e, 0x41, +0x75, 0x23, 0xc6, 0x82, 0x37, 0x47, 0x7a, 0x36, 0xd6, 0x61, 0x08, 0x23, 0x39, 0x3f, 0xea, 0x9c, +0x77, 0x3f, 0x71, 0xd4, 0x87, 0x6e, 0x2d, 0xd8, 0x21, 0x28, 0x3a, 0x38, 0xac, 0x99, 0xa3, 0xa2, +0xc6, 0xc4, 0x80, 0x24, 0xd2, 0x9d, 0x43, 0x63, 0x9f, 0x6d, 0xac, 0xe0, 0x26, 0xef, 0x6e, 0xb8, +0x31, 0x68, 0xb7, 0xfa, 0x6d, 0x69, 0x8a, 0x0e, 0x73, 0x9b, 0x43, 0xad, 0x90, 0xea, 0xb1, 0x0b, +0xfa, 0x9d, 0x5b, 0xad, 0x10, 0xfa, 0xc8, 0x7b, 0xd2, 0x06, 0x19, 0x06, 0xc3, 0x10, 0xc9, 0x8d, +0x09, 0x70, 0xd3, 0x75, 0xec, 0xfc, 0xd5, 0x16, 0x82, 0xd9, 0xe4, 0x7d, 0xe8, 0x96, 0xbf, 0x26, +0xce, 0x1d, 0x82, 0x4c, 0x60, 0x1e, 0x80, 0xe1, 0xf5, 0x87, 0x5a, 0x38, 0xce, 0x6d, 0x1d, 0x32, +0x5f, 0xe0, 0xe8, 0x03, 0x29, 0xb7, 0x8f, 0x8e, 0x0c, 0xfb, 0xf3, 0x05, 0xa4, 0x10, 0x88, 0x8d, +0x76, 0x64, 0x26, 0xa5, 0x94, 0xb7, 0x39, 0xcb, 0x1a, 0xe4, 0x79, 0x59, 0x1e, 0x91, 0x1e, 0x50, +0x1d, 0xa8, 0xcc, 0x71, 0x72, 0x5b, 0x19, 0xe7, 0xea, 0xe0, 0x5c, 0xb8, 0x0e, 0x31, 0xbd, 0xfa, +0x3c, 0xb3, 0xbf, 0xee, 0xbf, 0xed, 0x66, 0xbf, 0xb1, 0x87, 0xb5, 0x6a, 0xf5, 0x85, 0xc7, 0x17, +0xfc, 0x79, 0xe3, 0xfd, 0xc6, 0x9b, 0x28, 0xde, 0xb0, 0x47, 0x97, 0x58, 0xdb, 0x51, 0x5f, 0xb0, +0xad, 0x48, 0xca, 0x8b, 0x05, 0x55, 0xf4, 0x85, 0x39, 0x40, 0xf0, 0x06, 0xb3, 0xe2, 0xeb, 0xfd, +0x92, 0xd7, 0x5d, 0x3e, 0xc7, 0x8e, 0xcc, 0x12, 0x7e, 0xe8, 0x43, 0xad, 0x10, 0x10, 0x92, 0x1b, +0x42, 0xde, 0xc2, 0xec, 0x12, 0xeb, 0xe8, 0x7f, 0xd0, 0x47, 0xce, 0x66, 0x73, 0x87, 0x11, 0xe7, +0x6a, 0xa0, 0x3c, 0xa8, 0xa6, 0xde, 0xef, 0x7b, 0xcf, 0xf6, 0x6d, 0xc6, 0xa3, 0x7c, 0xe3, 0x09, +0xf9, 0x2a, 0xa4, 0x5d, 0x58, 0x7c, 0xdc, 0x00, 0x55, 0x54, 0x7d, 0xce, 0x0e, 0xf3, 0xec, 0x79, +0xd1, 0x46, 0x4e, 0xa6, 0x93, 0x4e, 0xb3, 0x8b, 0x3a, 0xd0, 0xb4, 0xe5, 0x34, 0xbd, 0x48, 0xbf, +0x30, 0xa6, 0x59, 0xda, 0x4a, 0xb0, 0x8d, 0x88, 0x49, 0xf7, 0xed, 0x05, 0x40, 0x64, 0x25, 0xdd, +0x63, 0x7f, 0x3b, 0xa8, 0x11, 0xa5, 0x13, 0x4b, 0x5a, 0xa2, 0xd7, 0x21, 0x2a, 0x23, 0x48, 0xac, +0xb0, 0x83, 0x37, 0x2b, 0xd5, 0x84, 0x9d, 0xf3, 0x8e, 0x29, 0xa3, 0xbf, 0x17, 0xb8, 0x8c, 0x0a, +0x7e, 0xda, 0x63, 0x3d, 0x0c, 0x46, 0x60, 0x32, 0x69, 0x98, 0xc6, 0xf3, 0x31, 0x23, 0x74, 0x5f, +0xe0, 0xaf, 0x49, 0x30, 0x62, 0x55, 0xde, 0xf3, 0x08, 0x10, 0x00, 0x8f, 0xff, 0x9b, 0x98, 0xf5, +0xc7, 0xe1, 0x5e, 0xbf, 0x07, 0x1f, 0x6f, 0x5a, 0xe5, 0x56, 0x2b, 0x20, 0xba, 0xe7, 0x5a, 0xcc, +0x17, 0xe5, 0x79, 0x59, 0x9e, 0x51, 0xfe, 0x80, 0x9a, 0xb4, 0x4e, 0x36, 0x4b, 0x48, 0x22, 0x62, +0x66, 0xc2, 0x8c, 0xe0, 0x9a, 0xd9, 0x2f, 0xd8, 0x21, 0x7f, 0xfa, 0x98, 0xee, 0x0b, 0xf9, 0x84, +0x51, 0x35, 0x8e, 0x56, 0x5b, 0x49, 0x83, 0x60, 0xa1, 0xdc, 0x6c, 0x40, 0x4a, 0xbe, 0xbf, 0x82, +0xd1, 0x4c, 0x90, 0xd6, 0x9b, 0x78, 0xa3, 0x68, 0x49, 0x82, 0xbc, 0x67, 0x84, 0x0c, 0xf9, 0x87, +0xc8, 0x75, 0x2e, 0x26, 0x53, 0x8d, 0x23, 0xe3, 0xb6, 0xca, 0x78, 0x48, 0x5e, 0x95, 0x3d, 0xe1, +0xb5, 0x9d, 0xd4, 0x78, 0xee, 0xc9, 0x1b, 0xd6, 0xd8, 0x49, 0x9a, 0x59, 0xe2, 0x99, 0xbd, 0xa0, +0x3d, 0x8c, 0xb4, 0xe4, 0xb4, 0x3d, 0x6b, 0x2f, 0x68, 0x2b, 0xac, 0x43, 0x49, 0x2b, 0xfe, 0xa2, +0x46, 0xfc, 0x92, 0xd4, 0x1c, 0x51, 0x33, 0x38, 0x6d, 0xe6, 0xe5, 0x02, 0x29, 0xb7, 0x8f, 0x0e, +0xfb, 0x1b, 0x83, 0x4d, 0x60, 0x42, 0x59, 0x31, 0xb5, 0xa0, 0xc8, 0xf3, 0x2d, 0xeb, 0x68, 0x3f, +0xf0, 0x09, 0xe7, 0xf2, 0x71, 0x6b, 0x09, 0x4f, 0x1e, 0x6b, 0xab, 0xe1, 0x9a, 0x61, 0x6f, 0x28, +0x29, 0x62, 0x08, 0x13, 0x54, 0xe3, 0x64, 0x3d, 0x6f, 0x17, 0xc6, 0x82, 0xa9, 0x47, 0x7b, 0x46, +0xd6, 0x25, 0x06, 0x12, 0xc1, 0xf2, 0xa5, 0x0d, 0x77, 0xdb, 0xbd, 0xfd, 0xa8, 0x1a, 0x45, 0xce, +0x1b, 0xcb, 0xdb, 0x79, 0x6e, 0x59, 0xde, 0xf6, 0xac, 0x91, 0xc0, 0xef, 0xaf, 0xc0, 0xea, 0xef, +0x48, 0x53, 0x80, 0xcf, 0x92, 0x72, 0x2c, 0xd9, 0x21, 0x7c, 0x7a, 0x58, 0xde, 0xbb, 0x7d, 0x30, +0x2d, 0x60, 0x87, 0x53, 0xee, 0x13, 0x7c, 0xc1, 0x35, 0xf4, 0xb5, 0x7a, 0xad, 0xc9, 0xba, 0xa6, +0xbf, 0x3d, 0x92, 0x54, 0x5c, 0x41, 0x1e, 0xe0, 0x5f, 0x59, 0x74, 0xc8, 0xdb, 0xb5, 0x8d, 0x89, +0x39, 0xae, 0xce, 0x15, 0xc4, 0x20, 0x47, 0xac, 0xa7, 0xb3, 0x54, 0xbb, 0xd0, 0x39, 0xd3, 0xea, +0x8a, 0x3c, 0xbd, 0x7f, 0x27, 0x86, 0x1b, 0x56, 0x28, 0xe9, 0xec, 0x81, 0xea, 0x99, 0x7b, 0xb6, +0xec, 0x01, 0x17, 0x9b, 0x7a, 0x41, 0x57, 0x34, 0xeb, 0xd1, 0x27, 0x93, 0xc1, 0x43, 0x75, 0x45, +0x9c, 0x65, 0xa6, 0x62, 0xd9, 0x7e, 0x7f, 0x30, 0x6d, 0x67, 0xf0, 0x23, 0x39, 0xe4, 0x5f, 0xbc, +0x1f, 0x83, 0x3b, 0x2a, 0x4f, 0x9d, 0xc1, 0x23, 0x06, 0xe6, 0x3d, 0xcc, 0x20, 0xa2, 0x09, 0xc9, +0x61, 0x4a, 0x9b, 0x59, 0xde, 0x99, 0x23, 0xb0, 0x2d, 0x89, 0xdc, 0x9b, 0x7d, 0xeb, 0x15, 0xe4, +0xe3, 0x8d, 0x59, 0xb8, 0x1d, 0x78, 0xb3, 0x9a, 0xc2, 0x4e, 0xd2, 0x64, 0xb4, 0x4c, 0xf8, 0x07, +0xbb, 0xd5, 0xde, 0x7e, 0xe7, 0x17, 0x3b, 0x56, 0x5c, 0xee, 0xb4, 0x01, 0x2a, 0xec, 0xe3, 0xfe, +0x80, 0x15, 0x83, 0xce, 0x26, 0xf2, 0xec, 0xf9, 0xd6, 0x03, 0x27, 0x9e, 0x2f, 0xfe, 0xf6, 0x84, +0x53, 0x05, 0x79, 0xc6, 0xb2, 0x34, 0xcd, 0xe9, 0x09, 0x5a, 0x83, 0x2f, 0xcf, 0x13, 0xdc, 0x13, +0x02, 0x98, 0xc4, 0xed, 0xb0, 0xc0, 0x6a, 0x2f, 0xa8, 0xa3, 0xe8, 0x03, 0x75, 0xe7, 0xea, 0xfe, +0x10, 0x65, 0xde, 0xee, 0xef, 0xaa, 0xa9, 0x1f, 0x2f, 0x5f, 0xa1, 0xdc, 0x18, 0x1e, 0x0f, 0xd8, +0x61, 0x4e, 0xfa, 0x88, 0x49, 0xc5, 0x95, 0x95, 0x3b, 0x88, 0x73, 0x55, 0x5c, 0x13, 0xc7, 0x80, +0x45, 0x70, 0xb4, 0x66, 0x72, 0x8c, 0xb9, 0xa7, 0x44, 0x3d, 0xf0, 0x94, 0x7c, 0xb4, 0x38, 0xc4, +0x35, 0xc5, 0x56, 0x3a, 0x4d, 0xc9, 0x96, 0x12, 0x96, 0x58, 0xa4, 0xdd, 0x18, 0x36, 0xf2, 0x18, +0x01, 0xf0, 0x63, 0x2c, 0x10, 0x1a, 0x61, 0xb3, 0xf9, 0xc0, 0xd8, 0x7b, 0xed, 0x99, 0x7a, 0xb6, +0x6c, 0x41, 0x77, 0xcb, 0xce, 0xf5, 0x6d, 0x39, 0x71, 0x97, 0x06, 0x22, 0xb9, 0x4d, 0xa4, 0x8c, +0x77, 0x3b, 0xf4, 0x85, 0xed, 0x04, 0x75, 0xc5, 0x33, 0x77, 0x75, 0xda, 0x1d, 0x72, 0x97, 0x18, +0x81, 0x59, 0xfa, 0x9c, 0xe8, 0x82, 0xb8, 0x24, 0x01, 0x1d, 0x82, 0x4c, 0xe0, 0x0c, 0xe1, 0x91, +0xbd, 0x48, 0x97, 0xd5, 0xa1, 0x30, 0x4f, 0x28, 0xe9, 0x6a, 0x8b, 0xb3, 0x91, 0xf2, 0xcc, 0x8b, +0xc6, 0xfa, 0xf3, 0x05, 0xc4, 0x9f, 0x3c, 0x4d, 0x67, 0xac, 0xa5, 0x61, 0xdb, 0x4f, 0xde, 0xf0, +0x8d, 0xaa, 0x52, 0xdf, 0x47, 0x6e, 0x0e, 0x58, 0xe1, 0xeb, 0xaa, 0x50, 0x62, 0x43, 0x59, 0x31, +0xe9, 0xa0, 0x48, 0xb3, 0x11, 0xb2, 0xac, 0xfb, 0x0e, 0x16, 0xfd, 0x8e, 0x6e, 0xd2, 0x96, 0x95, +0x5f, 0x39, 0x74, 0x55, 0x22, 0x10, 0xde, 0x70, 0x5d, 0xef, 0x69, 0x07, 0xb8, 0xa4, 0x24, 0xdd, +0x60, 0x3f, 0x8e, 0xd8, 0x18, 0x71, 0x2f, 0xd8, 0x35, 0xf6, 0x7b, 0x48, 0x1e, 0x15, 0x5d, 0xc1, +0xad, 0x85, 0xd5, 0x7a, 0xc3, 0x02, 0x76, 0xc6, 0xa9, 0xb4, 0xd8, 0x7a, 0xf1, 0x49, 0xdb, 0x76, +0x3a, 0x65, 0x38, 0xa7, 0x14, 0x7c, 0x31, 0x5b, 0x66, 0x18, 0xdd, 0x80, 0xea, 0xc7, 0x9a, 0x96, +0xc0, 0xf9, 0x74, 0x45, 0x52, 0xe0, 0x15, 0xd1, 0x1b, 0xc8, 0x5c, 0xb9, 0x2a, 0xab, 0xe7, 0x7a, +0x52, 0xb6, 0xcd, 0x76, 0xef, 0x48, 0x5b, 0x36, 0x5a, 0x35, 0x40, 0xb3, 0x10, 0x7b, 0xb0, 0x9b, +0x3f, 0x08, 0xd5, 0x74, 0xec, 0x48, 0x5b, 0x36, 0xf0, 0xa1, 0x48, 0x33, 0x63, 0xe7, 0x98, 0x13, +0x7c, 0x58, 0xa4, 0xdd, 0xbc, 0x64, 0x4a, 0xa8, 0x29, 0x42, 0x97, 0xdb, 0x87, 0x45, 0x27, 0x58, +0xe0, 0x2e, 0x09, 0x10, 0xbf, 0xf1, 0x90, 0x0d, 0xf7, 0x9b, 0x43, 0xad, 0x8c, 0x3a, 0xd0, 0x6b, +0xbc, 0xa6, 0x17, 0x97, 0xf7, 0x40, 0xd7, 0x74, 0xae, 0x47, 0xbc, 0xe7, 0xb3, 0xac, 0x09, 0x4f, +0xe4, 0xab, 0x4b, 0xb1, 0xa4, 0x47, 0x28, 0x5b, 0xe6, 0xae, 0x49, 0xb0, 0xaf, 0x69, 0x44, 0xab, +0x2a, 0x42, 0x97, 0x5b, 0xc7, 0x25, 0x37, 0x60, 0xe6, 0x2c, 0x8a, 0xd0, 0xa6, 0xe1, 0x88, 0x89, +0x39, 0x3a, 0x93, 0x55, 0x60, 0x10, 0x7f, 0x40, 0x70, 0x21, 0xe2, 0x82, 0xe9, 0x47, 0x5a, 0xb6, +0xa7, 0x15, 0x50, 0x3b, 0x4d, 0xd9, 0xa3, 0x92, 0x42, 0xb8, 0xd4, 0x75, 0x28, 0xbf, 0x16, 0x56, +0x9a, 0x29, 0xab, 0xe1, 0x73, 0xec, 0xf9, 0x48, 0x6d, 0x24, 0xe3, 0x01, 0x74, 0x20, 0xc7, 0x6e, +0x7e, 0x78, 0xb4, 0xe7, 0xa7, 0xac, 0x89, 0x0f, 0x13, 0x50, 0x20, 0x1d, 0xfe, 0x1e, 0x67, 0x3c, +0xbe, 0x98, 0x34, 0xa2, 0x6d, 0xcd, 0x7e, 0xc4, 0xf2, 0x4e, 0x19, 0x9a, 0x81, 0x81, 0xb7, 0x24, +0x83, 0x5d, 0x22, 0x9c, 0x0d, 0x44, 0x23, 0xef, 0x0c, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0xa2, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x7c, 0x17, 0xb6, 0x4b, 0x44, 0xea, 0x0b, 0x01, 0xd8, 0x67, 0x3d, 0xef, 0xb3, 0xc9, 0x12, +0xb0, 0x24, 0x7c, 0x8d, 0xbb, 0xae, 0xd9, 0x75, 0x2c, 0x08, 0xfb, 0x86, 0xb3, 0xe1, 0x71, 0x46, +0xaa, 0x27, 0x4a, 0x21, 0x66, 0xbe, 0x3e, 0x2c, 0xef, 0x3a, 0x7c, 0xc3, 0x55, 0xe7, 0xba, 0x6a, +0xd6, 0xa9, 0xb5, 0x27, 0xe3, 0x78, 0xde, 0x7c, 0x9c, 0xef, 0x20, 0x56, 0x5c, 0x99, 0x3f, 0xb1, +0x87, 0xbb, 0x90, 0x0b, 0x8f, 0x4f, 0x89, 0x4d, 0x83, 0x92, 0xbc, 0xa1, 0xc5, 0x4c, 0x95, 0x54, +0xd5, 0xd0, 0x1f, 0x50, 0xa9, 0xb1, 0x82, 0x51, 0xc7, 0x1e, 0xf6, 0x81, 0x17, 0x34, 0x8e, 0xd6, +0xdb, 0xe0, 0x6a, 0x38, 0xa5, 0x26, 0x05, 0x92, 0x32, 0x6e, 0x1e, 0x55, 0x58, 0xe9, 0x6c, 0xc1, +0xd8, 0xca, 0x28, 0xda, 0x24, 0x4e, 0x99, 0x58, 0x08, 0x64, 0x15, 0x50, 0x66, 0xe8, 0x6c, 0x41, +0x9b, 0x2a, 0xf8, 0x02, 0x0c, 0x94, 0xbe, 0x6e, 0x6f, 0x60, 0x5a, 0x47, 0xf4, 0xa8, 0x65, 0x42, +0xc9, 0x08, 0xc3, 0x12, 0xfe, 0xf6, 0x62, 0x2d, 0xd0, 0xc3, 0xc1, 0xa3, 0x46, 0x08, 0x31, 0x34, +0xa5, 0xad, 0xb9, 0xa2, 0xa1, 0xfc, 0x72, 0x44, 0xe4, 0xe8, 0x7e, 0x31, 0x6d, 0xad, 0xcc, 0x73, +0x31, 0xdb, 0x1d, 0x57, 0x68, 0xe9, 0x6c, 0x41, 0x19, 0xea, 0x58, 0x32, 0x67, 0xe0, 0x68, 0x43, +0x17, 0xea, 0x58, 0xb2, 0xb6, 0x00, 0x78, 0xcb, 0x4f, 0x80, 0x87, 0x89, 0xc0, 0x7a, 0x33, 0xa5, +0x61, 0x89, 0x8b, 0x8b, 0x46, 0xba, 0xd3, 0x75, 0x6c, 0x62, 0xd9, 0x06, 0x14, 0x73, 0xdd, 0x7e, +0x67, 0x59, 0x1b, 0x66, 0xe4, 0x83, 0xac, 0xd0, 0xa2, 0xc5, 0x2d, 0xd9, 0xa1, 0x3a, 0xda, 0xe8, +0xfb, 0xd8, 0xb3, 0x9f, 0xae, 0x7f, 0xb1, 0x64, 0xf4, 0x70, 0xba, 0x97, 0xcc, 0x84, 0xb0, 0x65, +0xb1, 0x39, 0x83, 0x47, 0x34, 0x65, 0x26, 0x22, 0xa9, 0x7f, 0xa8, 0x1c, 0x66, 0xdf, 0x61, 0x3c, +0x1e, 0xe3, 0x20, 0x52, 0xde, 0xc8, 0x48, 0x51, 0x0a, 0xd3, 0x3c, 0xd1, 0x1d, 0x23, 0x97, 0x39, +0xc4, 0x19, 0x63, 0xc2, 0xb6, 0x64, 0x4b, 0xca, 0x91, 0x85, 0x2f, 0x59, 0x31, 0xae, 0x69, 0x30, +0x52, 0x2f, 0xfd, 0xa3, 0x74, 0x7c, 0xd2, 0x64, 0x6a, 0x3c, 0x5b, 0x37, 0x6c, 0x18, 0x2c, 0x83, +0x69, 0xd1, 0xb7, 0x86, 0x14, 0xf5, 0x0e, 0x06, 0x5b, 0x64, 0x05, 0x5d, 0x5f, 0x04, 0xd7, 0x20, +0x3a, 0x4b, 0x39, 0xbc, 0xa5, 0xb2, 0x57, 0x3a, 0xee, 0xdb, 0x77, 0xc2, 0xb0, 0x04, 0xf6, 0x8a, +0xf4, 0xc5, 0xb5, 0x95, 0xd6, 0xf9, 0x94, 0xc5, 0xa4, 0x36, 0x2d, 0x49, 0xd9, 0x85, 0xab, 0xd1, +0xa2, 0x91, 0x10, 0x29, 0x69, 0x85, 0xec, 0xa3, 0xb9, 0xbf, 0xb6, 0x14, 0xa3, 0x19, 0xa4, 0x4d, +0x60, 0x48, 0xb2, 0x01, 0x15, 0x6b, 0xb3, 0x8e, 0x7f, 0xa8, 0x17, 0x65, 0xe3, 0xac, 0xe9, 0x00, +0xad, 0xa0, 0xab, 0x1e, 0x37, 0xef, 0x66, 0xbc, 0x09, 0xf6, 0x72, 0xba, 0x9f, 0x06, 0x95, 0xca, +0x25, 0x2a, 0x0c, 0x59, 0x61, 0x92, 0x0a, 0xa0, 0xfa, 0xbf, 0x96, 0x14, 0x7f, 0x59, 0xa4, 0x5d, +0xd8, 0xce, 0x1e, 0x50, 0x0d, 0x44, 0x23, 0xef, 0xa9, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, 0x14, 0x27, 0x05, 0x12, +0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, 0xea, 0xf5, 0x6e, 0x46, +0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, 0xb0, 0x84, 0xb6, 0x6a, +0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, 0xf5, 0xa9, 0x6c, 0xb1, +0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, 0x92, 0x3c, 0x72, 0x54, +0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, 0x15, 0x34, 0x6e, 0xd6, +0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, 0x1b, 0xe9, 0x4c, 0xc1, +0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, 0xdd, 0xa9, 0x6b, 0x41, +0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, 0x74, 0xeb, 0x48, 0x42, +0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, 0xd6, 0xb9, 0x4e, 0x34, +0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, 0xad, 0xa0, 0xe8, 0x73, +0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, 0xa0, 0xe5, 0x66, 0x43, +0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, 0x87, 0xb1, 0x33, 0xa5, +0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, 0x85, 0xd5, 0xbe, 0x7e, +0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, 0x9d, 0x8e, 0xb9, 0xe8, +0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, 0xbc, 0x79, 0xb4, 0x65, +0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, 0x63, 0x29, 0x65, 0x3c, +0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, 0x1c, 0xc8, 0x5c, 0x39, +0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, 0x73, 0x3a, 0x41, 0x30, +0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, 0xda, 0xf5, 0xe0, 0x83, +0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, 0x5b, 0x6f, 0x29, 0x20, +0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0xf6, 0x8a, +0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, 0xf8, 0xdc, 0x7f, 0xd1, +0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, 0xf7, 0xef, 0x88, 0x4d, +0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, 0x63, 0xed, 0xea, 0x00, +0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, 0x76, 0x0d, 0x7a, 0xca, +0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, 0xc1, 0x52, 0x9f, 0x5d, +0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, 0xdb, 0x0a, 0x1c, 0x19, +0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, 0xb3, 0x83, 0x37, 0x2b, +0xd5, 0x5d, 0xe1, 0x73, 0x0d, 0x44, 0x23, 0xef, 0xa0, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, 0x14, 0x27, 0x05, 0x12, +0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, 0xea, 0xf5, 0x6e, 0x46, +0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, 0xb0, 0x84, 0xb6, 0x6a, +0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, 0xf5, 0xa9, 0x6c, 0xb1, +0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, 0x92, 0x3c, 0x72, 0x54, +0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, 0x15, 0x34, 0x6e, 0xd6, +0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, 0x1b, 0xe9, 0x4c, 0xc1, +0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, 0xdd, 0xa9, 0x6b, 0x41, +0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, 0x74, 0xeb, 0x48, 0x42, +0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, 0xd6, 0xb9, 0x4e, 0x34, +0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, 0xad, 0xa0, 0xe8, 0x73, +0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, 0xa0, 0xe5, 0x66, 0x43, +0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, 0x87, 0xb1, 0x33, 0xa5, +0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, 0x85, 0xd5, 0xbe, 0x7e, +0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, 0x9d, 0x8e, 0xb9, 0xe8, +0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, 0xbc, 0x79, 0xb4, 0x65, +0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, 0x63, 0x29, 0x65, 0x3c, +0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, 0x1c, 0xc8, 0x5c, 0x39, +0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, 0x73, 0x3a, 0x41, 0x30, +0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, 0xda, 0xf5, 0xe0, 0x83, +0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, 0x5b, 0x6f, 0x29, 0x20, +0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0xf6, 0x8a, +0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, 0xf8, 0xdc, 0x7f, 0xd1, +0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, 0xf7, 0xef, 0x88, 0x4d, +0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, 0x63, 0xed, 0xea, 0x00, +0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, 0x76, 0x0d, 0x7a, 0xca, +0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, 0xc1, 0x52, 0x9f, 0x5d, +0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, 0xdb, 0x0a, 0x1c, 0x19, +0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, 0xb3, 0x83, 0x37, 0x2b, +0xd5, 0x5d, 0xe1, 0x73, 0x0d, 0x44, 0x23, 0xef, 0xf7, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, 0x14, 0x27, 0x05, 0x12, +0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, 0xea, 0xf5, 0x6e, 0x46, +0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, 0xb0, 0x84, 0xb6, 0x6a, +0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, 0xf5, 0xa9, 0x6c, 0xb1, +0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, 0x92, 0x3c, 0x72, 0x54, +0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, 0x15, 0x34, 0x6e, 0xd6, +0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, 0x1b, 0xe9, 0x4c, 0xc1, +0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, 0xdd, 0xa9, 0x6b, 0x41, +0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, 0x74, 0xeb, 0x48, 0x42, +0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, 0xd6, 0xb9, 0x4e, 0x34, +0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, 0xad, 0xa0, 0xe8, 0x73, +0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, 0xa0, 0xe5, 0x66, 0x43, +0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, 0x87, 0xb1, 0x33, 0xa5, +0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, 0x85, 0xd5, 0xbe, 0x7e, +0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, 0x9d, 0x8e, 0xb9, 0xe8, +0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, 0xbc, 0x79, 0xb4, 0x65, +0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, 0x63, 0x29, 0x65, 0x3c, +0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, 0x1c, 0xc8, 0x5c, 0x39, +0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, 0x73, 0x3a, 0x41, 0x30, +0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, 0xda, 0xf5, 0xe0, 0x83, +0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, 0x5b, 0x6f, 0x29, 0x20, +0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0xf6, 0x8a, +0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, 0xf8, 0xdc, 0x7f, 0xd1, +0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, 0xf7, 0xef, 0x88, 0x4d, +0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, 0x63, 0xed, 0xea, 0x00, +0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, 0x76, 0x0d, 0x7a, 0xca, +0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, 0xc1, 0x52, 0x9f, 0x5d, +0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, 0xdb, 0x0a, 0x1c, 0x19, +0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, 0xb3, 0x83, 0x37, 0x2b, +0xd5, 0x5d, 0xe1, 0x73, 0x0d, 0x44, 0x23, 0xef, 0xde, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, 0x14, 0x27, 0x05, 0x12, +0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, 0xea, 0xf5, 0x6e, 0x46, +0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, 0xb0, 0x84, 0xb6, 0x6a, +0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, 0xf5, 0xa9, 0x6c, 0xb1, +0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, 0x92, 0x3c, 0x72, 0x54, +0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, 0x15, 0x34, 0x6e, 0xd6, +0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, 0x1b, 0xe9, 0x4c, 0xc1, +0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, 0xdd, 0xa9, 0x6b, 0x41, +0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, 0x74, 0xeb, 0x48, 0x42, +0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, 0xd6, 0xb9, 0x4e, 0x34, +0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, 0xad, 0xa0, 0xe8, 0x73, +0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, 0xa0, 0xe5, 0x66, 0x43, +0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, 0x87, 0xb1, 0x33, 0xa5, +0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, 0x85, 0xd5, 0xbe, 0x7e, +0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, 0x9d, 0x8e, 0xb9, 0xe8, +0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, 0xbc, 0x79, 0xb4, 0x65, +0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, 0x63, 0x29, 0x65, 0x3c, +0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, 0x1c, 0xc8, 0x5c, 0x39, +0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, 0x73, 0x3a, 0x41, 0x30, +0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, 0xda, 0xf5, 0xe0, 0x83, +0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, 0x5b, 0x6f, 0x29, 0x20, +0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0xf6, 0x8a, +0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, 0xf8, 0xdc, 0x7f, 0xd1, +0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, 0xf7, 0xef, 0x88, 0x4d, +0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, 0x63, 0xed, 0xea, 0x00, +0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, 0x76, 0x0d, 0x7a, 0xca, +0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, 0xc1, 0x52, 0x9f, 0x5d, +0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, 0xdb, 0x0a, 0x1c, 0x19, +0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, 0xb3, 0x83, 0x37, 0x2b, +0xd5, 0x5d, 0xe1, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x08, 0x00, 0x00, +0x26, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, +0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, +0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, +0xd0, 0xfe, 0x3f, 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, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x40, 0x17, 0x00, 0x00, 0x26, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0xfd, 0xe3, 0x1f, 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, 0xca, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x26, 0x04, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, +0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, +0x46, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, +0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, +0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 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, 0xca, 0x00, 0x00, 0x60, 0xcc, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 0x00, 0x40, 0x15, 0x00, 0x00, +0xc0, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, +0x66, 0x04, 0x00, 0x00, 0x86, 0x04, 0x00, 0x00, 0xa6, 0x04, 0x00, 0x00, 0xc6, 0x04, 0x00, 0x00, +0xe6, 0x04, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, 0x46, 0x05, 0x00, 0x00, +0x66, 0x05, 0x00, 0x00, 0x86, 0x05, 0x00, 0x00, 0xa6, 0x05, 0x00, 0x00, 0xc6, 0x05, 0x00, 0x00, +0xe6, 0x05, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00, +0x66, 0x06, 0x00, 0x00, 0x86, 0x06, 0x00, 0x00, 0xa6, 0x06, 0x00, 0x00, 0xc6, 0x06, 0x00, 0x00, +0xe6, 0x06, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, +0x66, 0x07, 0x00, 0x00, 0x86, 0x07, 0x00, 0x00, 0xa6, 0x07, 0x00, 0x00, 0xc6, 0x07, 0x00, 0x00, +0xe6, 0x07, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x9f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xbf, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xef, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x76, 0x01, 0x00, 0xa0, 0x02, 0x00, 0x00, +0x10, 0x03, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, +0xb0, 0x06, 0x00, 0x00, 0x90, 0x0e, 0x00, 0x00, 0xb0, 0x07, 0x00, 0x00, 0xa0, 0x46, 0x00, 0x00, +0xc0, 0x5d, 0x00, 0x00, 0x20, 0x53, 0x00, 0x00, 0x50, 0x5a, 0x00, 0x00, 0x20, 0x53, 0x00, 0x00, +0x60, 0x31, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, +0x90, 0x02, 0x00, 0x00, 0xf0, 0x6b, 0x01, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x01, 0x00, 0x80, 0x00, +0x01, 0x00, 0x80, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x7f, 0x00, +0x01, 0x00, 0x80, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x19, 0x00, +0x4e, 0x02, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, +0xea, 0x65, 0x00, 0x00, 0xea, 0x65, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x59, 0xdb, 0x10, 0x00, 0xa6, 0x24, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0x1d, 0x00, +0xde, 0xe6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0x1d, 0x00, 0xde, 0xe6, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0x1d, 0x00, 0xde, 0xe6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, +0xe6, 0xc1, 0x08, 0x00, 0xc9, 0x2f, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x69, 0x0a, 0x00, +0x38, 0xfd, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x7d, 0x0c, 0x00, 0x4b, 0xea, 0x4d, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0xa4, 0x0e, 0x00, 0xcf, 0x4c, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, +0x29, 0xea, 0x4b, 0x00, 0x3c, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xea, 0x4b, 0x00, +0x3c, 0x94, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, +0xcd, 0xcc, 0xcc, 0x00, 0x33, 0x33, 0x33, 0x00, 0xcd, 0xcc, 0xcc, 0x00, 0xcd, 0xcc, 0xcc, 0x00, +0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, +0xc0, 0x15, 0x00, 0x00, 0x50, 0x1a, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xb0, 0x26, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x60, 0x96, 0x06, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0xc0, 0x14, 0x00, 0x00, 0xe0, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x20, 0x15, 0x00, 0x00, +0x00, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 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, 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, 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, +0x60, 0x96, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x60, 0x17, 0x00, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0xa0, 0x8f, 0x3e, 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, 0x60, 0xa0, 0x06, 0x00, +0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x17, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa0, 0x8f, 0x3e, 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, 0x60, 0xaa, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x17, 0x00, 0x00, +0xa0, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa0, 0x8f, 0x3e, 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, 0x60, 0xb4, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x17, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, 0xa0, 0x8f, 0x3e, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, +0xa8, 0x27, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0x60, 0x28, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x98, 0x0a, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, +0xfc, 0x28, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x0b, 0x00, 0x00, 0xec, 0x12, 0x00, 0x00, +0xb4, 0x29, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xca, 0x00, 0x00, 0x60, 0xcc, 0x05, 0x00, 0x14, 0x1e, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, +0x5c, 0x32, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0x96, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0xd0, 0x33, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0x96, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xd4, 0x21, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0x6c, 0x34, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0xa0, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xc4, 0x23, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0x08, 0x35, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0xaa, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xb4, 0x25, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0xa4, 0x35, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0xb4, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x78, 0xd2, 0x61, 0x28, 0x96, 0x43, 0x23, 0xc8, +0xc9, 0xbd, 0x98, 0xed, 0xf9, 0x7d, 0xc4, 0x15, 0x62, 0x69, 0xbe, 0x7a, 0x43, 0x5a, 0x36, 0xce, +0xc6, 0x3b, 0x55, 0x8e, 0x49, 0xe5, 0xf0, 0x2f, 0x55, 0x63, 0xb9, 0xfc, 0x84, 0xba, 0xe6, 0xa6, +0x9a, 0x45, 0xac, 0x03, 0x08, 0x7c, 0x47, 0xd6, 0xc2, 0x39, 0x56, 0x8e, 0xc9, 0xa5, 0x50, 0xdf, +0x3d, 0x77, 0x33, 0x3f, 0xe2, 0x09, 0x1e, 0x3a, 0x90, 0xde, 0xe7, 0x65, 0xf5, 0x93, 0xdb, 0x1c, + +}; +#define DSSTDFX_SIZE sizeof(dsstdfx) diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/externals.h b/Cerbios Bios/BootAnims/Nyan Cat/source/externals.h new file mode 100644 index 0000000..6383013 --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/externals.h @@ -0,0 +1,1526 @@ +// Thanks and credit to everlame, Team Evox, and Woodoo. +// +// This file contains declarations for accessing the internal NT API. +// Some calls have changed from NT, so be careful! +// +// For the most part, all NT calls use ANSI instead of Unicode strings now. +// +// It is not known which flags work. You will have to experiment. + +#ifndef __XBOX_INTERNAL_H__ +#define __XBOX_INTERNAL_H__ + +#include + +// Do extern "C" for C++ +#if defined(__cplusplus) && !defined(XBOXINTERNAL_NO_EXTERN_C) +extern "C" { +#endif // __cplusplus + + +// Don't do __declspec(dllimport) for things like emulators +#if defined(NTSYSAPI) && defined(DONT_IMPORT_INTERNAL) +#undef NTSYSAPI +#endif +#ifdef DONT_IMPORT_INTERNAL +#define NTSYSAPI +#endif + +// The normal headers don't have this...? +#define FASTCALL __fastcall + +// The usual NTSTATUS +typedef LONG NTSTATUS; + +// The usual NT_SUCCESS +#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) + +// Just for documentation +#define EXPORTNUM(x) + + +// Needed for object structures and related things +typedef CONST SHORT CSHORT; + + +// String types +typedef CHAR *PSZ; +typedef CONST CHAR *PCSZ; + +// ANSI_STRING +// Differences from NT: None. +typedef struct _STRING { + USHORT Length; + USHORT MaximumLength; + PCHAR Buffer; +} STRING; +typedef STRING *PSTRING; + +typedef STRING ANSI_STRING; +typedef PSTRING PANSI_STRING; + + +// IO Status Block type (UNVERIFIED) +// Differences from NT: None. +typedef struct _IO_STATUS_BLOCK { + union { + NTSTATUS Status; + PVOID Pointer; + }; + + ULONG_PTR Information; +} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; + +// APC routine +typedef +VOID +(NTAPI *PIO_APC_ROUTINE) ( + IN PVOID ApcContext, + IN PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG Reserved + ); + + +// Header for dispatcher objects +// Differences from NT: None. +typedef struct _DISPATCHER_HEADER { + UCHAR Type; + UCHAR Absolute; + UCHAR Size; + UCHAR Inserted; + LONG SignalState; + LIST_ENTRY WaitListHead; +} DISPATCHER_HEADER; + + +// Object types +#define NotificationTimerObject 8 +#define SynchronizationTimerObject 9 +#define DpcObject 19 + + +// Object Attributes type +// Differences from NT: There are no Length, SecurityDescriptor, or +// SecurityQualityOfService fields. Also, ObjectName is ANSI, not +// Unicode. +typedef struct _OBJECT_ATTRIBUTES { + HANDLE RootDirectory; + PANSI_STRING ObjectName; + ULONG Attributes; +} OBJECT_ATTRIBUTES; +typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES; + +// Flags for OBJECT_ATTRIBUTES::Attributes +#define OBJ_INHERIT 0x00000002L +#define OBJ_PERMANENT 0x00000010L +#define OBJ_EXCLUSIVE 0x00000020L +#define OBJ_CASE_INSENSITIVE 0x00000040L +#define OBJ_OPENIF 0x00000080L +#define OBJ_OPENLINK 0x00000100L +#define OBJ_KERNEL_HANDLE 0x00000200L +#define OBJ_VALID_ATTRIBUTES 0x000003F2L + +// Initializes an OBJECT_ATTRIBUTES. +// Works as if it were this function: +// VOID +// InitializeObjectAttributes( +// OUT POBJECT_ATTRIBUTES p, +// IN PANSI_STRING n, +// IN ULONG a, +// IN HANDLE r +// ) +// Differences from NT: SECURITY_DESCRIPTOR support is gone. +#define InitializeObjectAttributes( p, n, a, r ) { \ + (p)->RootDirectory = r; \ + (p)->Attributes = a; \ + (p)->ObjectName = n; \ + } + + +// CreateDisposition values for NtCreateFile() +#define FILE_SUPERSEDE 0x00000000 +#define FILE_OPEN 0x00000001 +#define FILE_CREATE 0x00000002 +#define FILE_OPEN_IF 0x00000003 +#define FILE_OVERWRITE 0x00000004 +#define FILE_OVERWRITE_IF 0x00000005 +#define FILE_MAXIMUM_DISPOSITION 0x00000005 + +// CreateOption values for NtCreateFile() +// FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT is what CreateFile +// uses for most things when translating to NtCreateFile. +#define FILE_DIRECTORY_FILE 0x00000001 +#define FILE_WRITE_THROUGH 0x00000002 +#define FILE_SEQUENTIAL_ONLY 0x00000004 +#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 +#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 +#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 +#define FILE_NON_DIRECTORY_FILE 0x00000040 +#define FILE_CREATE_TREE_CONNECTION 0x00000080 +#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 +#define FILE_NO_EA_KNOWLEDGE 0x00000200 +#define FILE_OPEN_FOR_RECOVERY 0x00000400 +#define FILE_RANDOM_ACCESS 0x00000800 +#define FILE_DELETE_ON_CLOSE 0x00001000 +#define FILE_OPEN_BY_FILE_ID 0x00002000 +#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 +#define FILE_NO_COMPRESSION 0x00008000 +#define FILE_RESERVE_OPFILTER 0x00100000 +#define FILE_OPEN_REPARSE_POINT 0x00200000 +#define FILE_OPEN_NO_RECALL 0x00400000 +#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 +#define FILE_COPY_STRUCTURED_STORAGE 0x00000041 +#define FILE_STRUCTURED_STORAGE 0x00000441 +#define FILE_VALID_OPTION_FLAGS 0x00ffffff +#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 +#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 +#define FILE_VALID_SET_FLAGS 0x00000036 + + +// NtQueryVolumeInformation / NtSetVolumeInformation stuff +// Type of information to retrieve; FileFsSizeInformation and +// FileFsDeviceInformation are the only ones confirmed to work. +typedef enum _FSINFOCLASS { + FileFsVolumeInformation = 1, + FileFsLabelInformation, + FileFsSizeInformation, + FileFsDeviceInformation, + FileFsAttributeInformation, + FileFsControlInformation, + FileFsFullSizeInformation, + FileFsObjectInformation +} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; + +// Structure of FileFsSizeInformation +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +#ifndef DEVICE_TYPE +#define DEVICE_TYPE ULONG +#endif +// Structure of FileFsDeviceInformation +typedef struct _FILE_FS_DEVICE_INFORMATION { + DEVICE_TYPE DeviceType; + ULONG Characteristics; +} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; + +// DEVICE_TYPEs (I took a guess as to which the XBOX might have.) +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 + +// Characteristics +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 + + + +// Physical address +// Differences from NT: 32 bit address instead of 64. +typedef ULONG PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS; + + +// NtCreateFile/NtOpenFile stuff +#define FILE_SUPERSEDED 0x00000000 +#define FILE_OPENED 0x00000001 +#define FILE_CREATED 0x00000002 +#define FILE_OVERWRITTEN 0x00000003 +#define FILE_EXISTS 0x00000004 +#define FILE_DOES_NOT_EXIST 0x00000005 + +// NtReadFile/NtWriteFile stuff +#define FILE_WRITE_TO_END_OF_FILE 0xffffffff +#define FILE_USE_FILE_POINTER_POSITION 0xfffffffe + + + +// DeviceIoControl stuff + +// Device types +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_SCSI FILE_DEVICE_CONTROLLER +#define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_DVD 0x00000033 + +// Access types +#define FILE_ANY_ACCESS 0 +#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe +#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe + +// Method types +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 + +// The all-important CTL_CODE +#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ +) + +// +// LBA48 Partition Table +// + +#define IOCTL_CMD_LBA48_ACCESS 0xcafebabe + +typedef struct _PARTITION_ENTRY { + UCHAR Name[16]; + ULONG Flags; + ULONG Start; + ULONG Size; + USHORT StartH; + USHORT SizeH; +} PARTITION_ENTRY, *PPARTITION_ENTRY; + +typedef struct _PARTITION_TABLE { + UCHAR Magic[16]; + UCHAR Reserved1[0x20]; + PARTITION_ENTRY Partitions[14]; + UCHAR Reserved2[0x90]; +} PARTITION_TABLE, *PPARTITION_TABLE; + +typedef struct _LBA48_PATCH { + ULONG Magic[2]; + ULONG PatchCodeVersion; + ULONG LowCodeBase; + ULONG HighCodeBase; + ULONG PatchSegSize; + PPARTITION_TABLE PartitionTable; +} LBA48_PATCH, *PLBA48_PATCH; + + +// IDE/SCSI codes +// IOCTL_SCSI_PASS_THROUGH_DIRECT is the only one known to be used. +// Differences from NT: None. +#define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_GET_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_FREE_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0409, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_IDE_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_CDROM_RAW_READ CTL_CODE(FILE_DEVICE_CD_ROM, 0x000F, METHOD_OUT_DIRECT, FILE_READ_ACCESS) +// Special XBOX code? +#define IOCTL_CDROM_AUTHENTICATE_DISK CTL_CODE(FILE_DEVICE_CD_ROM, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS) + +typedef enum _TRACK_MODE_TYPE { + YellowMode2, + XAForm2, + CDDA +} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE; +typedef struct __RAW_READ_INFO { + LARGE_INTEGER DiskOffset; + ULONG SectorCount; + TRACK_MODE_TYPE TrackMode; +} RAW_READ_INFO, *PRAW_READ_INFO; + +// Structure for IOCTL_SCSI_PASS_THROUGH_DIRECT +// Differences from NT: None, believe it or not. +typedef struct _SCSI_PASS_THROUGH_DIRECT { + /*000*/ USHORT Length; + /*002*/ UCHAR ScsiStatus; + /*003*/ UCHAR PathId; + /*004*/ UCHAR TargetId; + /*005*/ UCHAR Lun; + /*006*/ UCHAR CdbLength; + /*007*/ UCHAR SenseInfoLength; + /*008*/ UCHAR DataIn; + /*00C*/ ULONG DataTransferLength; + /*010*/ ULONG TimeOutValue; + /*014*/ PVOID DataBuffer; + /*018*/ ULONG SenseInfoOffset; + /*01C*/ UCHAR Cdb[16]; +}SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; + +// DataIn fields for IOCTL_SCSI_PASS_THROUGH_DIRECT +#define SCSI_IOCTL_DATA_OUT 0 +#define SCSI_IOCTL_DATA_IN 1 +#define SCSI_IOCTL_DATA_UNSPECIFIED 2 + +// Kernel object type (unsure about the structure...) +typedef struct _OBJECT_TYPE +{ + // Same prototype as ExAllocatePoolWithTag, because that's the usual one + PVOID + (NTAPI *AllocationFunction)( + SIZE_T NumberOfBytes, + ULONG Tag + ); + + // Same prototype as ExFreePool, because that's the usual one + VOID + (NTAPI *FreeFunction)( + IN PVOID P + ); + + // The prototypes of these are unknown + void *CloseFunction; + void *DeleteFunction; + void *ParseFunction; + + // Unknown DWORD... Size of this object type maybe? + void *DefaultObjectMaybe; + + // 4 letter tag for this object type + CHAR Tag[4]; +} OBJECT_TYPE; +typedef OBJECT_TYPE *POBJECT_TYPE; + +// Object types +extern POBJECT_TYPE IoFileObjectType; +extern POBJECT_TYPE ExEventObjectType; +extern POBJECT_TYPE ExSemaphoreObjectType; +extern POBJECT_TYPE IoCompletionObjectType; +extern POBJECT_TYPE IoDeviceObjectType; + + +// *_OBJECT and related structures (mostly opaque since I'm lazy) +typedef struct _DRIVER_OBJECT { + CSHORT Type; + CSHORT Size; + struct _DEVICE_OBJECT *DeviceObject; + // ... +} DRIVER_OBJECT; +typedef DRIVER_OBJECT *PDRIVER_OBJECT; + +typedef struct _DEVICE_OBJECT { + CSHORT Type; + USHORT Size; + LONG ReferenceCount; + PDRIVER_OBJECT DriverObject; + // ... +} DEVICE_OBJECT; +typedef DEVICE_OBJECT *PDEVICE_OBJECT; + +typedef struct _FILE_OBJECT { + CSHORT Type; + CSHORT Size; + PDEVICE_OBJECT DeviceObject; + // ... +} FILE_OBJECT; +typedef FILE_OBJECT *PFILE_OBJECT; + + +// Thread information structures + +// IRQL +typedef UCHAR KIRQL, *PKIRQL; +#define PASSIVE_LEVEL 0 // Passive release level +#define LOW_LEVEL 0 // Lowest interrupt level +#define APC_LEVEL 1 // APC interrupt level +#define DISPATCH_LEVEL 2 // Dispatcher level + +// Thread entry point +// NOTE: This is not a standard call! You can't call this function from C code! +// You push registers like stdcall, but ebp + 4 must point to the first argument before the call! +// +// Differences from NT: 2 parameters instead of 1; strange calling convention +typedef +VOID +(NTAPI *PKSTART_ROUTINE) ( + IN PVOID StartContext1, + IN PVOID StartContext2 + ); + +// Structure of a critical section +// Same as the XBOX's RTL_CRITICAL_SECTION, but with the more explicit header +typedef struct _KCRITICAL_SECTION +{ + // 000 Dispatcher header + DISPATCHER_HEADER Header; + // 010 Lock count of the critical section + LONG LockCount; + // 014 Recursion count of the critical section + LONG RecursionCount; + // 018 Thread ID of the thread that currently owns this critical section + ULONG OwningThread; +} KCRITICAL_SECTION, *PKCRITICAL_SECTION; + +// Structure of a thread object +typedef struct _KTHREAD +{ + // 000 Dispatcher header + DISPATCHER_HEADER Header; + // 010 Unknown + BYTE unknown[0x18]; + // 028 Pointer to TLS data + PVOID TlsData; + // ??? just padding - real size is unknown + BYTE unknown2[0x100]; +} KTHREAD, *PKTHREAD; + +// Structure of the data at FS +typedef struct _FS_STRUCTURE +{ + // 000 Current exception handler information + PVOID *ExceptionFrame; + // 004 Pointer to current TLS data top + PVOID TlsDataTop; + // 008 + BYTE unknown2[0x1C]; + // 024 Current IRQL of the OS + KIRQL CurrentIrql; + // 028 Thread structure of the current thread + PKTHREAD ThreadObject; + // ??? just padding - real size is unknown + BYTE unknown3[0x100]; +} FS_STRUCTURE, *PFS_STRUCTURE; + +// DPC routine +typedef +VOID +(*PKDEFERRED_ROUTINE) ( + IN struct _KDPC *Dpc, + IN PVOID DeferredContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2 + ); + +// DPC information +// It's not known which of these fields are used on XBOX. +typedef struct _KDPC { + CSHORT Type; + UCHAR Number; + UCHAR Importance; + LIST_ENTRY DpcListEntry; + PKDEFERRED_ROUTINE DeferredRoutine; + PVOID DeferredContext; + PVOID SystemArgument1; + PVOID SystemArgument2; + PULONG_PTR Lock; +} KDPC, *PKDPC; + + +// Timers +typedef enum _TIMER_TYPE { + NotificationTimer, + SynchronizationTimer + } TIMER_TYPE; + +typedef struct _KTIMER { + DISPATCHER_HEADER Header; + ULARGE_INTEGER DueTime; + LIST_ENTRY TimerListEntry; + struct _KDPC *Dpc; + LONG Period; +} KTIMER, *PKTIMER; + + + +// XBE stuff +// Not used in any exported kernel calls, but still useful. + + +// XBE header information +typedef struct _XBE_HEADER { + // 000 "XBEH" + CHAR Magic[4]; + // 004 RSA digital signature of the entire header area + UCHAR HeaderSignature[256]; + // 104 Base address of XBE image (must be 0x00010000?) + PVOID BaseAddress; + // 108 Size of all headers combined - other headers must be within this + ULONG HeaderSize; + // 10C Size of entire image + ULONG ImageSize; + // 110 Size of this header (always 0x178?) + ULONG XbeHeaderSize; + // 114 Image timestamp - unknown format + ULONG Timestamp; + // 118 Pointer to certificate data (must be within HeaderSize) + struct _XBE_CERTIFICATE *Certificate; + // 11C Number of sections + DWORD NumSections; + // 120 Pointer to section headers (must be within HeaderSize) + struct _XBE_SECTION *Sections; + // 124 Initialization flags + ULONG InitFlags; + // 128 Entry point (XOR'd; see xboxhacker.net) + PVOID EntryPoint; + // 12C Pointer to TLS directory + struct _XBE_TLS_DIRECTORY *TlsDirectory; + // 130 Stack commit size + ULONG StackCommit; + // 134 Heap reserve size + ULONG HeapReserve; + // 138 Heap commit size + ULONG HeapCommit; + // 13C PE base address (?) + PVOID PeBaseAddress; + // 140 PE image size (?) + ULONG PeImageSize; + // 144 PE checksum (?) + ULONG PeChecksum; + // 148 PE timestamp (?) + ULONG PeTimestamp; + // 14C PC path and filename to EXE file from which XBE is derived + PCSZ PcExePath; + // 150 PC filename (last part of PcExePath) from which XBE is derived + PCSZ PcExeFilename; + // 154 PC filename (Unicode version of PcExeFilename) + PWSTR PcExeFilenameUnicode; + // 158 Pointer to kernel thunk table (XOR'd; EFB1F152 debug) + ULONG_PTR *KernelThunkTable; + // 15C Non-kernel import table (debug only) + PVOID DebugImportTable; + // 160 Number of library headers + ULONG NumLibraries; + // 164 Pointer to library headers + struct _XBE_LIBRARY *Libraries; + // 168 Pointer to kernel library header + struct _XBE_LIBRARY *KernelLibrary; + // 16C Pointer to XAPI library + struct _XBE_LIBRARY *XapiLibrary; + // 170 Pointer to logo bitmap (NULL = use default of Microsoft) + PVOID LogoBitmap; + // 174 Size of logo bitmap + ULONG LogoBitmapSize; + // 178 +} XBE_HEADER, *PXBE_HEADER; + +// Certificate structure +typedef struct _XBE_CERTIFICATE { + // 000 Size of certificate + ULONG Size; + // 004 Certificate timestamp (unknown format) + ULONG Timestamp; + // 008 Title ID + ULONG TitleId; + // 00C Name of the game (Unicode) + WCHAR TitleName[40]; + // 05C Alternate title ID's (0-terminated) + ULONG AlternateTitleIds[16]; + // 09C Allowed media types - 1 bit match between XBE and media = boots + ULONG MediaTypes; + // 0A0 Allowed game regions - 1 bit match between this and XBOX = boots + ULONG GameRegion; + // 0A4 Allowed game ratings - 1 bit match between this and XBOX = boots + ULONG GameRating; + // 0A8 Disk number (?) + ULONG DiskNumber; + // 0AC Version (?) + ULONG Version; + // 0B0 LAN key for this game + UCHAR LanKey[16]; + // 0C0 Signature key for this game + UCHAR SignatureKey[16]; + // 0D0 Signature keys for the alternate title ID's + UCHAR AlternateSignatureKeys[16][16]; + // 1D0 +} XBE_CERTIFICATE, *PXBE_CERTIFICATE; + +// Section headers +typedef struct _XBE_SECTION { + // 000 Flags + ULONG Flags; + // 004 Virtual address (where this section loads in RAM) + PVOID VirtualAddress; + // 008 Virtual size (size of section in RAM; after FileSize it's 00'd) + ULONG VirtualSize; + // 00C File address (where in the file from which this section comes) + ULONG FileAddress; + // 010 File size (size of the section in the XBE file) + ULONG FileSize; + // 014 Pointer to section name + PCSZ SectionName; + // 018 Section reference count - when >= 1, section is loaded + LONG SectionReferenceCount; + // 01C Pointer to head shared page reference count + WORD *HeadReferenceCount; + // 020 Pointer to tail shared page reference count + WORD *TailReferenceCount; + // 024 SHA hash. Hash DWORD containing FileSize, then hash section. + DWORD ShaHash[5]; + // 038 +} XBE_SECTION, *PXBE_SECTION; + +// TLS directory information needed later +// Library version data needed later + +// Initialization flags +#define XBE_INIT_MOUNT_UTILITY 0x00000001 +#define XBE_INIT_FORMAT_UTILITY 0x00000002 +#define XBE_INIT_64M_RAM_ONLY 0x00000004 +#define XBE_INIT_DONT_SETUP_HDD 0x00000008 + +// Region codes +#define XBE_REGION_US_CANADA 0x00000001 +#define XBE_REGION_JAPAN 0x00000002 +#define XBE_REGION_ELSEWHERE 0x00000004 +#define XBE_REGION_DEBUG 0x80000000 + +// Media types +#define XBE_MEDIA_HDD 0x00000001 +#define XBE_MEDIA_XBOX_DVD 0x00000002 +#define XBE_MEDIA_ANY_CD_OR_DVD 0x00000004 +#define XBE_MEDIA_CD 0x00000008 +#define XBE_MEDIA_1LAYER_DVDROM 0x00000010 +#define XBE_MEDIA_2LAYER_DVDROM 0x00000020 +#define XBE_MEDIA_1LAYER_DVDR 0x00000040 +#define XBE_MEDIA_2LAYER_DVDR 0x00000080 +#define XBE_MEDIA_USB 0x00000100 +#define XBE_MEDIA_ALLOW_UNLOCKED_HDD 0x40000000 + +// Section flags +#define XBE_SEC_WRITABLE 0x00000001 +#define XBE_SEC_PRELOAD 0x00000002 +#define XBE_SEC_EXECUTABLE 0x00000004 +#define XBE_SEC_INSERTED_FILE 0x00000008 +#define XBE_SEC_RO_HEAD_PAGE 0x00000010 +#define XBE_SEC_RO_TAIL_PAGE 0x00000020 + + +// x86 page size +#define PAGE_SIZE 0x1000 + + +// Native NT API calls on the XBOX + + +// PAGE_ALIGN: +// Returns an address rounded down to the nearest page boundary. +// +// Differences from NT: None. +#define PAGE_ALIGN(Va) ((PVOID)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) + + +// RtlInitAnsiString: +// Fills an ANSI_STRING structure to use the specified string. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(289) +VOID +NTAPI +RtlInitAnsiString( + OUT PANSI_STRING DestinationString, + IN PCSZ SourceString + ); + + +// NtCreateFile: +// Creates or opens a file or device object. +// +// Differences from NT: The EaBuffer and EaLength options are gone. +// OBJECT_ATTRIBUTES uses ANSI_STRING, so only ANSI filenames work. +NTSYSAPI +EXPORTNUM(190) +NTSTATUS +NTAPI +NtCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions + ); + +// NtOpenFile: +// Opens a file or device object. Same as calling: +// NtCreateFile(FileHandle, DesiredAccess, ObjectAttributes, +// IoStatusBlock, NULL, 0, ShareAccess, OPEN_EXISTING, OpenOptions); +// +// Differences from NT: See NtCreateFile. +NTSYSAPI +EXPORTNUM(202) +NTSTATUS +NTAPI +NtOpenFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG ShareAccess, + IN ULONG OpenOptions + ); + +// NtReadFile: +// Reads a file. +// +// Differences from NT: There is no Key parameter. + +NTSYSAPI +EXPORTNUM(219) +NTSTATUS +NTAPI +NtReadFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset + ); + +//NTSYSAPI +//NTSTATUS +//NTAPI +//NtReadFile( +// IN HANDLE FileHandle, +// IN HANDLE Event OPTIONAL, +// IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, +// IN PVOID ApcContext OPTIONAL, +// OUT PIO_STATUS_BLOCK IoStatusBlock, +// OUT PVOID Buffer, +// IN ULONG Length, +// IN PLARGE_INTEGER ByteOffset OPTIONAL, +// IN PULONG Key OPTIONAL +// ); + +// NtWriteFile: +// Writes a file. +// +// Differences from NT: There is no Key parameter. +NTSYSAPI +EXPORTNUM(236) +NTSTATUS +NTAPI +NtWriteFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset + ); + +typedef enum _FILE_INFORMATION_CLASS { + + FileDirectoryInformation = 1, + FileFullDirectoryInformation, // 2 + FileBothDirectoryInformation, // 3 + FileBasicInformation, // 4 wdm + FileStandardInformation, // 5 wdm + FileInternalInformation, // 6 + FileEaInformation, // 7 + FileAccessInformation, // 8 + FileNameInformation, // 9 + FileRenameInformation, // 10 + FileLinkInformation, // 11 + FileNamesInformation, // 12 + FileDispositionInformation, // 13 + FilePositionInformation, // 14 wdm + FileFullEaInformation, // 15 + FileModeInformation, // 16 + FileAlignmentInformation, // 17 + FileAllInformation, // 18 + FileAllocationInformation, // 19 + FileEndOfFileInformation, // 20 wdm + FileAlternateNameInformation, // 21 + FileStreamInformation, // 22 + FilePipeInformation, // 23 + FilePipeLocalInformation, // 24 + FilePipeRemoteInformation, // 25 + FileMailslotQueryInformation, // 26 + FileMailslotSetInformation, // 27 + FileCompressionInformation, // 28 + FileObjectIdInformation, // 29 + FileCompletionInformation, // 30 + FileMoveClusterInformation, // 31 + FileQuotaInformation, // 32 + FileReparsePointInformation, // 33 + FileNetworkOpenInformation, // 34 + FileAttributeTagInformation, // 35 + FileTrackingInformation, // 36 + FileIdBothDirectoryInformation, // 37 + FileIdFullDirectoryInformation, // 38 + FileValidDataLengthInformation, // 39 + FileShortNameInformation, // 40 + FileMaximumInformation + +} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; + +typedef struct _FILE_NETWORK_OPEN_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG FileAttributes; +} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION; + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + +// NtQueryVolumeInformation: +// Queries information about a file system. This is not documented by +// Microsoft even under NT. +// +// Differences from NT: None known. +NTSYSAPI +EXPORTNUM(218) +NTSTATUS +NTAPI +NtQueryVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID VolumeInformation, + IN ULONG VolumeInformationLength, + IN FS_INFORMATION_CLASS VolumeInformationClass + ); + +// NtDeviceIoControl: +// Does an IOCTL on a device. +// +// Differences from NT: None known. +NTSYSAPI +EXPORTNUM(196) +NTSTATUS +NTAPI +NtDeviceIoControlFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength + ); + +// NtClose: +// Closes a file or other handle. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(187) +NTSTATUS +NTAPI +NtClose( + IN HANDLE Handle + ); + +// NtAllocateVirtualMemory: +// Allocates virtual memory. +// +// Differences from NT: There is no ProcessHandle parameter. +NTSYSAPI +EXPORTNUM(184) +NTSTATUS +NTAPI +NtAllocateVirtualMemory( + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG AllocationSize, + IN ULONG AllocationType, + IN ULONG Protect + ); + +// NtFreeVirtualMemory: +// Frees virtual memory. +// +// Differences from NT: There is no ProcessHandle parameter. +NTSYSAPI +EXPORTNUM(199) +NTSTATUS +NTAPI +NtFreeVirtualMemory( + IN OUT PVOID *BaseAddress, + IN OUT PULONG FreeSize, + IN ULONG FreeType + ); + + +// Kernel-level routines + + +// KeBugCheck: +// Bug checks the kernel. +// Same as KeBugCheckEx(BugCheckCode, 0, 0, 0, 0); +// +// Differences from NT: None, other than the reaction. +NTSYSAPI +EXPORTNUM(95) +VOID +NTAPI +KeBugCheck( + IN ULONG BugCheckCode + ); + +// KeBugCheckEx: +// Bug checks the kernel. +// +// Differences from NT: None, other than the reaction. +NTSYSAPI +EXPORTNUM(96) +VOID +NTAPI +KeBugCheckEx( + IN ULONG BugCheckCode, + IN ULONG_PTR BugCheckParameter1, + IN ULONG_PTR BugCheckParameter2, + IN ULONG_PTR BugCheckParameter3, + IN ULONG_PTR BugCheckParameter4 + ); + +// KeInitializeDpc: +// Initializes a DPC structure. +// +// Differences from NT: This function sets less fields than the NT version. +NTSYSAPI +EXPORTNUM(107) +VOID +NTAPI +KeInitializeDpc( + IN PKDPC Dpc, + IN PKDEFERRED_ROUTINE DeferredRoutine, + IN PVOID DeferredContext + ); + +// KeInitializeTimerEx: +// Initializes a timer. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(113) +VOID +KeInitializeTimerEx( + IN OUT PKTIMER Timer, + IN TIMER_TYPE Type + ); + +// KeRaiseIrql: +// Raises IRQL to some value. +// +// Differences from NT: None. +#define KeRaiseIrql KfRaiseIrql +NTSYSAPI +EXPORTNUM(190) +VOID +__fastcall +KfRaiseIrql( + IN KIRQL NewIrql, + OUT PKIRQL OldIrql + ); + +// KeRaiseIrqlToDpcLevel: +// Raises IRQL to DISPATCH_LEVEL. Like KeRaiseIrql except returns old level directly. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(129) +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel( + VOID + ); + +// KeLowerIrql: +// Lowers IRQL. +#define KeLowerIrql KfLowerIrql +NTSYSAPI +EXPORTNUM(161) +VOID +__fastcall +KfLowerIrql( + IN KIRQL NewIrql + ); + + +// MmMapIoSpace: +// Maps a physical address area into the virtual address space. +// DO NOT USE MEMORY MAPPED WITH THIS AS A BUFFER TO OTHER CALLS. For +// example, don't WriteFile or NtWriteFile these buffers. Copy them first. +// +// Differences from NT: PhysicalAddress is 32 bit, not 64. ProtectionType +// specifies the page protections, but it's a Win32 PAGE_ macro instead +// of the normal NT enumeration. PAGE_READWRITE is probably what you +// want... +NTSYSAPI +EXPORTNUM(177) +PVOID +NTAPI +MmMapIoSpace( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberOfBytes, + IN ULONG ProtectionType + ); + +// MmGetPhysicalAddress: +// Translates a virtual address into a physical address. +// +// Differences from NT: PhysicalAddress is 32 bit, not 64. +NTSYSAPI +EXPORTNUM(173) +PHYSICAL_ADDRESS +NTAPI +MmGetPhysicalAddress( + IN PVOID BaseAddress + ); + +// MmUnmapIoSpace: +// Unmaps a virtual address mapping made by MmMapIoSpace. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(183) +PVOID +NTAPI +MmUnmapIoSpace( + IN PVOID BaseAddress, + IN ULONG NumberOfBytes + ); + +// MmAllocateContiguousMemory: +// Allocates a range of physically contiguous, cache-aligned memory from the +// non-paged pool (= main pool on XBOX). +// +// Differences from NT: HighestAcceptableAddress was deleted, opting instead +// to not care about the highest address. +NTSYSAPI +EXPORTNUM(165) +PVOID +NTAPI +MmAllocateContiguousMemory( + IN ULONG NumberOfBytes + ); + +// MmFreeContiguousMemory: +// Frees memory allocated with MmAllocateContiguousMemory. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(171) +VOID +NTAPI +MmFreeContiguousMemory( + IN PVOID BaseAddress + ); + + +// DbgPrint +// Displays a message on the debugger. +// +// Differences from NT: Only how this information is displayed changed. +NTSYSAPI +EXPORTNUM(8) +ULONG +__cdecl +DbgPrint( + IN PCSZ Format, + ... + ); + + +// ExAllocatePoolWithTag: +// Allocates memory from the memory pool. The Tag parameter is a 4-letter +// character constant to which to associate the allocation. +// +// Differences from NT: There is no PoolType field, as the XBOX only has 1 +// pool, the non-paged pool. +NTSYSAPI +EXPORTNUM(15) +PVOID +NTAPI +ExAllocatePoolWithTag( + IN SIZE_T NumberOfBytes, + IN ULONG Tag + ); + +// ExFreePool: +// Frees memory allocated by ExAllocatePool* functions. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(17) +VOID +NTAPI +ExFreePool( + IN PVOID P + ); + + +// IoCreateSymbolicLink: +// Creates a symbolic link in the object namespace. +// NtCreateSymbolicLinkObject is much harder to use than this simple +// function, so just use this one. +// +// Differences from NT: Uses ANSI_STRING instead of UNICODE_STRING. +NTSYSAPI +EXPORTNUM(67) +NTSTATUS +NTAPI +IoCreateSymbolicLink( + IN PANSI_STRING SymbolicLinkName, + IN PANSI_STRING DeviceName + ); + +// IoDeleteSymbolicLink: +// Creates a symbolic link in the object namespace. Deleting symbolic links +// through the Nt* functions is a pain, so use this instead. +// +// Differences from NT: Uses ANSI_STRING instead of UNICODE_STRING. +NTSYSAPI +EXPORTNUM(69) +NTSTATUS +NTAPI +IoDeleteSymbolicLink( + IN PANSI_STRING SymbolicLinkName + ); + + +// ObReferenceObjectByHandle: +// Turns a handle into a kernel object pointer. The ObjectType parameter +// specifies what type of object it is. This function also increments the +// object's reference count. +// +// Differences from NT: There are no DesiredAccess, AccessMode, or +// HandleInformation parameters. +NTSYSAPI +EXPORTNUM(246) +NTSTATUS +NTAPI +ObReferenceObjectByHandle( + IN HANDLE Handle, + IN POBJECT_TYPE ObjectType OPTIONAL, + OUT PVOID *Object + ); + +// ObfReferenceObject/ObReferenceObject: +// Increments the object's reference count. +// +// Differences from NT: None. +#define ObReferenceObject(Object) ObfReferenceObject(Object) +NTSYSAPI +EXPORTNUM(251) +VOID +FASTCALL +ObfReferenceObject( + IN PVOID Object + ); + +// ObfDereferenceObject/ObDereferenceObject: +// Decrements the object's reference count, deleting it if it is now unused. +// +// Differences from NT: None. +#define ObDereferenceObject(a) ObfDereferenceObject(a) +NTSYSAPI +EXPORTNUM(250) +VOID +FASTCALL +ObfDereferenceObject( + IN PVOID Object + ); + + +// PsTerminateSystemThread: +// Exits the current system thread. Must be called from a system thread. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(258) +__declspec(noreturn) +NTSTATUS +PsTerminateSystemThread( + NTSTATUS ExitCode + ); + + + +// Kernel routines only in the XBOX + +// IoSynchronousDeviceIoControlRequest: +// NICE. Makes kernel driver stuff sooooo much easier. This does a +// blocking IOCTL on the specified device. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(84) +NTSTATUS +NTAPI +IoSynchronousDeviceIoControlRequest( + IN ULONG IoControlCode, + IN PDEVICE_OBJECT DeviceObject, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + OUT PDWORD unknown_use_zero OPTIONAL, + IN BOOLEAN InternalDeviceIoControl + ); + +// ExQueryNonVolatileSettings +// Queries saved information, such as the region code. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(24) +NTSTATUS +NTAPI +ExQueryNonVolatileSetting( + IN ULONG ValueIndex, + OUT PULONG Type, + OUT PVOID Value, + IN ULONG ValueLength, + OUT PULONG ResultLength OPTIONAL + ); + +// ExSaveNonVolatileSettings +// Writes saved information, such as the region code. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(29) +NTSTATUS +NTAPI +ExSaveNonVolatileSetting( + IN ULONG ValueIndex, + IN PULONG Type OPTIONAL, + IN PVOID Value, + IN ULONG ValueLength + ); + +// HalEnableSecureTrayEject: +// Notifies the SMBUS that ejecting the DVD-ROM should not reset the system. +// Note that this function can't really be called directly... +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(365) +VOID +NTAPI +HalEnableSecureTrayEject( + VOID + ); + +// XeLoadSection: +// Adds one to the reference count of the specified section and loads if the +// count is now above zero. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(327) +NTSTATUS +NTAPI +XeLoadSection( + IN OUT PXBE_SECTION section + ); + +// XeUnloadSection: +// Subtracts one from the reference count of the specified section and loads +// if the count is now below zero. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(328) +NTSTATUS +NTAPI +XeUnloadSection( + IN OUT PXBE_SECTION section + ); + +// RtlRip: +// Traps to the debugger with a certain message, then crashes. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(352) +VOID +NTAPI +RtlRip( + IN PCSZ Part1, + IN PCSZ Part2, + IN PCSZ Part3 + ); + +// PsCreateSystemThread: +// Creates a system thread. Same as: +// PsCreateSystemThreadEx(ThreadHandle, NULL, 0x3000, 0, ThreadId, StartContext1, +// StartContext2, FALSE, DebugStack, PspSystemThreadStartup); +// +// New to the XBOX. (It is too different from NT to be considered the same) +NTSYSAPI +EXPORTNUM(254) +NTSTATUS +NTAPI +PsCreateSystemThread( + OUT PHANDLE ThreadHandle, + OUT PULONG ThreadId OPTIONAL, + IN PVOID StartContext1, + IN PVOID StartContext2, + IN BOOLEAN DebugStack + ); + +// PsCreateSystemThreadEx: +// Creates a system thread. +// ThreadHandle: Receives the thread handle +// ObjectAttributes: Unsure how this works (everything I've seen uses NULL) +// KernelStackSize: Size of the allocation for both stack and TLS data +// TlsDataSize: Size within KernelStackSize to use as TLS data +// ThreadId: Receives the thread ID number +// StartContext1: Parameter 1 to StartRoutine +// StartContext2: Parameter 2 to StartRoutine +// CreateSuspended: TRUE to create the thread as a suspended thread +// DebugStack: TRUE to allocate the stack from Debug Kit memory +// StartRoutine: Called when the thread is created +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(255) +NTSTATUS +NTAPI +PsCreateSystemThreadEx( + OUT PHANDLE ThreadHandle, + IN PVOID ObjectAttributes OPTIONAL, + IN ULONG KernelStackSize, + IN ULONG TlsDataSize, + OUT PULONG ThreadId OPTIONAL, + IN PVOID StartContext1, + IN PVOID StartContext2, + IN BOOLEAN CreateSuspended, + IN BOOLEAN DebugStack, + IN PKSTART_ROUTINE StartRoutine + ); + + + +// Error codes +#define STATUS_SUCCESS 0x00000000 +#define STATUS_UNSUCCESSFUL 0xC0000001 +#define STATUS_UNRECOGNIZED_MEDIA 0xC0000014 +// The SCSI input buffer was too large (not necessarily an error!) +#define STATUS_DATA_OVERRUN 0xC000003C +#define STATUS_INVALID_IMAGE_FORMAT 0xC000007B +#define STATUS_INSUFFICIENT_RESOURCES 0xC000009A +#define STATUS_TOO_MANY_SECRETS 0xC0000156 +#define STATUS_REGION_MISMATCH 0xC0050001 + +// End extern "C" for C++ +#if defined(__cplusplus) && !defined(XBOXINTERNAL_NO_EXTERN_C) +}; +#endif // __cplusplus + +#include + +// Thanks and credit go to Team Evox +typedef struct +{ + DWORD Data_00; // Check Block Start + DWORD Data_04; + DWORD Data_08; + DWORD Data_0c; + DWORD Data_10; // Check Block End + + DWORD V1_IP; // 0x14 + DWORD V1_Subnetmask; // 0x18 + DWORD V1_Defaultgateway; // 0x1c + DWORD V1_DNS1; // 0x20 + DWORD V1_DNS2; // 0x24 + + DWORD Data_28; // Check Block Start + DWORD Data_2c; + DWORD Data_30; + DWORD Data_34; + DWORD Data_38; // Check Block End + + DWORD V2_Tag; // V2 Tag "XBV2" + + DWORD Flag; // 0x40 + DWORD Data_44; + + DWORD V2_IP; // 0x48 + DWORD V2_Subnetmask; // 0x4c + DWORD V2_Defaultgateway; // 0x50 + DWORD V2_DNS1; // 0x54 + DWORD V2_DNS2; // 0x58 + + DWORD Data_xx[0x200-0x5c]; + +} TXNetConfigParams,*PTXNetConfigParams; + +// +// Time conversion routines +// + +typedef struct _TIME_FIELDS { + SHORT Year; // range [1601...] + SHORT Month; // range [1..12] + SHORT Day; // range [1..31] + SHORT Hour; // range [0..23] + SHORT Minute; // range [0..59] + SHORT Second; // range [0..59] + SHORT Milliseconds;// range [0..999] + SHORT Weekday; // range [0..6] == [Sunday..Saturday] +} TIME_FIELDS; +typedef TIME_FIELDS *PTIME_FIELDS; + + +#ifdef __cplusplus +extern "C" +{ +#endif + // Thanks and credit go to Woodoo + extern VOID WINAPI HalInitiateShutdown(VOID); + extern VOID WINAPI HalWriteSMBusValue(BYTE, BYTE, BOOL, BYTE); + extern VOID WINAPI HalReadSMCTrayState(DWORD* state, DWORD* count); + + // Thanks and credit go to Team Evox + extern VOID WINAPI HalReturnToFirmware(DWORD); + + extern INT WINAPI XNetLoadConfigParams(LPBYTE); + extern INT WINAPI XNetSaveConfigParams(LPBYTE); + + extern INT WINAPI XWriteTitleInfoNoReboot(LPVOID,LPVOID,DWORD,DWORD,LPVOID); + + extern DWORD* LaunchDataPage; + + extern unsigned int WINAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event OPTIONAL, PIO_APC_ROUTINE ApcRoutine OPTIONAL, PVOID ApcContext OPTIONAL, PIO_STATUS_BLOCK IoStatusBlock, ULONG FsControlCode, PVOID InputBuffer OPTIONAL, ULONG InputBufferLength, PVOID OutputBuffer OPTIONAL, ULONG OutputBufferLength); + extern void WINAPI KeQuerySystemTime (PLARGE_INTEGER CurrentTime); + extern NTSTATUS NTAPI NtSetSystemTime (PLARGE_INTEGER SystemTime, PLARGE_INTEGER PreviousTime OPTIONAL); + extern NTSYSAPI BOOLEAN NTAPI RtlTimeFieldsToTime(TIME_FIELDS* TimeFields, PLARGE_INTEGER Time); + +#ifdef __cplusplus +} +#endif + + +#endif // __XBOX_INTERNAL_H__ diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/hvl_replay.c b/Cerbios Bios/BootAnims/Nyan Cat/source/hvl_replay.c new file mode 100644 index 0000000..45bb8cc --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/hvl_replay.c @@ -0,0 +1,1997 @@ +/* +** Changes for the 1.4 release are commented. You can do +** a search for "1.4" and merge them into your own replay +** code. +** +** Changes for 1.5 are marked also. +** +** ... as are those for 1.6 +** +** ... and for 1.8 +*/ + + +#include +#include +#include +#include + +#include "hvl_replay.h" + +int32 stereopan_left[] = { 128, 96, 64, 32, 0 }; +int32 stereopan_right[] = { 128, 160, 193, 225, 255 }; + +/* +** Waves +*/ +#define WHITENOISELEN (0x280*3) + +#define WO_LOWPASSES 0 +#define WO_TRIANGLE_04 (WO_LOWPASSES+((0xfc+0xfc+0x80*0x1f+0x80+3*0x280)*31)) +#define WO_TRIANGLE_08 (WO_TRIANGLE_04+0x04) +#define WO_TRIANGLE_10 (WO_TRIANGLE_08+0x08) +#define WO_TRIANGLE_20 (WO_TRIANGLE_10+0x10) +#define WO_TRIANGLE_40 (WO_TRIANGLE_20+0x20) +#define WO_TRIANGLE_80 (WO_TRIANGLE_40+0x40) +#define WO_SAWTOOTH_04 (WO_TRIANGLE_80+0x80) +#define WO_SAWTOOTH_08 (WO_SAWTOOTH_04+0x04) +#define WO_SAWTOOTH_10 (WO_SAWTOOTH_08+0x08) +#define WO_SAWTOOTH_20 (WO_SAWTOOTH_10+0x10) +#define WO_SAWTOOTH_40 (WO_SAWTOOTH_20+0x20) +#define WO_SAWTOOTH_80 (WO_SAWTOOTH_40+0x40) +#define WO_SQUARES (WO_SAWTOOTH_80+0x80) +#define WO_WHITENOISE (WO_SQUARES+(0x80*0x20)) +#define WO_HIGHPASSES (WO_WHITENOISE+WHITENOISELEN) +#define WAVES_SIZE (WO_HIGHPASSES+((0xfc+0xfc+0x80*0x1f+0x80+3*0x280)*31)) + +int8 waves[WAVES_SIZE]; +int16 waves2[WAVES_SIZE]; + +int16 vib_tab[] = +{ + 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255, + 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24, + 0,-24,-49,-74,-97,-120,-141,-161,-180,-197,-212,-224,-235,-244,-250,-253,-255, + -253,-250,-244,-235,-224,-212,-197,-180,-161,-141,-120,-97,-74,-49,-24 +}; + +uint16 period_tab[] = +{ + 0x0000, 0x0D60, 0x0CA0, 0x0BE8, 0x0B40, 0x0A98, 0x0A00, 0x0970, + 0x08E8, 0x0868, 0x07F0, 0x0780, 0x0714, 0x06B0, 0x0650, 0x05F4, + 0x05A0, 0x054C, 0x0500, 0x04B8, 0x0474, 0x0434, 0x03F8, 0x03C0, + 0x038A, 0x0358, 0x0328, 0x02FA, 0x02D0, 0x02A6, 0x0280, 0x025C, + 0x023A, 0x021A, 0x01FC, 0x01E0, 0x01C5, 0x01AC, 0x0194, 0x017D, + 0x0168, 0x0153, 0x0140, 0x012E, 0x011D, 0x010D, 0x00FE, 0x00F0, + 0x00E2, 0x00D6, 0x00CA, 0x00BE, 0x00B4, 0x00AA, 0x00A0, 0x0097, + 0x008F, 0x0087, 0x007F, 0x0078, 0x0071 +}; + +uint32 panning_left[256], panning_right[256]; + +void hvl_GenPanningTables( void ) +{ + uint32 i; + float64 aa, ab; + + // Sine based panning table + aa = (3.14159265f*2.0f)/4.0f; // Quarter of the way through the sinewave == top peak + ab = 0.0f; // Start of the climb from zero + + for( i=0; i<256; i++ ) + { + panning_left[i] = (uint32)(sin(aa)*255.0f); + panning_right[i] = (uint32)(sin(ab)*255.0f); + + aa += (3.14159265*2.0f/4.0f)/256.0f; + ab += (3.14159265*2.0f/4.0f)/256.0f; + } + panning_left[255] = 0; + panning_right[0] = 0; +} + +void hvl_GenSawtooth( int8 *buf, uint32 len ) +{ + uint32 i; + int32 val, add; + + add = 256 / (len-1); + val = -128; + + for( i=0; i> 2; + d1 = 128/d5; + d4 = -(d2 >> 1); + val = 0; + + for( i=0; i 127.f ) + x = 127.f; + else if( x < -128.f ) + x = -128.f; + return x; +} + +void hvl_GenFilterWaves( int8 *buf, int8 *lowbuf, int8 *highbuf ) +{ + static const uint16 lentab[45] = { 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, + 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, + 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, + (0x280*3)-1 }; + + float64 freq; + uint32 temp; + + for( temp=0, freq=8.f; temp<31; temp++, freq+=3.f ) + { + uint32 wv; + int8 *a0 = buf; + + for( wv=0; wv<6+6+0x20+1; wv++ ) + { + float64 fre, high, mid, low; + uint32 i; + + mid = 0.f; + low = 0.f; + fre = freq * 1.25f / 100.0f; + + for( i=0; i<=lentab[wv]; i++ ) + { + high = a0[i] - mid - low; + high = clip( high ); + mid += high * fre; + mid = clip( mid ); + low += mid * fre; + low = clip( low ); + } + + for( i=0; i<=lentab[wv]; i++ ) + { + high = a0[i] - mid - low; + high = clip( high ); + mid += high * fre; + mid = clip( mid ); + low += mid * fre; + low = clip( low ); + *lowbuf++ = (int8)low; + *highbuf++ = (int8)high; + } + + a0 += lentab[wv]+1; + } + } +} + +void hvl_GenWhiteNoise( int8 *buf, uint32 len ) +{ + uint32 ays; + + ays = 0x41595321; + + do { + uint16 ax, bx; + int8 s; + + s = ays; + + if( ays & 0x100 ) + { + s = 0x80; + + if( (int32)(ays & 0xffff) >= 0 ) + s = 0x7f; + } + + *buf++ = s; + len--; + + ays = (ays >> 5) | (ays << 27); + ays = (ays & 0xffffff00) | ((ays & 0xff) ^ 0x9a); + bx = ays; + ays = (ays << 2) | (ays >> 30); + ax = ays; + bx += ax; + ax ^= bx; + ays = (ays & 0xffff0000) | ax; + ays = (ays >> 3) | (ays << 29); + } while( len ); +} + +void hvl_reset_some_stuff( struct hvl_tune *ht ) +{ + uint32 i; + + for( i=0; iht_Voices[i].vc_Delta=1; + ht->ht_Voices[i].vc_OverrideTranspose=1000; // 1.5 + ht->ht_Voices[i].vc_SamplePos=ht->ht_Voices[i].vc_Track=ht->ht_Voices[i].vc_Transpose=ht->ht_Voices[i].vc_NextTrack = ht->ht_Voices[i].vc_NextTranspose = 0; + ht->ht_Voices[i].vc_ADSRVolume=ht->ht_Voices[i].vc_InstrPeriod=ht->ht_Voices[i].vc_TrackPeriod=ht->ht_Voices[i].vc_VibratoPeriod=ht->ht_Voices[i].vc_NoteMaxVolume=ht->ht_Voices[i].vc_PerfSubVolume=ht->ht_Voices[i].vc_TrackMasterVolume=0; + ht->ht_Voices[i].vc_NewWaveform=ht->ht_Voices[i].vc_Waveform=ht->ht_Voices[i].vc_PlantSquare=ht->ht_Voices[i].vc_PlantPeriod=ht->ht_Voices[i].vc_IgnoreSquare=0; + ht->ht_Voices[i].vc_TrackOn=ht->ht_Voices[i].vc_FixedNote=ht->ht_Voices[i].vc_VolumeSlideUp=ht->ht_Voices[i].vc_VolumeSlideDown=ht->ht_Voices[i].vc_HardCut=ht->ht_Voices[i].vc_HardCutRelease=ht->ht_Voices[i].vc_HardCutReleaseF=0; + ht->ht_Voices[i].vc_PeriodSlideSpeed=ht->ht_Voices[i].vc_PeriodSlidePeriod=ht->ht_Voices[i].vc_PeriodSlideLimit=ht->ht_Voices[i].vc_PeriodSlideOn=ht->ht_Voices[i].vc_PeriodSlideWithLimit=0; + ht->ht_Voices[i].vc_PeriodPerfSlideSpeed=ht->ht_Voices[i].vc_PeriodPerfSlidePeriod=ht->ht_Voices[i].vc_PeriodPerfSlideOn=ht->ht_Voices[i].vc_VibratoDelay=ht->ht_Voices[i].vc_VibratoCurrent=ht->ht_Voices[i].vc_VibratoDepth=ht->ht_Voices[i].vc_VibratoSpeed=0; + ht->ht_Voices[i].vc_SquareOn=ht->ht_Voices[i].vc_SquareInit=ht->ht_Voices[i].vc_SquareLowerLimit=ht->ht_Voices[i].vc_SquareUpperLimit=ht->ht_Voices[i].vc_SquarePos=ht->ht_Voices[i].vc_SquareSign=ht->ht_Voices[i].vc_SquareSlidingIn=ht->ht_Voices[i].vc_SquareReverse=0; + ht->ht_Voices[i].vc_FilterOn=ht->ht_Voices[i].vc_FilterInit=ht->ht_Voices[i].vc_FilterLowerLimit=ht->ht_Voices[i].vc_FilterUpperLimit=ht->ht_Voices[i].vc_FilterPos=ht->ht_Voices[i].vc_FilterSign=ht->ht_Voices[i].vc_FilterSpeed=ht->ht_Voices[i].vc_FilterSlidingIn=ht->ht_Voices[i].vc_IgnoreFilter=0; + ht->ht_Voices[i].vc_PerfCurrent=ht->ht_Voices[i].vc_PerfSpeed=ht->ht_Voices[i].vc_WaveLength=ht->ht_Voices[i].vc_NoteDelayOn=ht->ht_Voices[i].vc_NoteCutOn=0; + ht->ht_Voices[i].vc_AudioPeriod=ht->ht_Voices[i].vc_AudioVolume=ht->ht_Voices[i].vc_VoiceVolume=ht->ht_Voices[i].vc_VoicePeriod=ht->ht_Voices[i].vc_VoiceNum=ht->ht_Voices[i].vc_WNRandom=0; + ht->ht_Voices[i].vc_SquareWait=ht->ht_Voices[i].vc_FilterWait=ht->ht_Voices[i].vc_PerfWait=ht->ht_Voices[i].vc_NoteDelayWait=ht->ht_Voices[i].vc_NoteCutWait=0; + ht->ht_Voices[i].vc_PerfList=0; + ht->ht_Voices[i].vc_RingSamplePos=ht->ht_Voices[i].vc_RingDelta=ht->ht_Voices[i].vc_RingPlantPeriod=ht->ht_Voices[i].vc_RingAudioPeriod=ht->ht_Voices[i].vc_RingNewWaveform=ht->ht_Voices[i].vc_RingWaveform=ht->ht_Voices[i].vc_RingFixedPeriod=ht->ht_Voices[i].vc_RingBasePeriod=0; + + ht->ht_Voices[i].vc_RingMixSource = NULL; + ht->ht_Voices[i].vc_RingAudioSource = NULL; + + memset(&ht->ht_Voices[i].vc_SquareTempBuffer,0,0x80); + memset(&ht->ht_Voices[i].vc_ADSR,0,sizeof(struct hvl_envelope)); + memset(&ht->ht_Voices[i].vc_VoiceBuffer,0,0x281); + memset(&ht->ht_Voices[i].vc_RingVoiceBuffer,0,0x281); + } + + for( i=0; iht_Voices[i].vc_WNRandom = 0x280; + ht->ht_Voices[i].vc_VoiceNum = i; + ht->ht_Voices[i].vc_TrackMasterVolume = 0x40; + ht->ht_Voices[i].vc_TrackOn = 1; + ht->ht_Voices[i].vc_MixSource = ht->ht_Voices[i].vc_VoiceBuffer; + } +} + +BOOL hvl_InitSubsong( struct hvl_tune *ht, uint32 nr ) +{ + uint32 PosNr, i; + + if( nr > ht->ht_SubsongNr ) + return FALSE; + + ht->ht_SongNum = nr; + + PosNr = 0; + if( nr ) PosNr = ht->ht_Subsongs[nr-1]; + + ht->ht_PosNr = PosNr; + ht->ht_PosJump = 0; + ht->ht_PatternBreak = 0; + ht->ht_NoteNr = 0; + ht->ht_PosJumpNote = 0; + ht->ht_Tempo = 6; + ht->ht_StepWaitFrames = 0; + ht->ht_GetNewPosition = 1; + ht->ht_SongEndReached = 0; + ht->ht_PlayingTime = 0; + + for( i=0; iht_Voices[i+0].vc_Pan = ht->ht_defpanleft; + ht->ht_Voices[i+0].vc_SetPan = ht->ht_defpanleft; // 1.4 + ht->ht_Voices[i+0].vc_PanMultLeft = panning_left[ht->ht_defpanleft]; + ht->ht_Voices[i+0].vc_PanMultRight = panning_right[ht->ht_defpanleft]; + ht->ht_Voices[i+1].vc_Pan = ht->ht_defpanright; + ht->ht_Voices[i+1].vc_SetPan = ht->ht_defpanright; // 1.4 + ht->ht_Voices[i+1].vc_PanMultLeft = panning_left[ht->ht_defpanright]; + ht->ht_Voices[i+1].vc_PanMultRight = panning_right[ht->ht_defpanright]; + ht->ht_Voices[i+2].vc_Pan = ht->ht_defpanright; + ht->ht_Voices[i+2].vc_SetPan = ht->ht_defpanright; // 1.4 + ht->ht_Voices[i+2].vc_PanMultLeft = panning_left[ht->ht_defpanright]; + ht->ht_Voices[i+2].vc_PanMultRight = panning_right[ht->ht_defpanright]; + ht->ht_Voices[i+3].vc_Pan = ht->ht_defpanleft; + ht->ht_Voices[i+3].vc_SetPan = ht->ht_defpanleft; // 1.4 + ht->ht_Voices[i+3].vc_PanMultLeft = panning_left[ht->ht_defpanleft]; + ht->ht_Voices[i+3].vc_PanMultRight = panning_right[ht->ht_defpanleft]; + } + + hvl_reset_some_stuff( ht ); + + return TRUE; +} + +void hvl_InitReplayer( void ) +{ + hvl_GenPanningTables(); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_04], 0x04 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_08], 0x08 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_10], 0x10 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_20], 0x20 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_40], 0x40 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_80], 0x80 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_04], 0x04 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_08], 0x08 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_10], 0x10 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_20], 0x20 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_40], 0x40 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_80], 0x80 ); + hvl_GenSquare( &waves[WO_SQUARES] ); + hvl_GenWhiteNoise( &waves[WO_WHITENOISE], WHITENOISELEN ); + hvl_GenFilterWaves( &waves[WO_TRIANGLE_04], &waves[WO_LOWPASSES], &waves[WO_HIGHPASSES] ); +} + +struct hvl_tune *hvl_load_ahx( uint8 *buf, uint32 buflen, uint32 defstereo, uint32 freq ) +{ + uint8 *bptr; + TEXT *nptr; + uint32 i, j, k, l, posn, insn, ssn, hs, trkn, trkl; + struct hvl_tune *ht; + struct hvl_plsentry *ple; + int32 defgain[] = { 71, 72, 76, 85, 100 }; + + posn = ((buf[6]&0x0f)<<8)|buf[7]; + insn = buf[12]; + ssn = buf[13]; + trkl = buf[10]; + trkn = buf[11]; + + hs = sizeof( struct hvl_tune ); + hs += sizeof( struct hvl_position ) * posn; + hs += sizeof( struct hvl_instrument ) * (insn+1); + hs += sizeof( uint16 ) * ssn; + + // Calculate the size of all instrument PList buffers + bptr = &buf[14]; + bptr += ssn*2; // Skip past the subsong list + bptr += posn*4*2; // Skip past the positions + bptr += trkn*trkl*3; + if((buf[6]&0x80)==0) bptr += trkl*3; + + // *NOW* we can finally calculate PList space + for( i=1; i<=insn; i++ ) + { + hs += bptr[21] * sizeof( struct hvl_plsentry ); + bptr += 22 + bptr[21]*4; + } + + ht = malloc( hs ); + if( !ht ) + { + printf( "Out of memory!\n" ); + return NULL; + } + + ht->ht_Frequency = freq; + ht->ht_FreqF = (float64)freq; + + ht->ht_Positions = (struct hvl_position *)(&ht[1]); + ht->ht_Instruments = (struct hvl_instrument *)(&ht->ht_Positions[posn]); + ht->ht_Subsongs = (uint16 *)(&ht->ht_Instruments[(insn+1)]); + ple = (struct hvl_plsentry *)(&ht->ht_Subsongs[ssn]); + + ht->ht_WaveformTab[0] = &waves[WO_TRIANGLE_04]; + ht->ht_WaveformTab[1] = &waves[WO_SAWTOOTH_04]; + ht->ht_WaveformTab[3] = &waves[WO_WHITENOISE]; + + ht->ht_Channels = 4; + ht->ht_PositionNr = posn; + ht->ht_Restart = (buf[8]<<8)|buf[9]; + ht->ht_SpeedMultiplier = ((buf[6]>>5)&3)+1; + ht->ht_TrackLength = trkl; + ht->ht_TrackNr = trkn; + ht->ht_InstrumentNr = insn; + ht->ht_SubsongNr = ssn; + ht->ht_defstereo = defstereo; + ht->ht_defpanleft = stereopan_left[ht->ht_defstereo]; + ht->ht_defpanright = stereopan_right[ht->ht_defstereo]; + ht->ht_mixgain = (defgain[ht->ht_defstereo]*256)/100; + + if( ht->ht_Restart >= ht->ht_PositionNr ) + ht->ht_Restart = ht->ht_PositionNr-1; + + // Do some validation + if( ( ht->ht_PositionNr > 1000 ) || + ( ht->ht_TrackLength > 64 ) || + ( ht->ht_InstrumentNr > 64 ) ) + { + printf( "%d,%d,%d\n", ht->ht_PositionNr, + ht->ht_TrackLength, + ht->ht_InstrumentNr ); + free( ht ); + printf( "Invalid file.\n" ); + return NULL; + } + + strncpy( ht->ht_Name, (TEXT *)&buf[(buf[4]<<8)|buf[5]], 128 ); + nptr = (TEXT *)&buf[((buf[4]<<8)|buf[5])+strlen( ht->ht_Name )+1]; + + bptr = &buf[14]; + + // Subsongs + for( i=0; iht_SubsongNr; i++ ) + { + ht->ht_Subsongs[i] = (bptr[0]<<8)|bptr[1]; + if( ht->ht_Subsongs[i] >= ht->ht_PositionNr ) + ht->ht_Subsongs[i] = 0; + bptr += 2; + } + + // Position list + for( i=0; iht_PositionNr; i++ ) + { + for( j=0; j<4; j++ ) + { + ht->ht_Positions[i].pos_Track[j] = *bptr++; + ht->ht_Positions[i].pos_Transpose[j] = *(int8 *)bptr++; + } + } + + // Tracks + for( i=0; i<=ht->ht_TrackNr; i++ ) + { + if( ( ( buf[6]&0x80 ) == 0x80 ) && ( i == 0 ) ) + { + for( j=0; jht_TrackLength; j++ ) + { + ht->ht_Tracks[i][j].stp_Note = 0; + ht->ht_Tracks[i][j].stp_Instrument = 0; + ht->ht_Tracks[i][j].stp_FX = 0; + ht->ht_Tracks[i][j].stp_FXParam = 0; + ht->ht_Tracks[i][j].stp_FXb = 0; + ht->ht_Tracks[i][j].stp_FXbParam = 0; + } + continue; + } + + for( j=0; jht_TrackLength; j++ ) + { + ht->ht_Tracks[i][j].stp_Note = (bptr[0]>>2)&0x3f; + ht->ht_Tracks[i][j].stp_Instrument = ((bptr[0]&0x3)<<4) | (bptr[1]>>4); + ht->ht_Tracks[i][j].stp_FX = bptr[1]&0xf; + ht->ht_Tracks[i][j].stp_FXParam = bptr[2]; + ht->ht_Tracks[i][j].stp_FXb = 0; + ht->ht_Tracks[i][j].stp_FXbParam = 0; + bptr += 3; + } + } + + // Instruments + for( i=1; i<=ht->ht_InstrumentNr; i++ ) + { + if( nptr < (TEXT *)(buf+buflen) ) + { + strncpy( ht->ht_Instruments[i].ins_Name, nptr, 128 ); + nptr += strlen( nptr )+1; + } else { + ht->ht_Instruments[i].ins_Name[0] = 0; + } + + ht->ht_Instruments[i].ins_Volume = bptr[0]; + ht->ht_Instruments[i].ins_FilterSpeed = ((bptr[1]>>3)&0x1f)|((bptr[12]>>2)&0x20); + ht->ht_Instruments[i].ins_WaveLength = bptr[1]&0x07; + + ht->ht_Instruments[i].ins_Envelope.aFrames = bptr[2]; + ht->ht_Instruments[i].ins_Envelope.aVolume = bptr[3]; + ht->ht_Instruments[i].ins_Envelope.dFrames = bptr[4]; + ht->ht_Instruments[i].ins_Envelope.dVolume = bptr[5]; + ht->ht_Instruments[i].ins_Envelope.sFrames = bptr[6]; + ht->ht_Instruments[i].ins_Envelope.rFrames = bptr[7]; + ht->ht_Instruments[i].ins_Envelope.rVolume = bptr[8]; + + ht->ht_Instruments[i].ins_FilterLowerLimit = bptr[12]&0x7f; + ht->ht_Instruments[i].ins_VibratoDelay = bptr[13]; + ht->ht_Instruments[i].ins_HardCutReleaseFrames = (bptr[14]>>4)&0x07; + ht->ht_Instruments[i].ins_HardCutRelease = bptr[14]&0x80?1:0; + ht->ht_Instruments[i].ins_VibratoDepth = bptr[14]&0x0f; + ht->ht_Instruments[i].ins_VibratoSpeed = bptr[15]; + ht->ht_Instruments[i].ins_SquareLowerLimit = bptr[16]; + ht->ht_Instruments[i].ins_SquareUpperLimit = bptr[17]; + ht->ht_Instruments[i].ins_SquareSpeed = bptr[18]; + ht->ht_Instruments[i].ins_FilterUpperLimit = bptr[19]&0x3f; + ht->ht_Instruments[i].ins_PList.pls_Speed = bptr[20]; + ht->ht_Instruments[i].ins_PList.pls_Length = bptr[21]; + + ht->ht_Instruments[i].ins_PList.pls_Entries = ple; + ple += bptr[21]; + + bptr += 22; + for( j=0; jht_Instruments[i].ins_PList.pls_Length; j++ ) + { + k = (bptr[0]>>5)&7; + if( k == 6 ) k = 12; + if( k == 7 ) k = 15; + l = (bptr[0]>>2)&7; + if( l == 6 ) l = 12; + if( l == 7 ) l = 15; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FX[1] = k; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FX[0] = l; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Waveform = ((bptr[0]<<1)&6) | (bptr[1]>>7); + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Fixed = (bptr[1]>>6)&1; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Note = bptr[1]&0x3f; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[0] = bptr[2]; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[1] = bptr[3]; + + // 1.6: Strip "toggle filter" commands if the module is + // version 0 (pre-filters). This is what AHX also does. + if( ( buf[3] == 0 ) && ( l == 4 ) && ( (bptr[2]&0xf0) != 0 ) ) + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[0] &= 0x0f; + if( ( buf[3] == 0 ) && ( k == 4 ) && ( (bptr[3]&0xf0) != 0 ) ) + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[1] &= 0x0f; // 1.8 + + bptr += 4; + } + } + + hvl_InitSubsong( ht, 0 ); + return ht; +} + +struct hvl_tune *hvl_LoadTune( uint8 *buf, uint32 buflen, uint32 freq, uint32 defstereo ) +{ + struct hvl_tune *ht; + uint8 *bptr; + TEXT *nptr; + uint32 i, j, posn, insn, ssn, chnn, hs, trkl, trkn; + struct hvl_plsentry *ple; + + if( ( buf[0] == 'T' ) && + ( buf[1] == 'H' ) && + ( buf[2] == 'X' ) && + ( buf[3] < 3 ) ) + return hvl_load_ahx( buf, buflen, defstereo, freq ); + + if( ( buf[0] != 'H' ) || + ( buf[1] != 'V' ) || + ( buf[2] != 'L' ) || + ( buf[3] > 1 ) ) + { + printf( "Invalid file.\n" ); + return NULL; + } + + posn = ((buf[6]&0x0f)<<8)|buf[7]; + insn = buf[12]; + ssn = buf[13]; + chnn = (buf[8]>>2)+4; + trkl = buf[10]; + trkn = buf[11]; + + hs = sizeof( struct hvl_tune ); + hs += sizeof( struct hvl_position ) * posn; + hs += sizeof( struct hvl_instrument ) * (insn+1); + hs += sizeof( uint16 ) * ssn; + + // Calculate the size of all instrument PList buffers + bptr = &buf[16]; + bptr += ssn*2; // Skip past the subsong list + bptr += posn*chnn*2; // Skip past the positions + + // Skip past the tracks + // 1.4: Fixed two really stupid bugs that cancelled each other + // out if the module had a blank first track (which is how + // come they were missed. + for( i=((buf[6]&0x80)==0x80)?1:0; i<=trkn; i++ ) + for( j=0; jht_Version = buf[3]; // 1.5 + ht->ht_Frequency = freq; + ht->ht_FreqF = (float64)freq; + + ht->ht_Positions = (struct hvl_position *)(&ht[1]); + ht->ht_Instruments = (struct hvl_instrument *)(&ht->ht_Positions[posn]); + ht->ht_Subsongs = (uint16 *)(&ht->ht_Instruments[(insn+1)]); + ple = (struct hvl_plsentry *)(&ht->ht_Subsongs[ssn]); + + ht->ht_WaveformTab[0] = &waves[WO_TRIANGLE_04]; + ht->ht_WaveformTab[1] = &waves[WO_SAWTOOTH_04]; + ht->ht_WaveformTab[3] = &waves[WO_WHITENOISE]; + + ht->ht_PositionNr = posn; + ht->ht_Channels = (buf[8]>>2)+4; + ht->ht_Restart = ((buf[8]&3)<<8)|buf[9]; + ht->ht_SpeedMultiplier = ((buf[6]>>5)&3)+1; + ht->ht_TrackLength = buf[10]; + ht->ht_TrackNr = buf[11]; + ht->ht_InstrumentNr = insn; + ht->ht_SubsongNr = ssn; + ht->ht_mixgain = (buf[14]<<8)/100; + ht->ht_defstereo = buf[15]; + ht->ht_defpanleft = stereopan_left[ht->ht_defstereo]; + ht->ht_defpanright = stereopan_right[ht->ht_defstereo]; + + if( ht->ht_Restart >= ht->ht_PositionNr ) + ht->ht_Restart = ht->ht_PositionNr-1; + + // Do some validation + if( ( ht->ht_PositionNr > 1000 ) || + ( ht->ht_TrackLength > 64 ) || + ( ht->ht_InstrumentNr > 64 ) ) + { + printf( "%d,%d,%d\n", ht->ht_PositionNr, + ht->ht_TrackLength, + ht->ht_InstrumentNr ); + free( ht ); + printf( "Invalid file.\n" ); + return NULL; + } + + strncpy( ht->ht_Name, (TEXT *)&buf[(buf[4]<<8)|buf[5]], 128 ); + nptr = (TEXT *)&buf[((buf[4]<<8)|buf[5])+strlen( ht->ht_Name )+1]; + + bptr = &buf[16]; + + // Subsongs + for( i=0; iht_SubsongNr; i++ ) + { + ht->ht_Subsongs[i] = (bptr[0]<<8)|bptr[1]; + bptr += 2; + } + + // Position list + for( i=0; iht_PositionNr; i++ ) + { + for( j=0; jht_Channels; j++ ) + { + ht->ht_Positions[i].pos_Track[j] = *bptr++; + ht->ht_Positions[i].pos_Transpose[j] = *(int8 *)bptr++; + } + } + + // Tracks + for( i=0; i<=ht->ht_TrackNr; i++ ) + { + if( ( ( buf[6]&0x80 ) == 0x80 ) && ( i == 0 ) ) + { + for( j=0; jht_TrackLength; j++ ) + { + ht->ht_Tracks[i][j].stp_Note = 0; + ht->ht_Tracks[i][j].stp_Instrument = 0; + ht->ht_Tracks[i][j].stp_FX = 0; + ht->ht_Tracks[i][j].stp_FXParam = 0; + ht->ht_Tracks[i][j].stp_FXb = 0; + ht->ht_Tracks[i][j].stp_FXbParam = 0; + } + continue; + } + + for( j=0; jht_TrackLength; j++ ) + { + if( bptr[0] == 0x3f ) + { + ht->ht_Tracks[i][j].stp_Note = 0; + ht->ht_Tracks[i][j].stp_Instrument = 0; + ht->ht_Tracks[i][j].stp_FX = 0; + ht->ht_Tracks[i][j].stp_FXParam = 0; + ht->ht_Tracks[i][j].stp_FXb = 0; + ht->ht_Tracks[i][j].stp_FXbParam = 0; + bptr++; + continue; + } + + ht->ht_Tracks[i][j].stp_Note = bptr[0]; + ht->ht_Tracks[i][j].stp_Instrument = bptr[1]; + ht->ht_Tracks[i][j].stp_FX = bptr[2]>>4; + ht->ht_Tracks[i][j].stp_FXParam = bptr[3]; + ht->ht_Tracks[i][j].stp_FXb = bptr[2]&0xf; + ht->ht_Tracks[i][j].stp_FXbParam = bptr[4]; + bptr += 5; + } + } + + + // Instruments + for( i=1; i<=ht->ht_InstrumentNr; i++ ) + { + if( nptr < (TEXT *)(buf+buflen) ) + { + strncpy( ht->ht_Instruments[i].ins_Name, nptr, 128 ); + nptr += strlen( nptr )+1; + } else { + ht->ht_Instruments[i].ins_Name[0] = 0; + } + + ht->ht_Instruments[i].ins_Volume = bptr[0]; + ht->ht_Instruments[i].ins_FilterSpeed = ((bptr[1]>>3)&0x1f)|((bptr[12]>>2)&0x20); + ht->ht_Instruments[i].ins_WaveLength = bptr[1]&0x07; + + ht->ht_Instruments[i].ins_Envelope.aFrames = bptr[2]; + ht->ht_Instruments[i].ins_Envelope.aVolume = bptr[3]; + ht->ht_Instruments[i].ins_Envelope.dFrames = bptr[4]; + ht->ht_Instruments[i].ins_Envelope.dVolume = bptr[5]; + ht->ht_Instruments[i].ins_Envelope.sFrames = bptr[6]; + ht->ht_Instruments[i].ins_Envelope.rFrames = bptr[7]; + ht->ht_Instruments[i].ins_Envelope.rVolume = bptr[8]; + + ht->ht_Instruments[i].ins_FilterLowerLimit = bptr[12]&0x7f; + ht->ht_Instruments[i].ins_VibratoDelay = bptr[13]; + ht->ht_Instruments[i].ins_HardCutReleaseFrames = (bptr[14]>>4)&0x07; + ht->ht_Instruments[i].ins_HardCutRelease = bptr[14]&0x80?1:0; + ht->ht_Instruments[i].ins_VibratoDepth = bptr[14]&0x0f; + ht->ht_Instruments[i].ins_VibratoSpeed = bptr[15]; + ht->ht_Instruments[i].ins_SquareLowerLimit = bptr[16]; + ht->ht_Instruments[i].ins_SquareUpperLimit = bptr[17]; + ht->ht_Instruments[i].ins_SquareSpeed = bptr[18]; + ht->ht_Instruments[i].ins_FilterUpperLimit = bptr[19]&0x3f; + ht->ht_Instruments[i].ins_PList.pls_Speed = bptr[20]; + ht->ht_Instruments[i].ins_PList.pls_Length = bptr[21]; + + ht->ht_Instruments[i].ins_PList.pls_Entries = ple; + ple += bptr[21]; + + bptr += 22; + for( j=0; jht_Instruments[i].ins_PList.pls_Length; j++ ) + { + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FX[0] = bptr[0]&0xf; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FX[1] = (bptr[1]>>3)&0xf; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Waveform = bptr[1]&7; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Fixed = (bptr[2]>>6)&1; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Note = bptr[2]&0x3f; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[0] = bptr[3]; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[1] = bptr[4]; + bptr += 5; + } + } + + hvl_InitSubsong( ht, 0 ); + return ht; +} + +void hvl_FreeTune( struct hvl_tune *ht ) +{ + if( !ht ) return; + free( ht ); +} + +void hvl_process_stepfx_1( struct hvl_tune *ht, struct hvl_voice *voice, int32 FX, int32 FXParam ) +{ + switch( FX ) + { + case 0x0: // Position Jump HI + if( ((FXParam&0x0f) > 0) && ((FXParam&0x0f) <= 9) ) + ht->ht_PosJump = FXParam & 0xf; + break; + + case 0x5: // Volume Slide + Tone Portamento + case 0xa: // Volume Slide + voice->vc_VolumeSlideDown = FXParam & 0x0f; + voice->vc_VolumeSlideUp = FXParam >> 4; + break; + + case 0x7: // Panning + if( FXParam > 127 ) + FXParam -= 256; + voice->vc_Pan = (FXParam+128); + voice->vc_SetPan = (FXParam+128); // 1.4 + voice->vc_PanMultLeft = panning_left[voice->vc_Pan]; + voice->vc_PanMultRight = panning_right[voice->vc_Pan]; + break; + + case 0xb: // Position jump + ht->ht_PosJump = ht->ht_PosJump*100 + (FXParam & 0x0f) + (FXParam >> 4)*10; + ht->ht_PatternBreak = 1; + if( ht->ht_PosJump <= ht->ht_PosNr ) + ht->ht_SongEndReached = 1; + break; + + case 0xd: // Pattern break + ht->ht_PosJump = ht->ht_PosNr+1; + ht->ht_PosJumpNote = (FXParam & 0x0f) + (FXParam>>4)*10; + ht->ht_PatternBreak = 1; + if( ht->ht_PosJumpNote > ht->ht_TrackLength ) + ht->ht_PosJumpNote = 0; + break; + + case 0xe: // Extended commands + switch( FXParam >> 4 ) + { + case 0xc: // Note cut + if( (FXParam & 0x0f) < ht->ht_Tempo ) + { + voice->vc_NoteCutWait = FXParam & 0x0f; + if( voice->vc_NoteCutWait ) + { + voice->vc_NoteCutOn = 1; + voice->vc_HardCutRelease = 0; + } + } + break; + + // 1.6: 0xd case removed + } + break; + + case 0xf: // Speed + ht->ht_Tempo = FXParam; + if( FXParam == 0 ) + ht->ht_SongEndReached = 1; + break; + } +} + +void hvl_process_stepfx_2( struct hvl_tune *ht, struct hvl_voice *voice, int32 FX, int32 FXParam, int32 *Note ) +{ + switch( FX ) + { + case 0x9: // Set squarewave offset + voice->vc_SquarePos = FXParam >> (5 - voice->vc_WaveLength); +// voice->vc_PlantSquare = 1; + voice->vc_IgnoreSquare = 1; + break; + + case 0x5: // Tone portamento + volume slide + case 0x3: // Tone portamento + if( FXParam != 0 ) voice->vc_PeriodSlideSpeed = FXParam; + + if( *Note ) + { + int32 new, diff; + + new = period_tab[*Note]; + diff = period_tab[voice->vc_TrackPeriod]; + diff -= new; + new = diff + voice->vc_PeriodSlidePeriod; + + if( new ) + voice->vc_PeriodSlideLimit = -diff; + } + voice->vc_PeriodSlideOn = 1; + voice->vc_PeriodSlideWithLimit = 1; + *Note = 0; + break; + } +} + +void hvl_process_stepfx_3( struct hvl_tune *ht, struct hvl_voice *voice, int32 FX, int32 FXParam ) +{ + int32 i; + + switch( FX ) + { + case 0x01: // Portamento up (period slide down) + voice->vc_PeriodSlideSpeed = -FXParam; + voice->vc_PeriodSlideOn = 1; + voice->vc_PeriodSlideWithLimit = 0; + break; + case 0x02: // Portamento down + voice->vc_PeriodSlideSpeed = FXParam; + voice->vc_PeriodSlideOn = 1; + voice->vc_PeriodSlideWithLimit = 0; + break; + case 0x04: // Filter override + if( ( FXParam == 0 ) || ( FXParam == 0x40 ) ) break; + if( FXParam < 0x40 ) + { + voice->vc_IgnoreFilter = FXParam; + break; + } + if( FXParam > 0x7f ) break; + voice->vc_FilterPos = FXParam - 0x40; + break; + case 0x0c: // Volume + FXParam &= 0xff; + if( FXParam <= 0x40 ) + { + voice->vc_NoteMaxVolume = FXParam; + break; + } + + if( (FXParam -= 0x50) < 0 ) break; // 1.6 + + if( FXParam <= 0x40 ) + { + for( i=0; iht_Channels; i++ ) + ht->ht_Voices[i].vc_TrackMasterVolume = FXParam; + break; + } + + if( (FXParam -= 0xa0-0x50) < 0 ) break; // 1.6 + + if( FXParam <= 0x40 ) + voice->vc_TrackMasterVolume = FXParam; + break; + + case 0xe: // Extended commands; + switch( FXParam >> 4 ) + { + case 0x1: // Fineslide up + voice->vc_PeriodSlidePeriod -= (FXParam & 0x0f); // 1.8 + voice->vc_PlantPeriod = 1; + break; + + case 0x2: // Fineslide down + voice->vc_PeriodSlidePeriod += (FXParam & 0x0f); // 1.8 + voice->vc_PlantPeriod = 1; + break; + + case 0x4: // Vibrato control + voice->vc_VibratoDepth = FXParam & 0x0f; + break; + + case 0x0a: // Fine volume up + voice->vc_NoteMaxVolume += FXParam & 0x0f; + + if( voice->vc_NoteMaxVolume > 0x40 ) + voice->vc_NoteMaxVolume = 0x40; + break; + + case 0x0b: // Fine volume down + voice->vc_NoteMaxVolume -= FXParam & 0x0f; + + if( voice->vc_NoteMaxVolume < 0 ) + voice->vc_NoteMaxVolume = 0; + break; + + case 0x0f: // Misc flags (1.5) + if( ht->ht_Version < 1 ) break; + switch( FXParam & 0xf ) + { + case 1: + voice->vc_OverrideTranspose = voice->vc_Transpose; + break; + } + break; + } + break; + } +} + +void hvl_process_step( struct hvl_tune *ht, struct hvl_voice *voice ) +{ + int32 Note, Instr, donenotedel; + struct hvl_step *Step; + + if( voice->vc_TrackOn == 0 ) + return; + + voice->vc_VolumeSlideUp = voice->vc_VolumeSlideDown = 0; + + Step = &ht->ht_Tracks[ht->ht_Positions[ht->ht_PosNr].pos_Track[voice->vc_VoiceNum]][ht->ht_NoteNr]; + + Note = Step->stp_Note; + Instr = Step->stp_Instrument; + + // --------- 1.6: from here -------------- + + donenotedel = 0; + + // Do notedelay here + if( ((Step->stp_FX&0xf)==0xe) && ((Step->stp_FXParam&0xf0)==0xd0) ) + { + if( voice->vc_NoteDelayOn ) + { + voice->vc_NoteDelayOn = 0; + donenotedel = 1; + } else { + if( (Step->stp_FXParam&0x0f) < ht->ht_Tempo ) + { + voice->vc_NoteDelayWait = Step->stp_FXParam & 0x0f; + if( voice->vc_NoteDelayWait ) + { + voice->vc_NoteDelayOn = 1; + return; + } + } + } + } + + if( (donenotedel==0) && ((Step->stp_FXb&0xf)==0xe) && ((Step->stp_FXbParam&0xf0)==0xd0) ) + { + if( voice->vc_NoteDelayOn ) + { + voice->vc_NoteDelayOn = 0; + } else { + if( (Step->stp_FXbParam&0x0f) < ht->ht_Tempo ) + { + voice->vc_NoteDelayWait = Step->stp_FXbParam & 0x0f; + if( voice->vc_NoteDelayWait ) + { + voice->vc_NoteDelayOn = 1; + return; + } + } + } + } + + // --------- 1.6: to here -------------- + + if( Note ) voice->vc_OverrideTranspose = 1000; // 1.5 + + hvl_process_stepfx_1( ht, voice, Step->stp_FX&0xf, Step->stp_FXParam ); + hvl_process_stepfx_1( ht, voice, Step->stp_FXb&0xf, Step->stp_FXbParam ); + + if( ( Instr ) && ( Instr <= ht->ht_InstrumentNr ) ) + { + struct hvl_instrument *Ins; + int16 SquareLower, SquareUpper, d6, d3, d4; + + /* 1.4: Reset panning to last set position */ + voice->vc_Pan = voice->vc_SetPan; + voice->vc_PanMultLeft = panning_left[voice->vc_Pan]; + voice->vc_PanMultRight = panning_right[voice->vc_Pan]; + + voice->vc_PeriodSlideSpeed = voice->vc_PeriodSlidePeriod = voice->vc_PeriodSlideLimit = 0; + + voice->vc_PerfSubVolume = 0x40; + voice->vc_ADSRVolume = 0; + voice->vc_Instrument = Ins = &ht->ht_Instruments[Instr]; + voice->vc_SamplePos = 0; + + voice->vc_ADSR.aFrames = Ins->ins_Envelope.aFrames; + voice->vc_ADSR.aVolume = Ins->ins_Envelope.aVolume*256/voice->vc_ADSR.aFrames; + voice->vc_ADSR.dFrames = Ins->ins_Envelope.dFrames; + voice->vc_ADSR.dVolume = (Ins->ins_Envelope.dVolume-Ins->ins_Envelope.aVolume)*256/voice->vc_ADSR.dFrames; + voice->vc_ADSR.sFrames = Ins->ins_Envelope.sFrames; + voice->vc_ADSR.rFrames = Ins->ins_Envelope.rFrames; + voice->vc_ADSR.rVolume = (Ins->ins_Envelope.rVolume-Ins->ins_Envelope.dVolume)*256/voice->vc_ADSR.rFrames; + + voice->vc_WaveLength = Ins->ins_WaveLength; + voice->vc_NoteMaxVolume = Ins->ins_Volume; + + voice->vc_VibratoCurrent = 0; + voice->vc_VibratoDelay = Ins->ins_VibratoDelay; + voice->vc_VibratoDepth = Ins->ins_VibratoDepth; + voice->vc_VibratoSpeed = Ins->ins_VibratoSpeed; + voice->vc_VibratoPeriod = 0; + + voice->vc_HardCutRelease = Ins->ins_HardCutRelease; + voice->vc_HardCut = Ins->ins_HardCutReleaseFrames; + + voice->vc_IgnoreSquare = voice->vc_SquareSlidingIn = 0; + voice->vc_SquareWait = voice->vc_SquareOn = 0; + + SquareLower = Ins->ins_SquareLowerLimit >> (5 - voice->vc_WaveLength); + SquareUpper = Ins->ins_SquareUpperLimit >> (5 - voice->vc_WaveLength); + + if( SquareUpper < SquareLower ) + { + int16 t = SquareUpper; + SquareUpper = SquareLower; + SquareLower = t; + } + + voice->vc_SquareUpperLimit = SquareUpper; + voice->vc_SquareLowerLimit = SquareLower; + + voice->vc_IgnoreFilter = voice->vc_FilterWait = voice->vc_FilterOn = 0; + voice->vc_FilterSlidingIn = 0; + + d6 = Ins->ins_FilterSpeed; + d3 = Ins->ins_FilterLowerLimit; + d4 = Ins->ins_FilterUpperLimit; + + if( d3 & 0x80 ) d6 |= 0x20; + if( d4 & 0x80 ) d6 |= 0x40; + + voice->vc_FilterSpeed = d6; + d3 &= ~0x80; + d4 &= ~0x80; + + if( d3 > d4 ) + { + int16 t = d3; + d3 = d4; + d4 = t; + } + + voice->vc_FilterUpperLimit = d4; + voice->vc_FilterLowerLimit = d3; + voice->vc_FilterPos = 32; + + voice->vc_PerfWait = voice->vc_PerfCurrent = 0; + voice->vc_PerfSpeed = Ins->ins_PList.pls_Speed; + voice->vc_PerfList = &voice->vc_Instrument->ins_PList; + + voice->vc_RingMixSource = NULL; // No ring modulation + voice->vc_RingSamplePos = 0; + voice->vc_RingPlantPeriod = 0; + voice->vc_RingNewWaveform = 0; + } + + voice->vc_PeriodSlideOn = 0; + + hvl_process_stepfx_2( ht, voice, Step->stp_FX&0xf, Step->stp_FXParam, &Note ); + hvl_process_stepfx_2( ht, voice, Step->stp_FXb&0xf, Step->stp_FXbParam, &Note ); + + if( Note ) + { + voice->vc_TrackPeriod = Note; + voice->vc_PlantPeriod = 1; + } + + hvl_process_stepfx_3( ht, voice, Step->stp_FX&0xf, Step->stp_FXParam ); + hvl_process_stepfx_3( ht, voice, Step->stp_FXb&0xf, Step->stp_FXbParam ); +} + +void hvl_plist_command_parse( struct hvl_tune *ht, struct hvl_voice *voice, int32 FX, int32 FXParam ) +{ + switch( FX ) + { + case 0: + if( ( FXParam > 0 ) && ( FXParam < 0x40 ) ) + { + if( voice->vc_IgnoreFilter ) + { + voice->vc_FilterPos = voice->vc_IgnoreFilter; + voice->vc_IgnoreFilter = 0; + } else { + voice->vc_FilterPos = FXParam; + } + voice->vc_NewWaveform = 1; + } + break; + + case 1: + voice->vc_PeriodPerfSlideSpeed = FXParam; + voice->vc_PeriodPerfSlideOn = 1; + break; + + case 2: + voice->vc_PeriodPerfSlideSpeed = -FXParam; + voice->vc_PeriodPerfSlideOn = 1; + break; + + case 3: + if( voice->vc_IgnoreSquare == 0 ) + voice->vc_SquarePos = FXParam >> (5-voice->vc_WaveLength); + else + voice->vc_IgnoreSquare = 0; + break; + + case 4: + if( FXParam == 0 ) + { + voice->vc_SquareInit = (voice->vc_SquareOn ^= 1); + voice->vc_SquareSign = 1; + } else { + + if( FXParam & 0x0f ) + { + voice->vc_SquareInit = (voice->vc_SquareOn ^= 1); + voice->vc_SquareSign = 1; + if(( FXParam & 0x0f ) == 0x0f ) + voice->vc_SquareSign = -1; + } + + if( FXParam & 0xf0 ) + { + voice->vc_FilterInit = (voice->vc_FilterOn ^= 1); + voice->vc_FilterSign = 1; + if(( FXParam & 0xf0 ) == 0xf0 ) + voice->vc_FilterSign = -1; + } + } + break; + + case 5: + voice->vc_PerfCurrent = FXParam; + break; + + case 7: + // Ring modulate with triangle + if(( FXParam >= 1 ) && ( FXParam <= 0x3C )) + { + voice->vc_RingBasePeriod = FXParam; + voice->vc_RingFixedPeriod = 1; + } else if(( FXParam >= 0x81 ) && ( FXParam <= 0xBC )) { + voice->vc_RingBasePeriod = FXParam-0x80; + voice->vc_RingFixedPeriod = 0; + } else { + voice->vc_RingBasePeriod = 0; + voice->vc_RingFixedPeriod = 0; + voice->vc_RingNewWaveform = 0; + voice->vc_RingAudioSource = NULL; // turn it off + voice->vc_RingMixSource = NULL; + break; + } + voice->vc_RingWaveform = 0; + voice->vc_RingNewWaveform = 1; + voice->vc_RingPlantPeriod = 1; + break; + + case 8: // Ring modulate with sawtooth + if(( FXParam >= 1 ) && ( FXParam <= 0x3C )) + { + voice->vc_RingBasePeriod = FXParam; + voice->vc_RingFixedPeriod = 1; + } else if(( FXParam >= 0x81 ) && ( FXParam <= 0xBC )) { + voice->vc_RingBasePeriod = FXParam-0x80; + voice->vc_RingFixedPeriod = 0; + } else { + voice->vc_RingBasePeriod = 0; + voice->vc_RingFixedPeriod = 0; + voice->vc_RingNewWaveform = 0; + voice->vc_RingAudioSource = NULL; + voice->vc_RingMixSource = NULL; + break; + } + + voice->vc_RingWaveform = 1; + voice->vc_RingNewWaveform = 1; + voice->vc_RingPlantPeriod = 1; + break; + + /* New in HivelyTracker 1.4 */ + case 9: + if( FXParam > 127 ) + FXParam -= 256; + voice->vc_Pan = (FXParam+128); + voice->vc_PanMultLeft = panning_left[voice->vc_Pan]; + voice->vc_PanMultRight = panning_right[voice->vc_Pan]; + break; + + case 12: + if( FXParam <= 0x40 ) + { + voice->vc_NoteMaxVolume = FXParam; + break; + } + + if( (FXParam -= 0x50) < 0 ) break; + + if( FXParam <= 0x40 ) + { + voice->vc_PerfSubVolume = FXParam; + break; + } + + if( (FXParam -= 0xa0-0x50) < 0 ) break; + + if( FXParam <= 0x40 ) + voice->vc_TrackMasterVolume = FXParam; + break; + + case 15: + voice->vc_PerfSpeed = voice->vc_PerfWait = FXParam; + break; + } +} + +void hvl_process_frame( struct hvl_tune *ht, struct hvl_voice *voice ) +{ + static uint8 Offsets[] = {0x00,0x04,0x04+0x08,0x04+0x08+0x10,0x04+0x08+0x10+0x20,0x04+0x08+0x10+0x20+0x40}; + + if( voice->vc_TrackOn == 0 ) + return; + + if( voice->vc_NoteDelayOn ) + { + if( voice->vc_NoteDelayWait <= 0 ) + hvl_process_step( ht, voice ); + else + voice->vc_NoteDelayWait--; + } + + if( voice->vc_HardCut ) + { + int32 nextinst; + + if( ht->ht_NoteNr+1 < ht->ht_TrackLength ) + nextinst = ht->ht_Tracks[voice->vc_Track][ht->ht_NoteNr+1].stp_Instrument; + else + nextinst = ht->ht_Tracks[voice->vc_NextTrack][0].stp_Instrument; + + if( nextinst ) + { + int32 d1; + + d1 = ht->ht_Tempo - voice->vc_HardCut; + + if( d1 < 0 ) d1 = 0; + + if( !voice->vc_NoteCutOn ) + { + voice->vc_NoteCutOn = 1; + voice->vc_NoteCutWait = d1; + voice->vc_HardCutReleaseF = -(d1-ht->ht_Tempo); + } else { + voice->vc_HardCut = 0; + } + } + } + + if( voice->vc_NoteCutOn ) + { + if( voice->vc_NoteCutWait <= 0 ) + { + voice->vc_NoteCutOn = 0; + + if( voice->vc_HardCutRelease ) + { + voice->vc_ADSR.rVolume = -(voice->vc_ADSRVolume - (voice->vc_Instrument->ins_Envelope.rVolume << 8)) / voice->vc_HardCutReleaseF; + voice->vc_ADSR.rFrames = voice->vc_HardCutReleaseF; + voice->vc_ADSR.aFrames = voice->vc_ADSR.dFrames = voice->vc_ADSR.sFrames = 0; + } else { + voice->vc_NoteMaxVolume = 0; + } + } else { + voice->vc_NoteCutWait--; + } + } + + // ADSR envelope + if( voice->vc_ADSR.aFrames ) + { + voice->vc_ADSRVolume += voice->vc_ADSR.aVolume; + + if( --voice->vc_ADSR.aFrames <= 0 ) + voice->vc_ADSRVolume = voice->vc_Instrument->ins_Envelope.aVolume << 8; + + } else if( voice->vc_ADSR.dFrames ) { + + voice->vc_ADSRVolume += voice->vc_ADSR.dVolume; + + if( --voice->vc_ADSR.dFrames <= 0 ) + voice->vc_ADSRVolume = voice->vc_Instrument->ins_Envelope.dVolume << 8; + + } else if( voice->vc_ADSR.sFrames ) { + + voice->vc_ADSR.sFrames--; + + } else if( voice->vc_ADSR.rFrames ) { + + voice->vc_ADSRVolume += voice->vc_ADSR.rVolume; + + if( --voice->vc_ADSR.rFrames <= 0 ) + voice->vc_ADSRVolume = voice->vc_Instrument->ins_Envelope.rVolume << 8; + } + + // VolumeSlide + voice->vc_NoteMaxVolume = voice->vc_NoteMaxVolume + voice->vc_VolumeSlideUp - voice->vc_VolumeSlideDown; + + if( voice->vc_NoteMaxVolume < 0 ) + voice->vc_NoteMaxVolume = 0; + else if( voice->vc_NoteMaxVolume > 0x40 ) + voice->vc_NoteMaxVolume = 0x40; + + // Portamento + if( voice->vc_PeriodSlideOn ) + { + if( voice->vc_PeriodSlideWithLimit ) + { + int32 d0, d2; + + d0 = voice->vc_PeriodSlidePeriod - voice->vc_PeriodSlideLimit; + d2 = voice->vc_PeriodSlideSpeed; + + if( d0 > 0 ) + d2 = -d2; + + if( d0 ) + { + int32 d3; + + d3 = (d0 + d2) ^ d0; + + if( d3 >= 0 ) + d0 = voice->vc_PeriodSlidePeriod + d2; + else + d0 = voice->vc_PeriodSlideLimit; + + voice->vc_PeriodSlidePeriod = d0; + voice->vc_PlantPeriod = 1; + } + } else { + voice->vc_PeriodSlidePeriod += voice->vc_PeriodSlideSpeed; + voice->vc_PlantPeriod = 1; + } + } + + // Vibrato + if( voice->vc_VibratoDepth ) + { + if( voice->vc_VibratoDelay <= 0 ) + { + voice->vc_VibratoPeriod = (vib_tab[voice->vc_VibratoCurrent] * voice->vc_VibratoDepth) >> 7; + voice->vc_PlantPeriod = 1; + voice->vc_VibratoCurrent = (voice->vc_VibratoCurrent + voice->vc_VibratoSpeed) & 0x3f; + } else { + voice->vc_VibratoDelay--; + } + } + + // PList + if( voice->vc_PerfList != 0 ) + { + if( voice->vc_Instrument && voice->vc_PerfCurrent < voice->vc_Instrument->ins_PList.pls_Length ) + { + if( --voice->vc_PerfWait <= 0 ) + { + uint32 i; + int32 cur; + + cur = voice->vc_PerfCurrent++; + voice->vc_PerfWait = voice->vc_PerfSpeed; + + if( voice->vc_PerfList->pls_Entries[cur].ple_Waveform ) + { + voice->vc_Waveform = voice->vc_PerfList->pls_Entries[cur].ple_Waveform-1; + voice->vc_NewWaveform = 1; + voice->vc_PeriodPerfSlideSpeed = voice->vc_PeriodPerfSlidePeriod = 0; + } + + // Holdwave + voice->vc_PeriodPerfSlideOn = 0; + + for( i=0; i<2; i++ ) + hvl_plist_command_parse( ht, voice, voice->vc_PerfList->pls_Entries[cur].ple_FX[i]&0xff, voice->vc_PerfList->pls_Entries[cur].ple_FXParam[i]&0xff ); + + // GetNote + if( voice->vc_PerfList->pls_Entries[cur].ple_Note ) + { + voice->vc_InstrPeriod = voice->vc_PerfList->pls_Entries[cur].ple_Note; + voice->vc_PlantPeriod = 1; + voice->vc_FixedNote = voice->vc_PerfList->pls_Entries[cur].ple_Fixed; + } + } + } else { + if( voice->vc_PerfWait ) + voice->vc_PerfWait--; + else + voice->vc_PeriodPerfSlideSpeed = 0; + } + } + + // PerfPortamento + if( voice->vc_PeriodPerfSlideOn ) + { + voice->vc_PeriodPerfSlidePeriod -= voice->vc_PeriodPerfSlideSpeed; + + if( voice->vc_PeriodPerfSlidePeriod ) + voice->vc_PlantPeriod = 1; + } + + if( voice->vc_Waveform == 3-1 && voice->vc_SquareOn ) + { + if( --voice->vc_SquareWait <= 0 ) + { + int32 d1, d2, d3; + + d1 = voice->vc_SquareLowerLimit; + d2 = voice->vc_SquareUpperLimit; + d3 = voice->vc_SquarePos; + + if( voice->vc_SquareInit ) + { + voice->vc_SquareInit = 0; + + if( d3 <= d1 ) + { + voice->vc_SquareSlidingIn = 1; + voice->vc_SquareSign = 1; + } else if( d3 >= d2 ) { + voice->vc_SquareSlidingIn = 1; + voice->vc_SquareSign = -1; + } + } + + // NoSquareInit + if( d1 == d3 || d2 == d3 ) + { + if( voice->vc_SquareSlidingIn ) + voice->vc_SquareSlidingIn = 0; + else + voice->vc_SquareSign = -voice->vc_SquareSign; + } + + d3 += voice->vc_SquareSign; + voice->vc_SquarePos = d3; + voice->vc_PlantSquare = 1; + voice->vc_SquareWait = voice->vc_Instrument->ins_SquareSpeed; + } + } + + if( voice->vc_FilterOn && --voice->vc_FilterWait <= 0 ) + { + uint32 i, FMax; + int32 d1, d2, d3; + + d1 = voice->vc_FilterLowerLimit; + d2 = voice->vc_FilterUpperLimit; + d3 = voice->vc_FilterPos; + + if( voice->vc_FilterInit ) + { + voice->vc_FilterInit = 0; + if( d3 <= d1 ) + { + voice->vc_FilterSlidingIn = 1; + voice->vc_FilterSign = 1; + } else if( d3 >= d2 ) { + voice->vc_FilterSlidingIn = 1; + voice->vc_FilterSign = -1; + } + } + + // NoFilterInit + FMax = (voice->vc_FilterSpeed < 3) ? (5-voice->vc_FilterSpeed) : 1; + + for( i=0; ivc_FilterSlidingIn ) + voice->vc_FilterSlidingIn = 0; + else + voice->vc_FilterSign = -voice->vc_FilterSign; + } + d3 += voice->vc_FilterSign; + } + + if( d3 < 1 ) d3 = 1; + if( d3 > 63 ) d3 = 63; + voice->vc_FilterPos = d3; + voice->vc_NewWaveform = 1; + voice->vc_FilterWait = voice->vc_FilterSpeed - 3; + + if( voice->vc_FilterWait < 1 ) + voice->vc_FilterWait = 1; + } + + if( voice->vc_Waveform == 3-1 || voice->vc_PlantSquare ) + { + // CalcSquare + int32 i; + int32 Delta; + int8 *SquarePtr; + int32 X; + + SquarePtr = &waves[WO_SQUARES+(voice->vc_FilterPos-0x20)*(0xfc+0xfc+0x80*0x1f+0x80+0x280*3)]; + X = voice->vc_SquarePos << (5 - voice->vc_WaveLength); + + if( X > 0x20 ) + { + X = 0x40 - X; + voice->vc_SquareReverse = 1; + } + + // OkDownSquare + if( X > 0 ) + SquarePtr += (X-1) << 7; + + Delta = 32 >> voice->vc_WaveLength; + ht->ht_WaveformTab[2] = voice->vc_SquareTempBuffer; + + for( i=0; i<(1<vc_WaveLength)*4; i++ ) + { + voice->vc_SquareTempBuffer[i] = *SquarePtr; + SquarePtr += Delta; + } + + voice->vc_NewWaveform = 1; + voice->vc_Waveform = 3-1; + voice->vc_PlantSquare = 0; + } + + if( voice->vc_Waveform == 4-1 ) + voice->vc_NewWaveform = 1; + + if( voice->vc_RingNewWaveform ) + { + int8 *rasrc; + + if( voice->vc_RingWaveform > 1 ) voice->vc_RingWaveform = 1; + + rasrc = ht->ht_WaveformTab[voice->vc_RingWaveform]; + rasrc += Offsets[voice->vc_WaveLength]; + + voice->vc_RingAudioSource = rasrc; + } + + + if( voice->vc_NewWaveform ) + { + int8 *AudioSource; + + AudioSource = ht->ht_WaveformTab[voice->vc_Waveform]; + + if( voice->vc_Waveform != 3-1 ) + AudioSource += (voice->vc_FilterPos-0x20)*(0xfc+0xfc+0x80*0x1f+0x80+0x280*3); + + if( voice->vc_Waveform < 3-1) + { + // GetWLWaveformlor2 + AudioSource += Offsets[voice->vc_WaveLength]; + } + + if( voice->vc_Waveform == 4-1 ) + { + // AddRandomMoving + AudioSource += ( voice->vc_WNRandom & (2*0x280-1) ) & ~1; + // GoOnRandom + voice->vc_WNRandom += 2239384; + voice->vc_WNRandom = ((((voice->vc_WNRandom >> 8) | (voice->vc_WNRandom << 24)) + 782323) ^ 75) - 6735; + } + + voice->vc_AudioSource = AudioSource; + } + + // Ring modulation period calculation + if( voice->vc_RingAudioSource ) + { + voice->vc_RingAudioPeriod = voice->vc_RingBasePeriod; + + if( !(voice->vc_RingFixedPeriod) ) + { + if( voice->vc_OverrideTranspose != 1000 ) // 1.5 + voice->vc_RingAudioPeriod += voice->vc_OverrideTranspose + voice->vc_TrackPeriod - 1; + else + voice->vc_RingAudioPeriod += voice->vc_Transpose + voice->vc_TrackPeriod - 1; + } + + if( voice->vc_RingAudioPeriod > 5*12 ) + voice->vc_RingAudioPeriod = 5*12; + + if( voice->vc_RingAudioPeriod < 0 ) + voice->vc_RingAudioPeriod = 0; + + voice->vc_RingAudioPeriod = period_tab[voice->vc_RingAudioPeriod]; + + if( !(voice->vc_RingFixedPeriod) ) + voice->vc_RingAudioPeriod += voice->vc_PeriodSlidePeriod; + + voice->vc_RingAudioPeriod += voice->vc_PeriodPerfSlidePeriod + voice->vc_VibratoPeriod; + + if( voice->vc_RingAudioPeriod > 0x0d60 ) + voice->vc_RingAudioPeriod = 0x0d60; + + if( voice->vc_RingAudioPeriod < 0x0071 ) + voice->vc_RingAudioPeriod = 0x0071; + } + + // Normal period calculation + voice->vc_AudioPeriod = voice->vc_InstrPeriod; + + if( !(voice->vc_FixedNote) ) + { + if( voice->vc_OverrideTranspose != 1000 ) // 1.5 + voice->vc_AudioPeriod += voice->vc_OverrideTranspose + voice->vc_TrackPeriod - 1; + else + voice->vc_AudioPeriod += voice->vc_Transpose + voice->vc_TrackPeriod - 1; + } + + if( voice->vc_AudioPeriod > 5*12 ) + voice->vc_AudioPeriod = 5*12; + + if( voice->vc_AudioPeriod < 0 ) + voice->vc_AudioPeriod = 0; + + voice->vc_AudioPeriod = period_tab[voice->vc_AudioPeriod]; + + if( !(voice->vc_FixedNote) ) + voice->vc_AudioPeriod += voice->vc_PeriodSlidePeriod; + + voice->vc_AudioPeriod += voice->vc_PeriodPerfSlidePeriod + voice->vc_VibratoPeriod; + + if( voice->vc_AudioPeriod > 0x0d60 ) + voice->vc_AudioPeriod = 0x0d60; + + if( voice->vc_AudioPeriod < 0x0071 ) + voice->vc_AudioPeriod = 0x0071; + + voice->vc_AudioVolume = (((((((voice->vc_ADSRVolume >> 8) * voice->vc_NoteMaxVolume) >> 6) * voice->vc_PerfSubVolume) >> 6) * voice->vc_TrackMasterVolume) >> 6); +} + +void hvl_set_audio( struct hvl_voice *voice, float64 freqf ) +{ + if( voice->vc_TrackOn == 0 ) + { + voice->vc_VoiceVolume = 0; + return; + } + + voice->vc_VoiceVolume = voice->vc_AudioVolume; + + if( voice->vc_PlantPeriod ) + { + float64 freq2; + uint32 delta; + + voice->vc_PlantPeriod = 0; + voice->vc_VoicePeriod = voice->vc_AudioPeriod; + + freq2 = Period2Freq( voice->vc_AudioPeriod ); + delta = (uint32)(freq2 / freqf); + + if( delta > (0x280<<16) ) delta -= (0x280<<16); + if( delta == 0 ) delta = 1; + voice->vc_Delta = delta; + } + + if( voice->vc_NewWaveform ) + { + int8 *src; + + src = voice->vc_AudioSource; + + if( voice->vc_Waveform == 4-1 ) + { + memcpy( &voice->vc_VoiceBuffer[0], src, 0x280 ); + } else { + uint32 i, WaveLoops; + + WaveLoops = (1 << (5 - voice->vc_WaveLength)) * 5; + + for( i=0; ivc_VoiceBuffer[i*4*(1<vc_WaveLength)], src, 4*(1<vc_WaveLength) ); + } + + voice->vc_VoiceBuffer[0x280] = voice->vc_VoiceBuffer[0]; + voice->vc_MixSource = voice->vc_VoiceBuffer; + } + + /* Ring Modulation */ + if( voice->vc_RingPlantPeriod ) + { + float64 freq2; + uint32 delta; + + voice->vc_RingPlantPeriod = 0; + freq2 = Period2Freq( voice->vc_RingAudioPeriod ); + delta = (uint32)(freq2 / freqf); + + if( delta > (0x280<<16) ) delta -= (0x280<<16); + if( delta == 0 ) delta = 1; + voice->vc_RingDelta = delta; + } + + if( voice->vc_RingNewWaveform ) + { + int8 *src; + uint32 i, WaveLoops; + + src = voice->vc_RingAudioSource; + + WaveLoops = (1 << (5 - voice->vc_WaveLength)) * 5; + + for( i=0; ivc_RingVoiceBuffer[i*4*(1<vc_WaveLength)], src, 4*(1<vc_WaveLength) ); + + voice->vc_RingVoiceBuffer[0x280] = voice->vc_RingVoiceBuffer[0]; + voice->vc_RingMixSource = voice->vc_RingVoiceBuffer; + } +} + +void hvl_play_irq( struct hvl_tune *ht ) +{ + uint32 i; + + if( ht->ht_StepWaitFrames <= 0 ) + { + if( ht->ht_GetNewPosition ) + { + int32 nextpos = (ht->ht_PosNr+1==ht->ht_PositionNr)?0:(ht->ht_PosNr+1); + + for( i=0; iht_Channels; i++ ) + { + ht->ht_Voices[i].vc_Track = ht->ht_Positions[ht->ht_PosNr].pos_Track[i]; + ht->ht_Voices[i].vc_Transpose = ht->ht_Positions[ht->ht_PosNr].pos_Transpose[i]; + ht->ht_Voices[i].vc_NextTrack = ht->ht_Positions[nextpos].pos_Track[i]; + ht->ht_Voices[i].vc_NextTranspose = ht->ht_Positions[nextpos].pos_Transpose[i]; + } + ht->ht_GetNewPosition = 0; + } + + for( i=0; iht_Channels; i++ ) + hvl_process_step( ht, &ht->ht_Voices[i] ); + + ht->ht_StepWaitFrames = ht->ht_Tempo; + } + + for( i=0; iht_Channels; i++ ) + hvl_process_frame( ht, &ht->ht_Voices[i] ); + + ht->ht_PlayingTime++; + if( ht->ht_Tempo > 0 && --ht->ht_StepWaitFrames <= 0 ) + { + if( !ht->ht_PatternBreak ) + { + ht->ht_NoteNr++; + if( ht->ht_NoteNr >= ht->ht_TrackLength ) + { + ht->ht_PosJump = ht->ht_PosNr+1; + ht->ht_PosJumpNote = 0; + ht->ht_PatternBreak = 1; + } + } + + if( ht->ht_PatternBreak ) + { + ht->ht_PatternBreak = 0; + ht->ht_PosNr = ht->ht_PosJump; + ht->ht_NoteNr = ht->ht_PosJumpNote; + if( ht->ht_PosNr == ht->ht_PositionNr ) + { + ht->ht_SongEndReached = 1; + ht->ht_PosNr = ht->ht_Restart; + } + ht->ht_PosJumpNote = 0; + ht->ht_PosJump = 0; + + ht->ht_GetNewPosition = 1; + } + } + + for( i=0; iht_Channels; i++ ) + hvl_set_audio( &ht->ht_Voices[i], ht->ht_Frequency ); +} + +void hvl_mixchunk( struct hvl_tune *ht, uint32 samples, int8 *buf1, int8 *buf2, int32 bufmod ) +{ + int8 *src[MAX_CHANNELS]; + int8 *rsrc[MAX_CHANNELS]; + uint32 delta[MAX_CHANNELS]; + uint32 rdelta[MAX_CHANNELS]; + int32 vol[MAX_CHANNELS]; + uint32 pos[MAX_CHANNELS]; + uint32 rpos[MAX_CHANNELS]; + uint32 cnt; + int32 panl[MAX_CHANNELS]; + int32 panr[MAX_CHANNELS]; +// uint32 vu[MAX_CHANNELS]; + int32 a=0, b=0, j; + uint32 i, chans, loops; + + chans = ht->ht_Channels; + for( i=0; iht_Voices[i].vc_Delta; + vol[i] = ht->ht_Voices[i].vc_VoiceVolume; + pos[i] = ht->ht_Voices[i].vc_SamplePos; + src[i] = ht->ht_Voices[i].vc_MixSource; + panl[i] = ht->ht_Voices[i].vc_PanMultLeft; + panr[i] = ht->ht_Voices[i].vc_PanMultRight; + + /* Ring Modulation */ + rdelta[i]= ht->ht_Voices[i].vc_RingDelta; + rpos[i] = ht->ht_Voices[i].vc_RingSamplePos; + rsrc[i] = ht->ht_Voices[i].vc_RingMixSource; + +// vu[i] = 0; + } + + do + { + loops = samples; + for( i=0; i= (0x280 << 16)) pos[i] -= 0x280<<16; + cnt = ((0x280<<16) - pos[i] - 1) / delta[i] + 1; + if( cnt < loops ) loops = cnt; + + if( rsrc[i] ) + { + if( rpos[i] >= (0x280<<16)) rpos[i] -= 0x280<<16; + cnt = ((0x280<<16) - rpos[i] - 1) / rdelta[i] + 1; + if( cnt < loops ) loops = cnt; + } + + } + + samples -= loops; + + // Inner loop + do + { + a=0; + b=0; + for( i=0; i>16]*rsrc[i][rpos[i]>>16])>>7)*vol[i]; + rpos[i] += rdelta[i]; + } else { + j = src[i][pos[i]>>16]*vol[i]; + } + +// if( abs( j ) > vu[i] ) vu[i] = abs( j ); + + a += (j * panl[i]) >> 7; + b += (j * panr[i]) >> 7; + pos[i] += delta[i]; + } + + a = (a*ht->ht_mixgain)>>8; + b = (b*ht->ht_mixgain)>>8; + + *(int16 *)buf1 = a; + *(int16 *)buf2 = b; + + loops--; + + buf1 += bufmod; + buf2 += bufmod; + } while( loops > 0 ); + } while( samples > 0 ); + + for( i=0; iht_Voices[i].vc_SamplePos = pos[i]; + ht->ht_Voices[i].vc_RingSamplePos = rpos[i]; +// ht->ht_Voices[i].vc_VUMeter = vu[i]; + } +} + +void hvl_DecodeFrame( struct hvl_tune *ht, int8 *buf1, int8 *buf2, int32 bufmod ) +{ + uint32 samples, loops; + + samples = ht->ht_Frequency/50/ht->ht_SpeedMultiplier; + loops = ht->ht_SpeedMultiplier; + + do + { + hvl_play_irq( ht ); + hvl_mixchunk( ht, samples, buf1, buf2, bufmod ); + buf1 += samples * bufmod; + buf2 += samples * bufmod; + loops--; + } while( loops ); +} diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/hvl_replay.h b/Cerbios Bios/BootAnims/Nyan Cat/source/hvl_replay.h new file mode 100644 index 0000000..cafec06 --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/hvl_replay.h @@ -0,0 +1,230 @@ + +typedef char int8; +typedef unsigned char uint8; +typedef short int16; +typedef unsigned short uint16; +typedef int int32; +typedef unsigned int uint32; +typedef double float64; +typedef char TEXT; +typedef int BOOL; + +#define TRUE 1 +#define FALSE 0 + +// Woohoo! +#define MAX_CHANNELS 16 + +#define Period2Freq(period) ((3546897.f * 65536.f) / (period)) + +struct hvl_envelope +{ + int16 aFrames, aVolume; + int16 dFrames, dVolume; + int16 sFrames; + int16 rFrames, rVolume; + int16 pad; +}; + +struct hvl_plsentry +{ + uint8 ple_Note; + uint8 ple_Waveform; + int16 ple_Fixed; + int8 ple_FX[2]; + int8 ple_FXParam[2]; +}; + +struct hvl_plist +{ + int16 pls_Speed; + int16 pls_Length; + struct hvl_plsentry *pls_Entries; +}; + +struct hvl_instrument +{ + TEXT ins_Name[128]; + uint8 ins_Volume; + uint8 ins_WaveLength; + uint8 ins_FilterLowerLimit; + uint8 ins_FilterUpperLimit; + uint8 ins_FilterSpeed; + uint8 ins_SquareLowerLimit; + uint8 ins_SquareUpperLimit; + uint8 ins_SquareSpeed; + uint8 ins_VibratoDelay; + uint8 ins_VibratoSpeed; + uint8 ins_VibratoDepth; + uint8 ins_HardCutRelease; + uint8 ins_HardCutReleaseFrames; + struct hvl_envelope ins_Envelope; + struct hvl_plist ins_PList; +}; + +struct hvl_position +{ + uint8 pos_Track[MAX_CHANNELS]; + int8 pos_Transpose[MAX_CHANNELS]; +}; + +struct hvl_step +{ + uint8 stp_Note; + uint8 stp_Instrument; + uint8 stp_FX; + uint8 stp_FXParam; + uint8 stp_FXb; + uint8 stp_FXbParam; +}; + +struct hvl_voice +{ + int16 vc_Track; + int16 vc_NextTrack; + int16 vc_Transpose; + int16 vc_NextTranspose; + int16 vc_OverrideTranspose; // 1.5 + int32 vc_ADSRVolume; + struct hvl_envelope vc_ADSR; + struct hvl_instrument *vc_Instrument; + uint32 vc_SamplePos; + uint32 vc_Delta; + uint16 vc_InstrPeriod; + uint16 vc_TrackPeriod; + uint16 vc_VibratoPeriod; + uint16 vc_WaveLength; + int16 vc_NoteMaxVolume; + uint16 vc_PerfSubVolume; + uint8 vc_NewWaveform; + uint8 vc_Waveform; + uint8 vc_PlantPeriod; + uint8 vc_VoiceVolume; + uint8 vc_PlantSquare; + uint8 vc_IgnoreSquare; + uint8 vc_FixedNote; + int16 vc_VolumeSlideUp; + int16 vc_VolumeSlideDown; + int16 vc_HardCut; + uint8 vc_HardCutRelease; + int16 vc_HardCutReleaseF; + uint8 vc_PeriodSlideOn; + int16 vc_PeriodSlideSpeed; + int16 vc_PeriodSlidePeriod; + int16 vc_PeriodSlideLimit; + int16 vc_PeriodSlideWithLimit; + int16 vc_PeriodPerfSlideSpeed; + int16 vc_PeriodPerfSlidePeriod; + uint8 vc_PeriodPerfSlideOn; + int16 vc_VibratoDelay; + int16 vc_VibratoSpeed; + int16 vc_VibratoCurrent; + int16 vc_VibratoDepth; + int16 vc_SquareOn; + int16 vc_SquareInit; + int16 vc_SquareWait; + int16 vc_SquareLowerLimit; + int16 vc_SquareUpperLimit; + int16 vc_SquarePos; + int16 vc_SquareSign; + int16 vc_SquareSlidingIn; + int16 vc_SquareReverse; + uint8 vc_FilterOn; + uint8 vc_FilterInit; + int16 vc_FilterWait; + int16 vc_FilterSpeed; + int16 vc_FilterUpperLimit; + int16 vc_FilterLowerLimit; + int16 vc_FilterPos; + int16 vc_FilterSign; + int16 vc_FilterSlidingIn; + int16 vc_IgnoreFilter; + int16 vc_PerfCurrent; + int16 vc_PerfSpeed; + int16 vc_PerfWait; + struct hvl_plist *vc_PerfList; + int8 *vc_AudioPointer; + int8 *vc_AudioSource; + uint8 vc_NoteDelayOn; + uint8 vc_NoteCutOn; + int16 vc_NoteDelayWait; + int16 vc_NoteCutWait; + int16 vc_AudioPeriod; + int16 vc_AudioVolume; + int32 vc_WNRandom; + int8 *vc_MixSource; + int8 vc_SquareTempBuffer[0x80]; + int8 vc_VoiceBuffer[0x282*4]; + uint8 vc_VoiceNum; + uint8 vc_TrackMasterVolume; + uint8 vc_TrackOn; + int16 vc_VoicePeriod; + uint32 vc_Pan; + uint32 vc_SetPan; // New for 1.4 + uint32 vc_PanMultLeft; + uint32 vc_PanMultRight; + uint32 vc_RingSamplePos; + uint32 vc_RingDelta; + int8 *vc_RingMixSource; + uint8 vc_RingPlantPeriod; + int16 vc_RingInstrPeriod; + int16 vc_RingBasePeriod; + int16 vc_RingAudioPeriod; + int8 *vc_RingAudioSource; + uint8 vc_RingNewWaveform; + uint8 vc_RingWaveform; + uint8 vc_RingFixedPeriod; + int8 vc_RingVoiceBuffer[0x282*4]; +}; + +struct hvl_tune +{ + TEXT ht_Name[128]; + uint16 ht_SongNum; + uint32 ht_Frequency; + float64 ht_FreqF; + int8 *ht_WaveformTab[MAX_CHANNELS]; + uint16 ht_Restart; + uint16 ht_PositionNr; + uint8 ht_SpeedMultiplier; + uint8 ht_TrackLength; + uint8 ht_TrackNr; + uint8 ht_InstrumentNr; + uint8 ht_SubsongNr; + uint16 ht_PosJump; + uint32 ht_PlayingTime; + int16 ht_Tempo; + int16 ht_PosNr; + int16 ht_StepWaitFrames; + int16 ht_NoteNr; + uint16 ht_PosJumpNote; + uint8 ht_GetNewPosition; + uint8 ht_PatternBreak; + uint8 ht_SongEndReached; + uint8 ht_Stereo; + uint16 *ht_Subsongs; + uint16 ht_Channels; + struct hvl_position *ht_Positions; + struct hvl_step ht_Tracks[256][64]; + struct hvl_instrument *ht_Instruments; + struct hvl_voice ht_Voices[MAX_CHANNELS]; + int32 ht_defstereo; + int32 ht_defpanleft; + int32 ht_defpanright; + int32 ht_mixgain; + uint8 ht_Version; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +void hvl_DecodeFrame( struct hvl_tune *ht, int8 *buf1, int8 *buf2, int32 bufmod ); +void hvl_InitReplayer( void ); +BOOL hvl_InitSubsong( struct hvl_tune *ht, uint32 nr ); +struct hvl_tune *hvl_LoadTune( uint8 *buf, uint32 buflen, uint32 freq, uint32 defstereo ); +void hvl_FreeTune( struct hvl_tune *ht ); + +#ifdef __cplusplus +} +#endif diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/main.cpp b/Cerbios Bios/BootAnims/Nyan Cat/source/main.cpp new file mode 100644 index 0000000..e53b3ff --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/main.cpp @@ -0,0 +1,477 @@ +#include +#include +#include + +#include +#include + +#include "externals.h" +#include "utility.h" +#include "animation.h" +#include "hvl_replay.h" +#include "nyansong.h" +#include "dsstdfx.h" +#include "dsstdfx_bin.h" + +//----------------------------------------------------------------------------- +// Global variables +//----------------------------------------------------------------------------- + +float bob, weave; + +unsigned short colors[256] = { 0 }; + +ULONG g_Frame = 0; +#define FINALFRAME 1150 +BOOL g_ExitNow = FALSE; +BOOL g_SoundEnabled = FALSE; +BOOL g_PlayOnce = TRUE; + +struct hvl_tune *ht = NULL; + +LPDIRECTSOUND8 g_pDSound; +LPDIRECTSOUNDBUFFER8 g_pDSBuffer; +WAVEFORMATEX g_wfx; +DSBUFFERDESC g_dsbd; +HANDLE hFillAudioBufferEvent; + +#define AUDIOFRAMESIZE ((44100*2*2)/50) +#define AUDIOFRAMES 10 +#define AUDIOBUFFERSIZE (AUDIOFRAMESIZE*AUDIOFRAMES) +DSBPOSITIONNOTIFY g_dspn[AUDIOFRAMES]; + +int nextaudiobuf = 0; + +ULONG g_ButtonsLast = 0; +ULONG g_ButtonsHeld = 0; +ULONG g_ButtonsPressed = 0; +ULONG g_ButtonsReleased = 0; +HANDLE g_Controller[4]; + +LPDIRECT3D8 g_pD3D = NULL; // Used to create the D3DDevice +LPDIRECT3DDEVICE8 g_pd3dDevice = NULL; // Our rendering device + +D3DMATERIAL8 g_mtrl; + +D3DXMATRIX g_matView; +D3DXMATRIX g_matProj; +D3DXMATRIX g_matWorld; + +//----------------------------------------------------------------------------- +// Name: XBUtil_DebugPrint() +// Desc: For printing to the debugger with formatting. +//----------------------------------------------------------------------------- +VOID XBUtil_DebugPrint( const CHAR* buf, ... ) +{ + CHAR strBuffer[1024]; + + va_list arglist; + va_start( arglist, buf ); + _vsnprintf( strBuffer, sizeof(strBuffer), buf, arglist ); + va_end( arglist ); + + strBuffer[sizeof(strBuffer)-1] = '\0'; + OutputDebugStringA( strBuffer ); +} + +VOID XBUtil_Reboot(VOID) +{ + HalReturnToFirmware(2); +} + +typedef struct { + DWORD dwWidth; + DWORD dwHeight; + BOOL fProgressive; + BOOL fWideScreen; + DWORD dwFreq; +} DISPLAY_MODE; + +// Display modes in order of our preference +DISPLAY_MODE g_aDisplayModes[] = +{ +// Width Height Progressive Widescreen + +// HDTV Progressive Modes + { 1280, 720, TRUE, TRUE, 60 }, // 1280x720 progressive 16x9 + +// EDTV Progressive Modes + { 720, 480, TRUE, TRUE, 60 }, // 720x480 progressive 16x9 + { 640, 480, TRUE, TRUE, 60 }, // 640x480 progressive 16x9 + { 720, 480, TRUE, FALSE, 60 }, // 720x480 progressive 4x3 + { 640, 480, TRUE, FALSE, 60 }, // 640x480 progressive 4x3 + +// HDTV Interlaced Modes +// { 1920, 1080, FALSE, TRUE, 60 }, // 1920x1080 interlaced 16x9 + +// SDTV PAL-50 Interlaced Modes + { 720, 480, FALSE, TRUE, 50 }, // 720x480 interlaced 16x9 50Hz + { 640, 480, FALSE, TRUE, 50 }, // 640x480 interlaced 16x9 50Hz + { 720, 480, FALSE, FALSE, 50 }, // 720x480 interlaced 4x3 50Hz + { 640, 480, FALSE, FALSE, 50 }, // 640x480 interlaced 4x3 50Hz + +// SDTV NTSC / PAL-60 Interlaced Modes + { 720, 480, FALSE, TRUE, 60 }, // 720x480 interlaced 16x9 + { 640, 480, FALSE, TRUE, 60 }, // 640x480 interlaced 16x9 + { 720, 480, FALSE, FALSE, 60 }, // 720x480 interlaced 4x3 + { 640, 480, FALSE, FALSE, 60 }, // 640x480 interlaced 4x3 +}; +#define NUM_MODES ( sizeof( g_aDisplayModes ) / sizeof( g_aDisplayModes[0] ) ) + +/////////////////////////////////////////////////////////////////////////////// +BOOL SupportsMode( DISPLAY_MODE mode, DWORD dwVideoStandard, DWORD dwVideoFlags ) +{ + if( mode.dwFreq == 60 && !(dwVideoFlags & XC_VIDEO_FLAGS_PAL_60Hz) && (dwVideoStandard == XC_VIDEO_STANDARD_PAL_I)) + return FALSE; + + if( mode.dwFreq == 50 && (dwVideoStandard != XC_VIDEO_STANDARD_PAL_I)) + return FALSE; + + // Need to check for widescreen on 480 modes only - + // 720p and 1080i are by definition widescreen. + if( mode.dwHeight == 480 && mode.fWideScreen && !(dwVideoFlags & XC_VIDEO_FLAGS_WIDESCREEN ) ) + return FALSE; + + // Explicit check for 480p + if( mode.dwHeight == 480 && mode.fProgressive && !(dwVideoFlags & XC_VIDEO_FLAGS_HDTV_480p) ) + return FALSE; + + // Explicit check for 720p (only 720 mode) + if( mode.dwHeight == 720 && !(dwVideoFlags & XC_VIDEO_FLAGS_HDTV_720p) ) + return FALSE; + + // Explicit check for 1080i (only 1080 mode) + if( mode.dwHeight == 1080 && !(dwVideoFlags & XC_VIDEO_FLAGS_HDTV_1080i) ) + return FALSE; + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Name: SetupMatrices() +// Desc: Creates the world, view, and projection transform matrices. +//----------------------------------------------------------------------------- +VOID SetupMatrices(BOOL bWidescreen) +{ + float scale = 0.6f; + + // Set up our view matrix. + const D3DXVECTOR3 vEyePos( 0.0f, 0.0f, 10.0f ); + const D3DXVECTOR3 vLookAt( 0.0f, 0.0f, 0.0f ); + const D3DXVECTOR3 vUp ( 0.0f, 1.0f, 0.0f ); + D3DXMatrixLookAtLH( &g_matView, &vEyePos, &vLookAt, &vUp ); + + // For the projection matrix. + D3DXMatrixOrthoLH( &g_matProj, bWidescreen ? (106.0f*scale) : (80.0f*scale), (48.0f*scale), 1.0f, 100.0f ); + + D3DXMatrixIdentity( &g_matWorld ); +} + +//----------------------------------------------------------------------------- +// Name: InitD3D() +// Desc: Initializes Direct3D +//----------------------------------------------------------------------------- +HRESULT InitD3D() +{ + DWORD m_dwVideoFlags, m_dwVideoStandard; + DWORD m_dwCurrentMode = 0; + + // Create the D3D object. + if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) ) + return E_FAIL; + + // Find the best supported video mode. + m_dwVideoStandard = XGetVideoStandard(); + m_dwVideoFlags = XGetVideoFlags(); + for(m_dwCurrentMode = 0; m_dwCurrentMode < NUM_MODES-1; m_dwCurrentMode++) + { + if(SupportsMode( g_aDisplayModes[ m_dwCurrentMode ], m_dwVideoStandard, m_dwVideoFlags )) break; + } + + // Set up the structure used to create the D3DDevice. + D3DPRESENT_PARAMETERS d3dpp; + ZeroMemory( &d3dpp, sizeof(d3dpp) ); + d3dpp.BackBufferWidth = g_aDisplayModes[ m_dwCurrentMode ].dwWidth; + d3dpp.BackBufferHeight = g_aDisplayModes[ m_dwCurrentMode ].dwHeight; + d3dpp.Flags = g_aDisplayModes[ m_dwCurrentMode ].fProgressive ? D3DPRESENTFLAG_PROGRESSIVE : D3DPRESENTFLAG_INTERLACED; + d3dpp.Flags |= g_aDisplayModes[ m_dwCurrentMode ].fWideScreen ? D3DPRESENTFLAG_WIDESCREEN : 0; + d3dpp.FullScreen_RefreshRateInHz = g_aDisplayModes[ m_dwCurrentMode ].dwFreq; + d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; + d3dpp.BackBufferCount = 1; + d3dpp.EnableAutoDepthStencil = TRUE; + d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + d3dpp.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES_SUPERSAMPLE_GAUSSIAN; + + // Create the Direct3D device. + if( FAILED( g_pD3D->CreateDevice( 0, D3DDEVTYPE_HAL, NULL, + D3DCREATE_HARDWARE_VERTEXPROCESSING, + &d3dpp, &g_pd3dDevice ) ) ) + return E_FAIL; + + SetupMatrices(g_aDisplayModes[ m_dwCurrentMode ].fWideScreen); + + return S_OK; +} + +//----------------------------------------------------------------------------- +// Name: Render() +// Desc: Draws the scene +//----------------------------------------------------------------------------- +VOID Render() +{ + int x, y; + float vx, vy; + unsigned int /*fg,*/ bg, r, g, b, fade; + + // Clear the backbuffer and the zbuffer + g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, + D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); + + DirectSoundDoWork(); + + g_pd3dDevice->SetTransform( D3DTS_WORLD, &g_matWorld ); + g_pd3dDevice->SetTransform( D3DTS_VIEW, &g_matView ); + g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &g_matProj ); + + g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); + g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE ); + g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + + g_pd3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x08 ); + g_pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); + + g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff ); + g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE ); + + g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DISABLE ); + g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + g_pd3dDevice->SetVertexShader( D3DFVF_XYZ ); + + if(g_Frame < 50) { + fade = 0; + } else if(g_Frame < 80) { + fade = g_Frame - 50; + } else if(g_Frame > (FINALFRAME - 30)) { + fade = FINALFRAME - g_Frame; + } else { + fade = 30; + } + + for(y = 0; y < FRAME_HEIGHT; y++ ) { + vy = (FRAME_HEIGHT * 0.5f) - y + bob; + for(x = 0; x < FRAME_WIDTH; x++ ) { + vx = (FRAME_WIDTH * 0.5f) - x + weave; + + bg = colors[frames[((g_Frame/4)%12)][(y*FRAME_WIDTH)+x]]; + if(bg != 0x000) { + r = (bg & 0xF00) >> 8; + g = (bg & 0x0F0) >> 4; + b = (bg & 0x00F) >> 0; + + g_mtrl.Ambient.r = (r * fade) / (15.0f * 30.0f); + g_mtrl.Ambient.g = (g * fade) / (15.0f * 30.0f); + g_mtrl.Ambient.b = (b * fade) / (15.0f * 30.0f); + g_pd3dDevice->SetMaterial( &g_mtrl ); + + g_pd3dDevice->Begin( D3DPT_QUADLIST ); + g_pd3dDevice->SetVertexData4f( D3DVSDE_VERTEX, vx-1.0f, vy-1.0f, 0.0f, 1.0f ); + g_pd3dDevice->SetVertexData4f( D3DVSDE_VERTEX, vx+0.0f, vy-1.0f, 0.0f, 1.0f ); + g_pd3dDevice->SetVertexData4f( D3DVSDE_VERTEX, vx+0.0f, vy+0.0f, 0.0f, 1.0f ); + g_pd3dDevice->SetVertexData4f( D3DVSDE_VERTEX, vx-1.0f, vy+0.0f, 0.0f, 1.0f ); + g_pd3dDevice->End(); + } + } + } + + // Present the backbuffer contents to the display + g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); +} + +VOID XInputGetStateAll() +{ + XINPUT_STATE ControllerState[4]; + int i, j, c = -1; + ULONG ButtonsCurrent = 0; + + for (i = 0; i < 4; i++) + { + if (g_Controller[i]) + { + XInputGetState(g_Controller[i], &ControllerState[i]); + ButtonsCurrent |= (ControllerState[i].Gamepad.wButtons) & 0xff; + +#if 0 + if (ControllerState[i].Gamepad.sThumbLY < -28672) + ButtonsCurrent |= XINPUT_GAMEPAD_DPAD_UP; + if (ControllerState[i].Gamepad.sThumbLY > 28671) + ButtonsCurrent |= XINPUT_GAMEPAD_DPAD_DOWN; + if (ControllerState[i].Gamepad.sThumbLX < -28672) + ButtonsCurrent |= XINPUT_GAMEPAD_DPAD_LEFT; + if (ControllerState[i].Gamepad.sThumbLX > 28671) + ButtonsCurrent |= XINPUT_GAMEPAD_DPAD_RIGHT; +#endif + + for (j = 0; j < 8; j++) + { + if (ControllerState[i].Gamepad.bAnalogButtons[j] > 0x7f) + ButtonsCurrent |= (1 << (j + 8)); + } + } + } + + g_ButtonsHeld = ButtonsCurrent & g_ButtonsLast; + g_ButtonsReleased = g_ButtonsLast & ~ButtonsCurrent; + g_ButtonsPressed = ButtonsCurrent & ~g_ButtonsLast; + g_ButtonsLast = ButtonsCurrent; +} + +VOID ParseInput() +{ + XInputGetStateAll(); + + g_Frame++; + + bob = (sin(g_Frame / 30.0f) * 0.5f); + weave = (cos(g_Frame / 30.0f) * 0.5f); + + if((g_Frame < (FINALFRAME - 60)) && ((g_ButtonsLast & BUTTONS_BACK) || (!ht))) { + g_Frame = (FINALFRAME - 60); + } + + if(g_Frame >= FINALFRAME) { + g_ExitNow = TRUE; + } +} + +VOID HivelyCallback() +{ + LPVOID audiobuffer; + DWORD audiobytes; + + if( FAILED( g_pDSBuffer->Lock( (nextaudiobuf * AUDIOFRAMESIZE), AUDIOFRAMESIZE, &audiobuffer, &audiobytes, NULL, NULL, 0 ) ) ) { + g_pDSBuffer->Stop(); + return; + } + + if(ht && ht->ht_SongEndReached && g_PlayOnce) { + ht = NULL; + } + + if(!ht) { + ZeroMemory( audiobuffer, AUDIOFRAMESIZE ); + } else { + hvl_DecodeFrame( ht, ((char*)audiobuffer), ((char*)audiobuffer)+2, 4 ); + } + nextaudiobuf = (nextaudiobuf+1)%AUDIOFRAMES; + + g_pDSBuffer->Unlock( audiobuffer, audiobytes, NULL, NULL ); +} + +//----------------------------------------------------------------------------- +// Name: main() +// Desc: Entry point to the program. +//----------------------------------------------------------------------------- +VOID __cdecl main() +{ + // Initialize Direct3D + if( FAILED( InitD3D() ) ) + return; + + Render(); + + colors[','] = 0x005; /* Blue background */ + colors['.'] = 0xfff; /* White stars */ + colors['\''] = 0x000; /* Black border */ + colors['@'] = 0xffd; /* Tan poptart */ + colors['$'] = 0xd8a; /* Pink poptart */ + colors['-'] = 0xd08; /* Red poptart */ + colors['>'] = 0xf00; /* Red rainbow */ + colors['&'] = 0xfa0; /* Orange rainbow */ + colors['+'] = 0xff0; /* Yellow Rainbow */ + colors['#'] = 0x8f0; /* Green rainbow */ + colors['='] = 0x08f; /* Light blue rainbow */ + colors[';'] = 0x00d; /* Dark blue rainbow */ + colors['*'] = 0x555; /* Gray cat face */ + colors['%'] = 0xd8a; /* Pink cheeks */ + + XDEVICE_PREALLOC_TYPE deviceTypes[] = + { + {XDEVICE_TYPE_GAMEPAD, 4}, + }; + + XInitDevices( sizeof(deviceTypes) / sizeof(XDEVICE_PREALLOC_TYPE), deviceTypes ); + + Sleep(2000); + + g_Controller[0] = XInputOpen( XDEVICE_TYPE_GAMEPAD, XDEVICE_PORT0, XDEVICE_NO_SLOT, 0); + g_Controller[1] = XInputOpen( XDEVICE_TYPE_GAMEPAD, XDEVICE_PORT1, XDEVICE_NO_SLOT, 0); + g_Controller[2] = XInputOpen( XDEVICE_TYPE_GAMEPAD, XDEVICE_PORT2, XDEVICE_NO_SLOT, 0); + g_Controller[3] = XInputOpen( XDEVICE_TYPE_GAMEPAD, XDEVICE_PORT3, XDEVICE_NO_SLOT, 0); + + if( FAILED( DirectSoundCreate( NULL, &g_pDSound, NULL ) ) ) { + g_SoundEnabled = FALSE; + } else { + g_SoundEnabled = TRUE; + + DSEFFECTIMAGELOC EffectLoc; + EffectLoc.dwI3DL2ReverbIndex = GraphI3DL2_I3DL2Reverb; + EffectLoc.dwCrosstalkIndex = GraphXTalk_XTalk; + g_pDSound->DownloadEffectsImage( dsstdfx_bin, sizeof(dsstdfx_bin), &EffectLoc, NULL ); + + XAudioCreatePcmFormat( 2, 44100, 16, &g_wfx ); + + ZeroMemory( &g_dsbd, sizeof(DSBUFFERDESC) ); + g_dsbd.dwSize = sizeof(DSBUFFERDESC); + g_dsbd.dwBufferBytes = AUDIOBUFFERSIZE; + g_dsbd.lpwfxFormat = &g_wfx; + + if( FAILED( g_pDSound->CreateSoundBuffer( &g_dsbd, &g_pDSBuffer, NULL ) ) ) { + g_SoundEnabled = FALSE; + } else { + hFillAudioBufferEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); + + hvl_InitReplayer(); + ht = hvl_LoadTune( nyansong, sizeof(nyansong), 44100, 0 ); + if(!ht) + g_SoundEnabled = FALSE; + else { + int i; + for( i = 0; i < AUDIOFRAMES; i++) { + g_dspn[i].dwOffset = i * AUDIOFRAMESIZE; + g_dspn[i].hEventNotify = hFillAudioBufferEvent; + } + for( i = 0; i < AUDIOFRAMES/4; i++) { + HivelyCallback(); + } + g_pDSBuffer->SetNotificationPositions( AUDIOFRAMES, g_dspn ); + } + } + } + + // Enter render loop + while(!g_ExitNow) + { + while(g_SoundEnabled && (WaitForSingleObject( hFillAudioBufferEvent, 0 ) == WAIT_OBJECT_0)) { + HivelyCallback(); + } + if(g_SoundEnabled) { + if(g_Frame == 51) + g_pDSBuffer->Play(0, 0, DSBPLAY_LOOPING); + if((g_Frame > 50) && (g_Frame < 75)) + g_pDSBuffer->SetVolume( DSBVOLUME_MIN + (((DSBVOLUME_MAX - DSBVOLUME_MIN) / 26) * (g_Frame-50)) ); + if(g_Frame > (FINALFRAME - 25)) + g_pDSBuffer->SetVolume( DSBVOLUME_MAX - (((DSBVOLUME_MAX - DSBVOLUME_MIN) / 26) * (FINALFRAME - g_Frame)) ); + } + + ParseInput(); + Render(); + } + + g_pd3dDevice->PersistDisplay(); + + HalReturnToFirmware(2); +} diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/nyancat.hvl b/Cerbios Bios/BootAnims/Nyan Cat/source/nyancat.hvl new file mode 100644 index 0000000..23dd182 Binary files /dev/null and b/Cerbios Bios/BootAnims/Nyan Cat/source/nyancat.hvl differ diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/nyansong.h b/Cerbios Bios/BootAnims/Nyan Cat/source/nyansong.h new file mode 100644 index 0000000..e16c0c0 --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/nyansong.h @@ -0,0 +1,61 @@ +uint8 nyansong[] = { +0x48, 0x56, 0x4c, 0x00, 0x03, 0x7e, 0xa0, 0x06, 0x00, 0x00, 0x40, 0x05, 0x01, 0x00, 0xc8, 0x04, +0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x3f, 0x3f, 0x24, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1c, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x24, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x28, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x23, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x24, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x3f, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1c, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x24, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x23, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x24, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x29, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x28, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x29, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x21, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1b, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x1b, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x10, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x11, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x11, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x17, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1a, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +0x3f, 0x3f, 0x3f, 0x3f, 0x1e, 0x01, 0x01, 0x3b, 0x08, 0x2a, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, +0x01, 0x04, 0x01, 0x0f, 0x10, 0x3f, 0x01, 0x01, 0x01, 0x04, 0x03, 0x01, 0x01, 0x18, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x01, 0x6e, 0x79, +0x61, 0x6e, 0x63, 0x61, 0x74, 0x00, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x79, +0x6f, 0x75, 0x20, 0x61, 0x72, 0x65, 0x2e, 0x2e, 0x00 +}; +#define NYANSONG_SIZE sizeof(nyansong) diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/resource.h b/Cerbios Bios/BootAnims/Nyan Cat/source/resource.h new file mode 100644 index 0000000..d612a20 --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/resource.h @@ -0,0 +1,5 @@ +// Automatically generated by the bundler tool from c:\Program Files\Microsoft Xbox SDK\Samples\Xbox\Attach\resource.rdf + +#define resource_NUM_RESOURCES 1UL + +#define resource_JustTurnItOn_OFFSET 32UL diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/utility.h b/Cerbios Bios/BootAnims/Nyan Cat/source/utility.h new file mode 100644 index 0000000..8259c80 --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/utility.h @@ -0,0 +1,26 @@ +#define BUTTONS_DPAD_UP (1<<0) +#define BUTTONS_DPAD_DOWN (1<<1) +#define BUTTONS_DPAD_LEFT (1<<2) +#define BUTTONS_DPAD_RIGHT (1<<3) +#define BUTTONS_START (1<<4) +#define BUTTONS_BACK (1<<5) +#define BUTTONS_LEFT_THUMB (1<<6) +#define BUTTONS_RIGHT_THUMB (1<<7) +#define BUTTONS_A (1<<8) +#define BUTTONS_B (1<<9) +#define BUTTONS_X (1<<10) +#define BUTTONS_Y (1<<11) +#define BUTTONS_BLACK (1<<12) +#define BUTTONS_WHITE (1<<13) +#define BUTTONS_LEFT_TRIGGER (1<<14) +#define BUTTONS_RIGHT_TRIGGER (1<<15) + +extern BOOL g_ExitNow; + +extern VOID XBUtil_DebugPrint( const CHAR* buf, ... ); +extern VOID mappath(char * Device, char * Alias); + +extern VOID bg_decompress(D3DTexture **TextureOutput); + +extern VOID statusline_refresh(const CHAR* Text); + diff --git a/Cerbios Bios/BootAnims/Nyan Cat/source/winioctl.h b/Cerbios Bios/BootAnims/Nyan Cat/source/winioctl.h new file mode 100644 index 0000000..cef232d --- /dev/null +++ b/Cerbios Bios/BootAnims/Nyan Cat/source/winioctl.h @@ -0,0 +1,1154 @@ +/*++ BUILD Version: 0011 // Increment this if a change has global effects + +Copyright (c) 1990-2001 Microsoft Corporation + +Module Name: + + winioctl.h + +Abstract: + + This module defines the 32-Bit Windows Device I/O control codes. + +Revision History: + +--*/ + + +// +// Interface GUIDs +// +// need these GUIDs outside conditional includes so that user can +// #include in precompiled header +// #include in a single source file +// #include in that source file a second time to instantiate the GUIDs +// +#ifdef DEFINE_GUID +// +// Make sure FAR is defined... +// +#ifndef FAR +#ifdef _WIN32 +#define FAR +#else +#define FAR _far +#endif +#endif + +DEFINE_GUID(DiskClassGuid, 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(CdRomClassGuid, 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(PartitionClassGuid, 0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(TapeClassGuid, 0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(WriteOnceDiskClassGuid, 0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(VolumeClassGuid, 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(MediumChangerClassGuid, 0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(FloppyClassGuid, 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(CdChangerClassGuid, 0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(StoragePortClassGuid, 0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +#endif // DEFINE_GUID + +#ifndef _WINIOCTL_ +#define _WINIOCTL_ + + +#ifndef _DEVIOCTL_ +#define _DEVIOCTL_ + +// begin_ntddk begin_wdm begin_nthal begin_ntifs +// +// Define the various device type values. Note that values used by Microsoft +// Corporation are in the range 0-32767, and 32768-65535 are reserved for use +// by customers. +// + +#define DEVICE_TYPE DWORD + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_MEMORY_UNIT 0x0000003a +#define FILE_DEVICE_MEDIA_BOARD 0x0000003b + +// +// Macro definition for defining IOCTL and FSCTL function control codes. Note +// that function codes 0-2047 are reserved for Microsoft Corporation, and +// 2048-4095 are reserved for customers. +// + +#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ +) + +// +// Macro to extract device type out of the device io control code +// +#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((DWORD)(ctrlCode & 0xffff0000)) >> 16) + +// +// Define the method codes for how buffers are passed for I/O and FS controls +// + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 + +// +// Define the access check value for any access +// +// +// The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in +// ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these +// constants *MUST* always be in sync. +// +// +// FILE_SPECIAL_ACCESS is checked by the NT I/O system the same as FILE_ANY_ACCESS. +// The file systems, however, may add additional access checks for I/O and FS controls +// that use this value. +// + + +#define FILE_ANY_ACCESS 0 +#define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) +#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe +#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe + +// end_ntddk end_wdm end_nthal end_ntifs + +#endif // _DEVIOCTL_ + + +#ifndef _NTDDSTOR_H_ +#define _NTDDSTOR_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// +// IoControlCode values for storage devices +// + +#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE + +// +// The following device control codes are common for all class drivers. They +// should be used in place of the older IOCTL_DISK, IOCTL_CDROM and IOCTL_TAPE +// common codes +// + +#define IOCTL_STORAGE_CHECK_VERIFY CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_LOAD_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_LOAD_MEDIA2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_RESERVE CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_RELEASE CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_FIND_NEW_DEVICES CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_EJECTION_CONTROL CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_MCN_CONTROL CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_GET_MEDIA_TYPES CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_GET_DEVICE_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_PREDICT_FAILURE CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +// +// These ioctl codes are obsolete. They are defined here to avoid resuing them +// and to allow class drivers to respond to them more easily. +// + +#define OBSOLETE_IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +// +// IOCTL_STORAGE_GET_DEVICE_NUMBER +// +// input - none +// +// output - STORAGE_DEVICE_NUMBER structure +// The values in the STORAGE_DEVICE_NUMBER structure are guaranteed +// to remain unchanged until the system is rebooted. They are not +// guaranteed to be persistant across boots. +// + +typedef struct _STORAGE_DEVICE_NUMBER { + + // + // The FILE_DEVICE_XXX type for this device. + // + + DEVICE_TYPE DeviceType; + + // + // The number of this device + // + + DWORD DeviceNumber; + + // + // If the device is partitionable, the partition number of the device. + // Otherwise -1 + // + + DWORD PartitionNumber; +} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER; + +// +// Define the structures for scsi resets +// + +typedef struct _STORAGE_BUS_RESET_REQUEST { + BYTE PathId; +} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST; + +// +// IOCTL_STORAGE_MEDIA_REMOVAL disables the mechanism +// on a storage device that ejects media. This function +// may or may not be supported on storage devices that +// support removable media. +// +// TRUE means prevent media from being removed. +// FALSE means allow media removal. +// + +typedef struct _PREVENT_MEDIA_REMOVAL { + BOOLEAN PreventMediaRemoval; +} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL; + +// begin_ntminitape + + +typedef struct _TAPE_STATISTICS { + DWORD Version; + DWORD Flags; + LARGE_INTEGER RecoveredWrites; + LARGE_INTEGER UnrecoveredWrites; + LARGE_INTEGER RecoveredReads; + LARGE_INTEGER UnrecoveredReads; + BYTE CompressionRatioReads; + BYTE CompressionRatioWrites; +} TAPE_STATISTICS, *PTAPE_STATISTICS; + +#define RECOVERED_WRITES_VALID 0x00000001 +#define UNRECOVERED_WRITES_VALID 0x00000002 +#define RECOVERED_READS_VALID 0x00000004 +#define UNRECOVERED_READS_VALID 0x00000008 +#define WRITE_COMPRESSION_INFO_VALID 0x00000010 +#define READ_COMPRESSION_INFO_VALID 0x00000020 + +typedef struct _TAPE_GET_STATISTICS { + DWORD Operation; +} TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS; + +#define TAPE_RETURN_STATISTICS 0L +#define TAPE_RETURN_ENV_INFO 1L +#define TAPE_RESET_STATISTICS 2L + +// +// IOCTL_STORAGE_GET_MEDIA_TYPES_EX will return an array of DEVICE_MEDIA_INFO +// structures, one per supported type, embedded in the GET_MEDIA_TYPES struct. +// + +typedef enum _STORAGE_MEDIA_TYPE { + // + // Following are defined in ntdddisk.h in the MEDIA_TYPE enum + // + // Unknown, // Format is unknown + // F5_1Pt2_512, // 5.25", 1.2MB, 512 bytes/sector + // F3_1Pt44_512, // 3.5", 1.44MB, 512 bytes/sector + // F3_2Pt88_512, // 3.5", 2.88MB, 512 bytes/sector + // F3_20Pt8_512, // 3.5", 20.8MB, 512 bytes/sector + // F3_720_512, // 3.5", 720KB, 512 bytes/sector + // F5_360_512, // 5.25", 360KB, 512 bytes/sector + // F5_320_512, // 5.25", 320KB, 512 bytes/sector + // F5_320_1024, // 5.25", 320KB, 1024 bytes/sector + // F5_180_512, // 5.25", 180KB, 512 bytes/sector + // F5_160_512, // 5.25", 160KB, 512 bytes/sector + // RemovableMedia, // Removable media other than floppy + // FixedMedia, // Fixed hard disk media + // F3_120M_512, // 3.5", 120M Floppy + // F3_640_512, // 3.5" , 640KB, 512 bytes/sector + // F5_640_512, // 5.25", 640KB, 512 bytes/sector + // F5_720_512, // 5.25", 720KB, 512 bytes/sector + // F3_1Pt2_512, // 3.5" , 1.2Mb, 512 bytes/sector + // F3_1Pt23_1024, // 3.5" , 1.23Mb, 1024 bytes/sector + // F5_1Pt23_1024, // 5.25", 1.23MB, 1024 bytes/sector + // F3_128Mb_512, // 3.5" MO 128Mb 512 bytes/sector + // F3_230Mb_512, // 3.5" MO 230Mb 512 bytes/sector + // F8_256_128, // 8", 256KB, 128 bytes/sector + // + + DDS_4mm = 0x20, // Tape - DAT DDS1,2,... (all vendors) + MiniQic, // Tape - miniQIC Tape + Travan, // Tape - Travan TR-1,2,3,... + QIC, // Tape - QIC + MP_8mm, // Tape - 8mm Exabyte Metal Particle + AME_8mm, // Tape - 8mm Exabyte Advanced Metal Evap + AIT1_8mm, // Tape - 8mm Sony AIT1 + DLT, // Tape - DLT Compact IIIxt, IV + NCTP, // Tape - Philips NCTP + IBM_3480, // Tape - IBM 3480 + IBM_3490E, // Tape - IBM 3490E + IBM_Magstar_3590, // Tape - IBM Magstar 3590 + IBM_Magstar_MP, // Tape - IBM Magstar MP + STK_DATA_D3, // Tape - STK Data D3 + SONY_DTF, // Tape - Sony DTF + DV_6mm, // Tape - 6mm Digital Video + DMI, // Tape - Exabyte DMI and compatibles + SONY_D2, // Tape - Sony D2S and D2L + CLEANER_CARTRIDGE, // Cleaner - All Drive types that support Drive Cleaners + CD_ROM, // Opt_Disk - CD + CD_R, // Opt_Disk - CD-Recordable (Write Once) + CD_RW, // Opt_Disk - CD-Rewriteable + DVD_ROM, // Opt_Disk - DVD-ROM + DVD_R, // Opt_Disk - DVD-Recordable (Write Once) + DVD_RW, // Opt_Disk - DVD-Rewriteable + MO_3_RW, // Opt_Disk - 3.5" Rewriteable MO Disk + MO_5_WO, // Opt_Disk - MO 5.25" Write Once + MO_5_RW, // Opt_Disk - MO 5.25" Rewriteable (not LIMDOW) + MO_5_LIMDOW, // Opt_Disk - MO 5.25" Rewriteable (LIMDOW) + PC_5_WO, // Opt_Disk - Phase Change 5.25" Write Once Optical + PC_5_RW, // Opt_Disk - Phase Change 5.25" Rewriteable + PD_5_RW, // Opt_Disk - PhaseChange Dual Rewriteable + ABL_5_WO, // Opt_Disk - Ablative 5.25" Write Once Optical + PINNACLE_APEX_5_RW, // Opt_Disk - Pinnacle Apex 4.6GB Rewriteable Optical + SONY_12_WO, // Opt_Disk - Sony 12" Write Once + PHILIPS_12_WO, // Opt_Disk - Philips/LMS 12" Write Once + HITACHI_12_WO, // Opt_Disk - Hitachi 12" Write Once + CYGNET_12_WO, // Opt_Disk - Cygnet/ATG 12" Write Once + KODAK_14_WO, // Opt_Disk - Kodak 14" Write Once + MO_NFR_525, // Opt_Disk - Near Field Recording (Terastor) + NIKON_12_RW, // Opt_Disk - Nikon 12" Rewriteable + IOMEGA_ZIP, // Mag_Disk - Iomega Zip + IOMEGA_JAZ, // Mag_Disk - Iomega Jaz + SYQUEST_EZ135, // Mag_Disk - Syquest EZ135 + SYQUEST_EZFLYER, // Mag_Disk - Syquest EzFlyer + SYQUEST_SYJET, // Mag_Disk - Syquest SyJet + AVATAR_F2, // Mag_Disk - 2.5" Floppy + MP2_8mm, // Tape - 8mm Hitachi + DST_S, // Ampex DST Small Tapes + DST_M, // Ampex DST Medium Tapes + DST_L, // Ampex DST Large Tapes + VXATape_1, // Ecrix 8mm Tape + VXATape_2, // Ecrix 8mm Tape + STK_EAGLE, // STK Eagle + LTO_Ultrium, // IBM, HP, Seagate LTO Ultrium + LTO_Accelis // IBM, HP, Seagate LTO Accelis +} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE; + +#define MEDIA_ERASEABLE 0x00000001 +#define MEDIA_WRITE_ONCE 0x00000002 +#define MEDIA_READ_ONLY 0x00000004 +#define MEDIA_READ_WRITE 0x00000008 + +#define MEDIA_WRITE_PROTECTED 0x00000100 +#define MEDIA_CURRENTLY_MOUNTED 0x80000000 + +// +// Define the different storage bus types +// Bus types below 128 (0x80) are reserved for Microsoft use +// + +typedef enum _STORAGE_BUS_TYPE { + BusTypeUnknown = 0x00, + BusTypeScsi, + BusTypeAtapi, + BusTypeAta, + BusType1394, + BusTypeSsa, + BusTypeFibre, + BusTypeUsb, + BusTypeRAID, + BusTypeMaxReserved = 0x7F +} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE; + +typedef struct _DEVICE_MEDIA_INFO { + union { + struct { + LARGE_INTEGER Cylinders; + STORAGE_MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; + DWORD NumberMediaSides; + DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values. + } DiskInfo; + + struct { + LARGE_INTEGER Cylinders; + STORAGE_MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; + DWORD NumberMediaSides; + DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values. + } RemovableDiskInfo; + + struct { + STORAGE_MEDIA_TYPE MediaType; + DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values. + DWORD CurrentBlockSize; + STORAGE_BUS_TYPE BusType; + + // + // Bus specific information describing the medium supported. + // + + union { + struct { + BYTE MediumType; + BYTE DensityCode; + } ScsiInformation; + } BusSpecificData; + + } TapeInfo; + } DeviceSpecific; +} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO; + +typedef struct _GET_MEDIA_TYPES { + DWORD DeviceType; // FILE_DEVICE_XXX values + DWORD MediaInfoCount; + DEVICE_MEDIA_INFO MediaInfo[1]; +} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES; + + +// +// IOCTL_STORAGE_PREDICT_FAILURE +// +// input - none +// +// output - STORAGE_PREDICT_FAILURE structure +// PredictFailure returns zero if no failure predicted and non zero +// if a failure is predicted. +// +// VendorSpecific returns 512 bytes of vendor specific information +// if a failure is predicted +// +typedef struct _STORAGE_PREDICT_FAILURE +{ + DWORD PredictFailure; + BYTE VendorSpecific[512]; +} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE; + +// end_ntminitape + +#ifdef __cplusplus +} +#endif + +#endif // _NTDDSTOR_H_ + +// +// IoControlCode values for disk devices. +// + +#define IOCTL_DISK_BASE FILE_DEVICE_DISK +#define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE, 0x000d, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +#if(_WIN32_WINNT >= 0x0400) +#define IOCTL_DISK_CONTROLLER_NUMBER CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// +// IOCTL support for SMART drive fault prediction. +// + +#define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS) +#define SMART_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + + +#endif /* _WIN32_WINNT >= 0x0400 */ + +#if(_WIN32_WINNT >= 0x0500) +#define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +// +// Special IOCTLs needed to support PC-98 machines in Japan +// + +#define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE, 0x00f3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE, 0x00f8, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#endif /* _WIN32_WINNT >= 0x0500 */ + +// +// The following device control codes are common for all class drivers. The +// functions codes defined here must match all of the other class drivers. +// +// Warning: these codes will be replaced in the future by equivalent +// IOCTL_STORAGE codes +// + +#define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// +// Define the partition types returnable by known disk drivers. +// + +#define PARTITION_ENTRY_UNUSED 0x00 // Entry unused +#define PARTITION_FAT_12 0x01 // 12-bit FAT entries +#define PARTITION_XENIX_1 0x02 // Xenix +#define PARTITION_XENIX_2 0x03 // Xenix +#define PARTITION_FAT_16 0x04 // 16-bit FAT entries +#define PARTITION_EXTENDED 0x05 // Extended partition entry +#define PARTITION_HUGE 0x06 // Huge partition MS-DOS V4 +#define PARTITION_IFS 0x07 // IFS Partition +#define PARTITION_FAT32 0x0B // FAT32 +#define PARTITION_FAT32_XINT13 0x0C // FAT32 using extended int13 services +#define PARTITION_XINT13 0x0E // Win95 partition using extended int13 services +#define PARTITION_XINT13_EXTENDED 0x0F // Same as type 5 but uses extended int13 services +#define PARTITION_PREP 0x41 // PowerPC Reference Platform (PReP) Boot Partition +#define PARTITION_LDM 0x42 // Logical Disk Manager partition +#define PARTITION_UNIX 0x63 // Unix + +#define VALID_NTFT 0xC0 // NTFT uses high order bits + +// +// The high bit of the partition type code indicates that a partition +// is part of an NTFT mirror or striped array. +// + +#define PARTITION_NTFT 0x80 // NTFT partition + +// +// The following macro is used to determine which partitions should be +// assigned drive letters. +// + +//++ +// +// BOOLEAN +// IsRecognizedPartition( +// IN DWORD PartitionType +// ) +// +// Routine Description: +// +// This macro is used to determine to which partitions drive letters +// should be assigned. +// +// Arguments: +// +// PartitionType - Supplies the type of the partition being examined. +// +// Return Value: +// +// The return value is TRUE if the partition type is recognized, +// otherwise FALSE is returned. +// +//-- + +#define IsRecognizedPartition( PartitionType ) ( \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT_12)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT_16)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_IFS)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_HUGE)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT32)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT32_XINT13)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_XINT13)) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_FAT_12) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_FAT_16) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_IFS) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_HUGE) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_FAT32) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_FAT32_XINT13) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_XINT13) ) + +//++ +// +// BOOLEAN +// IsContainerPartition( +// IN DWORD PartitionType +// ) +// +// Routine Description: +// +// This macro is used to determine to which partition types are actually +// containers for other partitions (ie, extended partitions). +// +// Arguments: +// +// PartitionType - Supplies the type of the partition being examined. +// +// Return Value: +// +// The return value is TRUE if the partition type is a container, +// otherwise FALSE is returned. +// +//-- + +#define IsContainerPartition( PartitionType ) \ + ((PartitionType == PARTITION_EXTENDED) || (PartitionType == PARTITION_XINT13_EXTENDED)) + +// +// Define the media types supported by the driver. +// + +typedef enum _MEDIA_TYPE { + Unknown, // Format is unknown + F5_1Pt2_512, // 5.25", 1.2MB, 512 bytes/sector + F3_1Pt44_512, // 3.5", 1.44MB, 512 bytes/sector + F3_2Pt88_512, // 3.5", 2.88MB, 512 bytes/sector + F3_20Pt8_512, // 3.5", 20.8MB, 512 bytes/sector + F3_720_512, // 3.5", 720KB, 512 bytes/sector + F5_360_512, // 5.25", 360KB, 512 bytes/sector + F5_320_512, // 5.25", 320KB, 512 bytes/sector + F5_320_1024, // 5.25", 320KB, 1024 bytes/sector + F5_180_512, // 5.25", 180KB, 512 bytes/sector + F5_160_512, // 5.25", 160KB, 512 bytes/sector + RemovableMedia, // Removable media other than floppy + FixedMedia, // Fixed hard disk media + F3_120M_512, // 3.5", 120M Floppy + F3_640_512, // 3.5" , 640KB, 512 bytes/sector + F5_640_512, // 5.25", 640KB, 512 bytes/sector + F5_720_512, // 5.25", 720KB, 512 bytes/sector + F3_1Pt2_512, // 3.5" , 1.2Mb, 512 bytes/sector + F3_1Pt23_1024, // 3.5" , 1.23Mb, 1024 bytes/sector + F5_1Pt23_1024, // 5.25", 1.23MB, 1024 bytes/sector + F3_128Mb_512, // 3.5" MO 128Mb 512 bytes/sector + F3_230Mb_512, // 3.5" MO 230Mb 512 bytes/sector + F8_256_128 // 8", 256KB, 128 bytes/sector +} MEDIA_TYPE, *PMEDIA_TYPE; + +// +// Define the input buffer structure for the driver, when +// it is called with IOCTL_DISK_FORMAT_TRACKS. +// + +typedef struct _FORMAT_PARAMETERS { + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; +} FORMAT_PARAMETERS, *PFORMAT_PARAMETERS; + +// +// Define the BAD_TRACK_NUMBER type. An array of elements of this type is +// returned by the driver on IOCTL_DISK_FORMAT_TRACKS requests, to indicate +// what tracks were bad during formatting. The length of that array is +// reported in the `Information' field of the I/O Status Block. +// + +typedef WORD BAD_TRACK_NUMBER; +typedef WORD *PBAD_TRACK_NUMBER; + +// +// Define the input buffer structure for the driver, when +// it is called with IOCTL_DISK_FORMAT_TRACKS_EX. +// + +typedef struct _FORMAT_EX_PARAMETERS { + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; + WORD FormatGapLength; + WORD SectorsPerTrack; + WORD SectorNumber[1]; +} FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS; + +// +// The following structure is returned on an IOCTL_DISK_GET_DRIVE_GEOMETRY +// request and an array of them is returned on an IOCTL_DISK_GET_MEDIA_TYPES +// request. +// + +typedef struct _DISK_GEOMETRY { + LARGE_INTEGER Cylinders; + MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; +} DISK_GEOMETRY, *PDISK_GEOMETRY; + + +// +// This wmi guid returns a DISK_GEOMETRY structure +// +#define WMI_DISK_GEOMETRY_GUID { 0x25007f51, 0x57c2, 0x11d1, { 0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10 } } + + + +// +// The following structure is returned on an IOCTL_DISK_GET_PARTITION_INFO +// and an IOCTL_DISK_GET_DRIVE_LAYOUT request. It is also used in a request +// to change the drive layout, IOCTL_DISK_SET_DRIVE_LAYOUT. +// + +typedef struct _PARTITION_INFORMATION { + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + DWORD HiddenSectors; + DWORD PartitionNumber; + BYTE PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + BOOLEAN RewritePartition; +} PARTITION_INFORMATION, *PPARTITION_INFORMATION; + +// +// The following structure is used to change the partition type of a +// specified disk partition using an IOCTL_DISK_SET_PARTITION_INFO +// request. +// + +typedef struct _SET_PARTITION_INFORMATION { + BYTE PartitionType; +} SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION; + +// +// The following structures is returned on an IOCTL_DISK_GET_DRIVE_LAYOUT +// request and given as input to an IOCTL_DISK_SET_DRIVE_LAYOUT request. +// + +typedef struct _DRIVE_LAYOUT_INFORMATION { + DWORD PartitionCount; + DWORD Signature; + PARTITION_INFORMATION PartitionEntry[1]; +} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION; + +// +// The following structure is passed in on an IOCTL_DISK_VERIFY request. +// The offset and length parameters are both given in bytes. +// + +typedef struct _VERIFY_INFORMATION { + LARGE_INTEGER StartingOffset; + DWORD Length; +} VERIFY_INFORMATION, *PVERIFY_INFORMATION; + +// +// The following structure is passed in on an IOCTL_DISK_REASSIGN_BLOCKS +// request. +// + +typedef struct _REASSIGN_BLOCKS { + WORD Reserved; + WORD Count; + DWORD BlockNumber[1]; +} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS; + +#if(_WIN32_WINNT >= 0x0400) +// +// IOCTL_DISK_CONTROLLER_NUMBER returns the controller and disk +// number for the handle. This is used to determine if a disk +// is attached to the primary or secondary IDE controller. +// + +typedef struct _DISK_CONTROLLER_NUMBER { + DWORD ControllerNumber; + DWORD DiskNumber; +} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER; +#endif /* _WIN32_WINNT >= 0x0400 */ + +#if(_WIN32_WINNT >= 0x0500) + + +// +// IOCTL_DISK_SET_CACHE allows the caller to get or set the state of the disk +// read/write caches. +// +// If the structure is provided as the input buffer for the ioctl the read & +// write caches will be enabled or disabled depending on the parameters +// provided. +// +// If the structure is provided as an output buffer for the ioctl the state +// of the read & write caches will be returned. If both input and outut buffers +// are provided the output buffer will contain the cache state BEFORE any +// changes are made +// + +typedef enum { + EqualPriority, + KeepPrefetchedData, + KeepReadData +} DISK_CACHE_RETENTION_PRIORITY; + + +typedef struct _DISK_CACHE_INFORMATION { + + // + // on return indicates that the device is capable of saving any parameters + // in non-volatile storage. On send indicates that the device should + // save the state in non-volatile storage. + // + + BOOLEAN ParametersSavable; + + // + // Indicates whether the write and read caches are enabled. + // + + BOOLEAN ReadCacheEnabled; + BOOLEAN WriteCacheEnabled; + + // + // Controls the likelyhood of data remaining in the cache depending on how + // it got there. Data cached from a READ or WRITE operation may be given + // higher, lower or equal priority to data entered into the cache for other + // means (like prefetch) + // + + DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; + DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; + + // + // Requests for a larger number of blocks than this may have prefetching + // disabled. If this value is set to 0 prefetch will be disabled. + // + + WORD DisablePrefetchTransferLength; + + // + // If TRUE then ScalarPrefetch (below) will be valid. If FALSE then + // the minimum and maximum values should be treated as a block count + // (BlockPrefetch) + // + + BOOLEAN PrefetchScalar; + + // + // Contains the minimum and maximum amount of data which will be + // will be prefetched into the cache on a disk operation. This value + // may either be a scalar multiplier of the transfer length of the request, + // or an abolute number of disk blocks. PrefetchScalar (above) indicates + // which interpretation is used. + // + + union { + struct { + WORD Minimum; + WORD Maximum; + + // + // The maximum number of blocks which will be prefetched - useful + // with the scalar limits to set definite upper limits. + // + + WORD MaximumBlocks; + } ScalarPrefetch; + + struct { + WORD Minimum; + WORD Maximum; + } BlockPrefetch; + }; + +} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION; + +// +// IOCTL_DISK_GROW_PARTITION will update the size of a partition +// by adding sectors to the length. The number of sectors must be +// predetermined by examining PARTITION_INFORMATION. +// + +typedef struct _DISK_GROW_PARTITION { + DWORD PartitionNumber; + LARGE_INTEGER BytesToGrow; +} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION; +#endif /* _WIN32_WINNT >= 0x0500 */ + +/////////////////////////////////////////////////////// +// // +// The following structures define disk performance // +// statistics: specifically the locations of all the // +// reads and writes which have occured on the disk. // +// // +// To use these structures, you must issue an IOCTL_ // +// DISK_HIST_STRUCTURE (with a DISK_HISTOGRAM) to // +// obtain the basic histogram information. The // +// number of buckets which must allocated is part of // +// this structure. Allocate the required number of // +// buckets and call an IOCTL_DISK_HIST_DATA to fill // +// in the data // +// // +/////////////////////////////////////////////////////// + +#define HIST_NO_OF_BUCKETS 24 + +typedef struct _HISTOGRAM_BUCKET { + DWORD Reads; + DWORD Writes; +} HISTOGRAM_BUCKET, *PHISTOGRAM_BUCKET; + +#define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET) + +typedef struct _DISK_HISTOGRAM { + LARGE_INTEGER DiskSize; + LARGE_INTEGER Start; + LARGE_INTEGER End; + LARGE_INTEGER Average; + LARGE_INTEGER AverageRead; + LARGE_INTEGER AverageWrite; + DWORD Granularity; + DWORD Size; + DWORD ReadCount; + DWORD WriteCount; + PHISTOGRAM_BUCKET Histogram; +} DISK_HISTOGRAM, *PDISK_HISTOGRAM; + +#define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM) + +/////////////////////////////////////////////////////// +// // +// The following structures define disk debugging // +// capabilities. The IOCTLs are directed to one of // +// the two disk filter drivers. // +// // +// DISKPERF is a utilty for collecting disk request // +// statistics. // +// // +// SIMBAD is a utility for injecting faults in // +// IO requests to disks. // +// // +/////////////////////////////////////////////////////// + +// +// The following structure is exchanged on an IOCTL_DISK_GET_PERFORMANCE +// request. This ioctl collects summary disk request statistics used +// in measuring performance. +// + +typedef struct _DISK_PERFORMANCE { + LARGE_INTEGER BytesRead; + LARGE_INTEGER BytesWritten; + LARGE_INTEGER ReadTime; + LARGE_INTEGER WriteTime; + LARGE_INTEGER IdleTime; + DWORD ReadCount; + DWORD WriteCount; + DWORD QueueDepth; + DWORD SplitCount; + LARGE_INTEGER QueryTime; + DWORD StorageDeviceNumber; + WCHAR StorageManagerName[8]; +} DISK_PERFORMANCE, *PDISK_PERFORMANCE; + +// +// This structure defines the disk logging record. When disk logging +// is enabled, one of these is written to an internal buffer for each +// disk request. +// + +typedef struct _DISK_RECORD { + LARGE_INTEGER ByteOffset; + LARGE_INTEGER StartTime; + LARGE_INTEGER EndTime; + PVOID VirtualAddress; + DWORD NumberOfBytes; + BYTE DeviceNumber; + BOOLEAN ReadRequest; +} DISK_RECORD, *PDISK_RECORD; + +// +// The following structure is exchanged on an IOCTL_DISK_LOG request. +// Not all fields are valid with each function type. +// + +typedef struct _DISK_LOGGING { + BYTE Function; + PVOID BufferAddress; + DWORD BufferSize; +} DISK_LOGGING, *PDISK_LOGGING; + +// +// Disk logging functions +// +// Start disk logging. Only the Function and BufferSize fields are valid. +// + +#define DISK_LOGGING_START 0 + +// +// Stop disk logging. Only the Function field is valid. +// + +#define DISK_LOGGING_STOP 1 + +// +// Return disk log. All fields are valid. Data will be copied from internal +// buffer to buffer specified for the number of bytes requested. +// + +#define DISK_LOGGING_DUMP 2 + +// +// DISK BINNING +// +// DISKPERF will keep counters for IO that falls in each of these ranges. +// The application determines the number and size of the ranges. +// Joe Lin wanted me to keep it flexible as possible, for instance, IO +// sizes are interesting in ranges like 0-4096, 4097-16384, 16385-65536, 65537+. +// + +#define DISK_BINNING 3 + +// +// Bin types +// + +typedef enum _BIN_TYPES { + RequestSize, + RequestLocation +} BIN_TYPES; + +// +// Bin ranges +// + +typedef struct _BIN_RANGE { + LARGE_INTEGER StartValue; + LARGE_INTEGER Length; +} BIN_RANGE, *PBIN_RANGE; + +// +// Bin definition +// + +typedef struct _PERF_BIN { + DWORD NumberOfBins; + DWORD TypeOfBin; + BIN_RANGE BinsRanges[1]; +} PERF_BIN, *PPERF_BIN ; + +// +// Bin count +// + +typedef struct _BIN_COUNT { + BIN_RANGE BinRange; + DWORD BinCount; +} BIN_COUNT, *PBIN_COUNT; + +// +// Bin results +// + +typedef struct _BIN_RESULTS { + DWORD NumberOfBins; + BIN_COUNT BinCounts[1]; +} BIN_RESULTS, *PBIN_RESULTS; + +#ifndef _FILESYSTEMFSCTL_ +#define _FILESYSTEMFSCTL_ + +// +// The following is a list of the native file system fsctls followed by +// additional network file system fsctls. Some values have been +// decommissioned. +// + +#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_READ_VOLUME_METADATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_BUFFERED, FILE_READ_ACCESS) +#define FSCTL_WRITE_VOLUME_METADATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +// +// Structure for FSCTL_READ_VOLUME_METADATA and FSCTL_WRITE_VOLUME_METADATA. +// + +typedef struct _FSCTL_VOLUME_METADATA { + DWORD ByteOffset; + DWORD TransferLength; + PVOID TransferBuffer; +} FSCTL_VOLUME_METADATA, *PFSCTL_VOLUME_METADATA; + +#endif // _FILESYSTEMFSCTL_ + + +#endif // _WINIOCTL_ + diff --git a/Cerbios Bios/BootAnims/XMV Player/BootAnim.xbe b/Cerbios Bios/BootAnims/XMV Player/BootAnim.xbe new file mode 100644 index 0000000..b68b2d3 Binary files /dev/null and b/Cerbios Bios/BootAnims/XMV Player/BootAnim.xbe differ diff --git a/Cerbios Bios/BootAnims/XMV Player/bootanim.xmv b/Cerbios Bios/BootAnims/XMV Player/bootanim.xmv new file mode 100644 index 0000000..ce3c80d Binary files /dev/null and b/Cerbios Bios/BootAnims/XMV Player/bootanim.xmv differ diff --git a/Cerbios Bios/BootAnims/Xbox/BootAnim.xbe b/Cerbios Bios/BootAnims/Xbox/BootAnim.xbe new file mode 100644 index 0000000..a529fea Binary files /dev/null and b/Cerbios Bios/BootAnims/Xbox/BootAnim.xbe differ diff --git a/Cerbios Bios/BootAnims/Xbox/bootanim.ini b/Cerbios Bios/BootAnims/Xbox/bootanim.ini new file mode 100644 index 0000000..aaa4ffe --- /dev/null +++ b/Cerbios Bios/BootAnims/Xbox/bootanim.ini @@ -0,0 +1,55 @@ +; Cerbios bootanim config + +; Camera Mode, 0 to 14, 0 = Random Camera Boot Animation +CameraMode = 0 + +; Plasma Options & Colour +PlasmaRender = true +Plasma1 = #0000FF +Plasma2 = #0000FF +Plasma3 = #0000FF + +; Shield Options & Colour +ShieldRender = true +ShieldWireframe = true +Shield = #FF00FF + +; Blob (Flubber) Options & Colour +BlobRender = true +BlobWireframe = true +BlobColor = #283FFF +BlobGlow = #A040FF + +; Background Scene Options & Colour +SceneRender = true +SceneWireframe = false +SceneIntensity = 2 +SceneAmbient = #3519FF +SceneDiffuse = #3519FF +SceneSpecular = #3519FF + +; X Splash Screen Colour +SlashBackgroundStart = #000000 +SlashBackgroundEnd = #FFFFFF +SlashLipGradientStart = #000100 +SlashLipGradientEnd = #7A7AFF +SlashInnerStage1Gradient1 = #FFFFFF +SlashInnerStage1Gradient2 = #FFFFFF +SlashInnerStage1Gradient3 = #7A7AFF +SlashInnerStage1Gradient4 = #7A7AFF +SlashInnerStage2Gradient1 = #7A7AFF +SlashInnerStage2Gradient2 = #7A7AFF +SlashInnerStage2Gradient3 = #CCCCFF +SlashInnerStage2Gradient4 = #0000D6 + +; TradeMark logo Options & Colour +TradeMarkRender = true +TradeMark = #7477FF + +; XBOX Text Options & Colour +XboxRender = true +Xbox = #7477FF + +; CERBIOS Brand Options & Colour +BrandRender = true +Brand = #7477FF \ No newline at end of file diff --git a/Cerbios Bios/Cerbios Hybrid V2.4.2 Beta.bin b/Cerbios Bios/Cerbios Hybrid V2.4.2 Beta.bin new file mode 100644 index 0000000..35b0d93 Binary files /dev/null and b/Cerbios Bios/Cerbios Hybrid V2.4.2 Beta.bin differ diff --git a/Cerbios Bios/Cerbios Tool.url b/Cerbios Bios/Cerbios Tool.url new file mode 100644 index 0000000..faaf85e --- /dev/null +++ b/Cerbios Bios/Cerbios Tool.url @@ -0,0 +1,5 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://github.com/Team-Resurgent/CerbiosTool diff --git a/Cerbios Bios/Discord.url b/Cerbios Bios/Discord.url new file mode 100644 index 0000000..3d94cde --- /dev/null +++ b/Cerbios Bios/Discord.url @@ -0,0 +1,6 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://discord.gg/VcdSfajQGK +HotKey=0 diff --git a/Cerbios Bios/ElpisHD/Media/Thumbs.db b/Cerbios Bios/ElpisHD/Media/Thumbs.db new file mode 100644 index 0000000..94edec9 Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/Thumbs.db differ diff --git a/Cerbios Bios/ElpisHD/Media/background.png b/Cerbios Bios/ElpisHD/Media/background.png new file mode 100644 index 0000000..98aff2c Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/background.png differ diff --git a/Cerbios Bios/ElpisHD/Media/button-active-hover.png b/Cerbios Bios/ElpisHD/Media/button-active-hover.png new file mode 100644 index 0000000..ff02905 Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/button-active-hover.png differ diff --git a/Cerbios Bios/ElpisHD/Media/button-active.png b/Cerbios Bios/ElpisHD/Media/button-active.png new file mode 100644 index 0000000..450cceb Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/button-active.png differ diff --git a/Cerbios Bios/ElpisHD/Media/button-b.png b/Cerbios Bios/ElpisHD/Media/button-b.png new file mode 100644 index 0000000..72f24e3 Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/button-b.png differ diff --git a/Cerbios Bios/ElpisHD/Media/button-inactive-hover.png b/Cerbios Bios/ElpisHD/Media/button-inactive-hover.png new file mode 100644 index 0000000..1b81b54 Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/button-inactive-hover.png differ diff --git a/Cerbios Bios/ElpisHD/Media/button-inactive.png b/Cerbios Bios/ElpisHD/Media/button-inactive.png new file mode 100644 index 0000000..0ed2b5d Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/button-inactive.png differ diff --git a/Cerbios Bios/ElpisHD/Media/dark-panel.png b/Cerbios Bios/ElpisHD/Media/dark-panel.png new file mode 100644 index 0000000..ad2a987 Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/dark-panel.png differ diff --git a/Cerbios Bios/ElpisHD/Media/font.sfn b/Cerbios Bios/ElpisHD/Media/font.sfn new file mode 100644 index 0000000..149bf3e Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/font.sfn differ diff --git a/Cerbios Bios/ElpisHD/Media/light-panel.png b/Cerbios Bios/ElpisHD/Media/light-panel.png new file mode 100644 index 0000000..2f5db45 Binary files /dev/null and b/Cerbios Bios/ElpisHD/Media/light-panel.png differ diff --git a/Cerbios Bios/ElpisHD/default.xbe b/Cerbios Bios/ElpisHD/default.xbe new file mode 100644 index 0000000..c670e34 Binary files /dev/null and b/Cerbios Bios/ElpisHD/default.xbe differ diff --git a/Cerbios Bios/Forums.url b/Cerbios Bios/Forums.url new file mode 100644 index 0000000..1365179 --- /dev/null +++ b/Cerbios Bios/Forums.url @@ -0,0 +1,6 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://xbox-scene.info/ +HotKey=0 diff --git a/Cerbios Bios/LithiumX-DualHDD/LithiumX-DualHDD.xbe b/Cerbios Bios/LithiumX-DualHDD/LithiumX-DualHDD.xbe new file mode 100644 index 0000000..05bcd83 Binary files /dev/null and b/Cerbios Bios/LithiumX-DualHDD/LithiumX-DualHDD.xbe differ diff --git a/Cerbios Bios/LithiumX-DualHDD/ReadMe.txt b/Cerbios Bios/LithiumX-DualHDD/ReadMe.txt new file mode 100644 index 0000000..7c14d5c --- /dev/null +++ b/Cerbios Bios/LithiumX-DualHDD/ReadMe.txt @@ -0,0 +1,11 @@ +Using LithiumX: +Attached is a custom version of LithiumX is currently the only dashboard that can read and launch games/apps from both drives. +Existing Setup: Delete the E:\udata\lithiumx folder before using it for the first time. +File Lock: LithiumX will lock E:\udata\lithiumx\lithiumx.db while in use, so you can't delete it while it's locked. +Launching XBEs: You can launch any XBE from the Start menu (Utilities > XBE Launcher). +View Partitions: The Start menu (Utilities > XBE Launcher) is also where you can see all partitions from both drives if detected. + +New to LithiumX? +LithiumX will scan for games/apps in configured folders (from both drives) and display them. Use the black/white buttons to switch pages. +Cache Management: Lith will cache the scan results for faster subsequent boots. Clear the cache from the Start menu (Utilities > Mark Database Reset at Reboot). +Config File: The folders to be scanned are stored in the config file E:\udata\lithiumx\lithiumx.toml. \ No newline at end of file diff --git a/Cerbios Bios/LithiumX-DualHDD/Source/LithiumX-DualHDD.diff b/Cerbios Bios/LithiumX-DualHDD/Source/LithiumX-DualHDD.diff new file mode 100644 index 0000000..acf4e3b --- /dev/null +++ b/Cerbios Bios/LithiumX-DualHDD/Source/LithiumX-DualHDD.diff @@ -0,0 +1,371 @@ +diff -ur ./src/dash_browser.c ../LithiumX-DualHDD/src/dash_browser.c +--- ./src/dash_browser.c 2024-06-28 13:55:18.732000000 -0400 ++++ ../LithiumX-DualHDD/src/dash_browser.c 2024-08-16 19:22:15.928000000 -0400 +@@ -179,6 +179,7 @@ + WIN32_FIND_DATA findData; + HANDLE hFind; + char searchPath[DASH_MAX_PATH]; ++ char tmp[10]; + int i = 0; + + *cnt = 0; +@@ -187,19 +188,23 @@ + //Xbox doesn't have a root drive that shows all partitions so we fake it + if (strcmp(path, DASH_ROOT_PATH) == 0) + { +- static const char root_drives[][3] = {"C:", "D:", "E:", "F:", "G:", "R:", "S:", +- "V:", "W:", "A:", "B:", "P:", "Q:", "X:", "Y:", "Z:", }; ++ static const char* root_drives[] = {"HDD0-C", "DVD-ROM", "HDD0-E", "HDD0-F", "HDD0-G", "HDD0-H", "HDD0-I", ++ "HDD0-J", "HDD0-K", "HDD0-L", "HDD0-M", "HDD0-N", "ROOT", "HDD0-X", "HDD0-Y", "HDD0-Z", ++ "HDD1-C", "HDD1-E", "HDD1-F", "HDD1-G", "HDD1-H", "HDD1-I", ++ "HDD1-J", "HDD1-K", "HDD1-L", "HDD1-M", "HDD1-N", "HDD1-X", "HDD1-Y", "HDD1-Z", }; + int _cnt = 0; + for (int i = 0; i < DASH_ARRAY_SIZE(root_drives); i++) + { +- if(!nxIsDriveMounted(root_drives[i][0])) ++ if(!nxIsDriveMounted((char*)root_drives[i])) + { + dash_printf(LEVEL_TRACE, "%s not mounted. Skipping\n", root_drives[i]); + continue; + } + if (list != NULL) + { +- list[_cnt].item = lv_strdup(root_drives[i]); ++ memset(tmp, 0, 10); ++ lv_snprintf(tmp, 10, "%s:", root_drives[i]); ++ list[_cnt].item = lv_strdup(tmp); + list[_cnt].is_dir = 1; + } + _cnt++; +diff -ur ./src/dash_main.c ../LithiumX-DualHDD/src/dash_main.c +--- ./src/dash_main.c 2024-06-28 13:55:18.732000000 -0400 ++++ ../LithiumX-DualHDD/src/dash_main.c 2024-08-01 04:12:48.396000000 -0400 +@@ -22,16 +22,16 @@ + "\n" + "[[pages]]\n" + "name = \"Games\"\n" +- "paths = [\"E:/Games\", \"F:/Games\", \"G:/Games\"]\n" ++ "paths = [\"HDD0-E:/Games\", \"HDD0-F:/Games\", \"HDD0-G:/Games\", \"HDD1-E:/Games\", \"HDD1-F:/Games\", \"HDD1-G:/Games\"]\n" + "\n" + "[[pages]]\n" + "name = \"Applications\"\n" +- "paths = [\"E:/Applications\", \"F:/Applications\", \"G:/Applications\",\n" +- " \"E:/Apps\", \"F:/Apps\", \"G:/Apps\"]\n" ++ "paths = [\"HDD0-E:/Applications\", \"HDD0-F:/Applications\", \"HDD0-G:/Applications\", \"HDD1-E:/Applications\", \"HDD1-F:/Applications\", \"HDD1-G:/Applications\", \n" ++ " \"HDD0-E:/Apps\", \"HDD0-F:/Apps\", \"HDD0-G:/Apps\", \"HDD1-E:/Apps\", \"HDD1-F:/Apps\", \"HDD1-G:/Apps\"]\n" + "\n" + "[[pages]]\n" + "name = \"Homebrew\"\n" +- "paths = [\"E:/Homebrew\", \"F:/Homebrew\", \"G:/Homebrew\"]\n" ++ "paths = [\"HDD0-E:/Homebrew\", \"HDD0-F:/Homebrew\", \"HDD0-G:/Homebrew\", \"HDD1-E:/Homebrew\", \"HDD1-F:/Homebrew\", \"HDD1-G:/Homebrew\"]\n" + "\0"; + + static bool check_path_toml(char *err_msg, int err_msg_len) +diff -ur ./src/libs/ftpd/ftp_file.c ../LithiumX-DualHDD/src/libs/ftpd/ftp_file.c +--- ./src/libs/ftpd/ftp_file.c 2024-06-28 13:55:18.732000000 -0400 ++++ ../LithiumX-DualHDD/src/libs/ftpd/ftp_file.c 2024-08-16 19:52:39.464000000 -0400 +@@ -23,7 +23,11 @@ + + #ifdef NXDK + #include +-static const char root_drives[][3] = {"/C", "/D", "/E", "/F", "/G", "/R", "/S", "/V", "/W", "/A", "/B", "/P", "/X", "/Y", "/Z"}; ++static const char root_drives[][8] = {"HDD0-C", "DVD-ROM", "HDD0-E", "HDD0-F", "HDD0-G", "HDD0-H", "HDD0-I", ++ "HDD0-J", "HDD0-K", "HDD0-L", "HDD0-M", "HDD0-N", "ROOT", "HDD0-X", "HDD0-Y", "HDD0-Z", ++ "HDD1-C", "HDD1-E", "HDD1-F", "HDD1-G", "HDD1-H", "HDD1-I", ++ "HDD1-J", "HDD1-K", "HDD1-L", "HDD1-M", "HDD1-N", "HDD1-X", "HDD1-Y", "HDD1-Z", }; ++ + static int root_index; + #define FILE_DBG DbgPrint + #else +@@ -39,19 +43,29 @@ + + // Replace "/" with "\" + char *sep = strchr(out, '/'); ++ char* start = 0; ++ char* end = 0; ++ int cnt = 0; ++ if(sep) start = sep; + while (sep) + { ++ if(cnt==1) end = sep; + *sep = '\\'; + sep = strchr(out, '/'); ++ cnt++; + } + ++ if(!end) end = start + strlen(out); ++ + #ifdef NXDK + // Replace \E\ with "E:\" etc. + if (out[0] == '\\' && out[1] != '\0') + { +- out[0] = out[1]; ++ memcpy(out, start+1, end-start-1); ++ *(end-1) = ':'; ++ /* out[0] = out[1]; + out[1] = ':'; +- out[2] = '\\'; ++ out[2] = '\\';*/ + } + #endif + return out; +@@ -63,7 +77,7 @@ + int cnt = sizeof(root_drives) / sizeof(root_drives[0]); + for (int i = 0; i < cnt; i++) + { +- if (strcmp(path, root_drives[i]) == 0) ++ if (strcmp(path+1, root_drives[i]) == 0) + { + return 1; + } +@@ -208,7 +222,6 @@ + { + WIN32_FIND_DATA findFileData; + FILE_DBG("Looking for files in %s\n", dp->path); +- + #ifdef FTP_CUSTOM_ROOT_PATH + if (strcmp(dp->path, "root") == 0) + { +@@ -217,11 +230,11 @@ + + for(; root_index < (sizeof(root_drives) / sizeof(root_drives[0])); root_index++) + { +- if(!nxIsDriveMounted(root_drives[root_index][1])) ++ if(!nxIsDriveMounted((char*)root_drives[root_index])) + continue; + +- nfo->fname[0] = root_drives[root_index][1]; +- nfo->fname[1] = '\0'; ++ memcpy(nfo->fname, root_drives[root_index], sizeof(root_drives[0])); ++ //nfo->fname = root_drives[root_index]; + nfo->fattrib = AM_DIR; + + // Create default year and time for root dirs +@@ -479,4 +492,4 @@ + // Not implemented + FILE_DBG("%s: NOT IMPLEMENTED\n", __FUNCTION__); + return FR_OK; +-} +\ No newline at end of file ++} +diff -ur ./src/libs/nxdk/lib/nxdk/automount_d.c ../LithiumX-DualHDD/src/libs/nxdk/lib/nxdk/automount_d.c +--- ./src/libs/nxdk/lib/nxdk/automount_d.c 2024-06-28 13:55:58.136000000 -0400 ++++ ../LithiumX-DualHDD/src/libs/nxdk/lib/nxdk/automount_d.c 2024-08-01 01:43:43.288000000 -0400 +@@ -11,7 +11,7 @@ + + __cdecl int automount_d_drive (void) + { +- if (nxIsDriveMounted('D')) { ++ if (nxIsDriveMounted("D")) { + return 0; + } + +@@ -27,7 +27,7 @@ + + // Mount the obtained path as D: + BOOL success; +- success = nxMountDrive('D', targetPath); ++ success = nxMountDrive("D", targetPath); + assert(success); + + return 0; +diff -ur ./src/libs/nxdk/lib/nxdk/mount.c ../LithiumX-DualHDD/src/libs/nxdk/lib/nxdk/mount.c +--- ./src/libs/nxdk/lib/nxdk/mount.c 2024-06-28 13:55:58.136000000 -0400 ++++ ../LithiumX-DualHDD/src/libs/nxdk/lib/nxdk/mount.c 2024-08-01 01:42:32.208000000 -0400 +@@ -8,15 +8,15 @@ + #include + #include + +-bool nxIsDriveMounted (char driveLetter) ++bool nxIsDriveMounted (char* driveLetter) + { + NTSTATUS status; + HANDLE handle; + ANSI_STRING drivePath; +- CHAR drivePathBuffer[7]; ++ CHAR drivePathBuffer[20] = {0}; + OBJECT_ATTRIBUTES objattr; + +- sprintf(drivePathBuffer, "\\??\\%c:", driveLetter); ++ sprintf(drivePathBuffer, "\\??\\%s:", driveLetter); + RtlInitAnsiString(&drivePath, drivePathBuffer); + + InitializeObjectAttributes(&objattr, &drivePath, OBJ_CASE_INSENSITIVE, NULL, NULL); +@@ -29,14 +29,14 @@ + return false; + } + +-bool nxMountDrive (char driveLetter, const char *path) ++bool nxMountDrive (char* driveLetter, const char *path) + { + NTSTATUS status; + ANSI_STRING drivePath; +- CHAR drivePathBuffer[7]; ++ CHAR drivePathBuffer[20] = {0}; + ANSI_STRING mountPath; + +- sprintf(drivePathBuffer, "\\??\\%c:", driveLetter); ++ sprintf(drivePathBuffer, "\\??\\%s:", driveLetter); + RtlInitAnsiString(&drivePath, drivePathBuffer); + + RtlInitAnsiString(&mountPath, path); +@@ -50,13 +50,13 @@ + return true; + } + +-bool nxUnmountDrive (char driveLetter) ++bool nxUnmountDrive (char* driveLetter) + { + NTSTATUS status; + ANSI_STRING drivePath; +- CHAR drivePathBuffer[7]; ++ CHAR drivePathBuffer[20] = {0}; + +- sprintf(drivePathBuffer, "\\??\\%c:", driveLetter); ++ sprintf(drivePathBuffer, "\\??\\%s:", driveLetter); + RtlInitAnsiString(&drivePath, drivePathBuffer); + + status = IoDeleteSymbolicLink(&drivePath); +diff -ur ./src/libs/nxdk/lib/nxdk/mount.h ../LithiumX-DualHDD/src/libs/nxdk/lib/nxdk/mount.h +--- ./src/libs/nxdk/lib/nxdk/mount.h 2024-06-28 13:55:58.136000000 -0400 ++++ ../LithiumX-DualHDD/src/libs/nxdk/lib/nxdk/mount.h 2024-08-01 01:42:46.648000000 -0400 +@@ -13,9 +13,9 @@ + #include + #endif + +-bool nxIsDriveMounted (char driveLetter); +-bool nxMountDrive (char driveLetter, const char *path); +-bool nxUnmountDrive (char driveLetter); ++bool nxIsDriveMounted (char* driveLetter); ++bool nxMountDrive (char* driveLetter, const char *path); ++bool nxUnmountDrive (char* driveLetter); + + #ifdef __cplusplus + } +diff -ur ./src/lithiumx.h ../LithiumX-DualHDD/src/lithiumx.h +--- ./src/lithiumx.h 2024-06-28 13:55:18.772000000 -0400 ++++ ../LithiumX-DualHDD/src/lithiumx.h 2024-08-01 03:55:40.896000000 -0400 +@@ -63,7 +63,7 @@ + //nxdk local directory is also mounting to Q: so we get Q:Q:.. + #ifndef DASH_SEARCH_PATH_CONFIG + #ifdef NXDK +-#define DASH_SEARCH_PATH_CONFIG "E:\\UDATA\\LithiumX\\lithiumx.toml" ++#define DASH_SEARCH_PATH_CONFIG "HDD0-E:\\UDATA\\LithiumX\\lithiumx.toml" + #else + #define DASH_SEARCH_PATH_CONFIG "lithiumx.toml" + #endif +@@ -71,7 +71,7 @@ + + #ifndef DASH_DATABASE_PATH + #ifdef NXDK +-#define DASH_DATABASE_PATH "E:\\UDATA\\LithiumX\\lithiumx.db" ++#define DASH_DATABASE_PATH "HDD0-E:\\UDATA\\LithiumX\\lithiumx.db" + #else + #define DASH_DATABASE_PATH "lithiumx.db" + #endif +@@ -200,4 +200,4 @@ + } + #endif + +-#endif +\ No newline at end of file ++#endif +diff -ur ./src/platform/xbox/platform.c ../LithiumX-DualHDD/src/platform/xbox/platform.c +--- ./src/platform/xbox/platform.c 2024-06-28 16:01:47.012000000 -0400 ++++ ../LithiumX-DualHDD/src/platform/xbox/platform.c 2024-08-16 19:12:41.508000000 -0400 +@@ -129,47 +129,65 @@ + debugPrint("%s ", loading_str); + + // nxdk automounts D to the root xbe path. Lets undo that +- if (nxIsDriveMounted('D')) ++ if (nxIsDriveMounted("DVD-ROM")) + { +- nxUnmountDrive('D'); ++ nxUnmountDrive("DVD-ROM"); + } + + // Mount the DVD drive +- nxMountDrive('D', "\\Device\\CdRom0"); ++ nxMountDrive("DVD-ROM", "\\Device\\CdRom0"); + + // Mount root of LithiumX xbe to Q: + char targetPath[MAX_PATH]; + nxGetCurrentXbeNtPath(targetPath); + *(strrchr(targetPath, '\\') + 1) = '\0'; +- nxMountDrive('Q', targetPath); ++ nxMountDrive("ROOT", targetPath); + debugPrint("."); + + // Mount stock partitions +- nxMountDrive('C', "\\Device\\Harddisk0\\Partition2\\"); +- nxMountDrive('E', "\\Device\\Harddisk0\\Partition1\\"); +- nxMountDrive('X', "\\Device\\Harddisk0\\Partition3\\"); +- nxMountDrive('Y', "\\Device\\Harddisk0\\Partition4\\"); +- nxMountDrive('Z', "\\Device\\Harddisk0\\Partition5\\"); ++ nxMountDrive("HDD0-C", "\\Device\\Harddisk0\\Partition2\\"); ++ nxMountDrive("HDD0-E", "\\Device\\Harddisk0\\Partition1\\"); ++ nxMountDrive("HDD0-X", "\\Device\\Harddisk0\\Partition3\\"); ++ nxMountDrive("HDD0-Y", "\\Device\\Harddisk0\\Partition4\\"); ++ nxMountDrive("HDD0-Z", "\\Device\\Harddisk0\\Partition5\\"); + debugPrint("."); + + // Mount extended partitions + // NOTE: Both the retail kernel and modified kernels will mount these partitions + // if they exist and silently fail if they don't. So we can just try to mount them + // and not worry about checking if they exist. +- nxMountDrive('F', "\\Device\\Harddisk0\\Partition6\\"); +- nxMountDrive('G', "\\Device\\Harddisk0\\Partition7\\"); +- nxMountDrive('R', "\\Device\\Harddisk0\\Partition8\\"); +- nxMountDrive('S', "\\Device\\Harddisk0\\Partition9\\"); +- nxMountDrive('V', "\\Device\\Harddisk0\\Partition10\\"); +- nxMountDrive('W', "\\Device\\Harddisk0\\Partition11\\"); +- nxMountDrive('A', "\\Device\\Harddisk0\\Partition12\\"); +- nxMountDrive('B', "\\Device\\Harddisk0\\Partition13\\"); +- nxMountDrive('P', "\\Device\\Harddisk0\\Partition14\\"); ++ nxMountDrive("HDD0-F", "\\Device\\Harddisk0\\Partition6\\"); ++ nxMountDrive("HDD0-G", "\\Device\\Harddisk0\\Partition7\\"); ++ nxMountDrive("HDD0-H", "\\Device\\Harddisk0\\Partition8\\"); ++ nxMountDrive("HDD0-I", "\\Device\\Harddisk0\\Partition9\\"); ++ nxMountDrive("HDD0-J", "\\Device\\Harddisk0\\Partition10\\"); ++ nxMountDrive("HDD0-K", "\\Device\\Harddisk0\\Partition11\\"); ++ nxMountDrive("HDD0-L", "\\Device\\Harddisk0\\Partition12\\"); ++ nxMountDrive("HDD0-M", "\\Device\\Harddisk0\\Partition13\\"); ++ nxMountDrive("HDD0-N", "\\Device\\Harddisk0\\Partition14\\"); ++ ++ // Mount any second drive partitions ++ ++ nxMountDrive("HDD1-C", "\\Device\\Harddisk1\\Partition2\\"); ++ nxMountDrive("HDD1-E", "\\Device\\Harddisk1\\Partition1\\"); ++ nxMountDrive("HDD1-X", "\\Device\\Harddisk1\\Partition3\\"); ++ nxMountDrive("HDD1-Y", "\\Device\\Harddisk1\\Partition4\\"); ++ nxMountDrive("HDD1-Z", "\\Device\\Harddisk1\\Partition5\\"); ++ nxMountDrive("HDD1-F", "\\Device\\Harddisk1\\Partition6\\"); ++ nxMountDrive("HDD1-G", "\\Device\\Harddisk1\\Partition7\\"); ++ nxMountDrive("HDD1-H", "\\Device\\Harddisk1\\Partition8\\"); ++ nxMountDrive("HDD1-I", "\\Device\\Harddisk1\\Partition9\\"); ++ nxMountDrive("HDD1-J", "\\Device\\Harddisk1\\Partition10\\"); ++ nxMountDrive("HDD1-K", "\\Device\\Harddisk1\\Partition11\\"); ++ nxMountDrive("HDD1-L", "\\Device\\Harddisk1\\Partition12\\"); ++ nxMountDrive("HDD1-M", "\\Device\\Harddisk1\\Partition13\\"); ++ nxMountDrive("HDD1-N", "\\Device\\Harddisk1\\Partition14\\"); ++ + debugPrint("."); + +- CreateDirectoryA("E:\\UDATA", NULL); +- CreateDirectoryA("E:\\UDATA\\LithiumX", NULL); +- FILE *fp = fopen("E:\\UDATA\\LithiumX\\TitleMeta.xbx", "wb"); ++ CreateDirectoryA("HDD0-E:\\UDATA", NULL); ++ CreateDirectoryA("HDD0-E:\\UDATA\\LithiumX", NULL); ++ FILE *fp = fopen("HDD0-E:\\UDATA\\LithiumX\\TitleMeta.xbx", "wb"); + if (fp) + { + fprintf(fp, "TitleName=LithiumX Dashboard\r\n"); +@@ -207,7 +225,7 @@ + if (strcmp(dash_launch_path, "__MSDASH__") == 0) + { + // FIXME: Do we need to eject disk? +- strcpy(dash_launch_path, "C:\\xboxdash.xbe"); ++ strcpy(dash_launch_path, "HDD0-C:\\xboxdash.xbe"); + } + else if (strcmp(dash_launch_path, "__DVD__") == 0) + { diff --git a/Cerbios Bios/Pheonix Bios Loader/Cerbios.bin b/Cerbios Bios/Pheonix Bios Loader/Cerbios.bin new file mode 100644 index 0000000..35b0d93 Binary files /dev/null and b/Cerbios Bios/Pheonix Bios Loader/Cerbios.bin differ diff --git a/Cerbios Bios/Pheonix Bios Loader/boot.cfg b/Cerbios Bios/Pheonix Bios Loader/boot.cfg new file mode 100644 index 0000000..fda7411 --- /dev/null +++ b/Cerbios Bios/Pheonix Bios Loader/boot.cfg @@ -0,0 +1,26 @@ +# PBL Metoo Edition configuration file + +# This is the bios image file loaded at boot. It is loaded from the same +# directory default.xbe is in. + +Romfile Cerbios.bin + +# Change the led color sequence when the loader boots. Define it if you +# like flashing lights and glimmering objects. r=red, o=orange, g=green, x=off. + +#LEDSequence rrrr + +# Define to write debug messages to pbldebug.log. May be useful in finding out +# what's wrong, when it doesn't work. Default log file name is pbldebug.log. + +#Debug true +#DebugLog pbldebug.log + +# What to do with the screen during bios loading: +# keep = keep the current screen (default) +# blank = blank screen +# off = turn video output off completely +# nothing = don't do anything to the video output (results in +# garbage output during bios loading) + +#Screen blank diff --git a/Cerbios Bios/Pheonix Bios Loader/default.xbe b/Cerbios Bios/Pheonix Bios Loader/default.xbe new file mode 100644 index 0000000..0184206 Binary files /dev/null and b/Cerbios Bios/Pheonix Bios Loader/default.xbe differ diff --git a/Cerbios Bios/Readme.nfo b/Cerbios Bios/Readme.nfo new file mode 100644 index 0000000..fea34e0 --- /dev/null +++ b/Cerbios Bios/Readme.nfo @@ -0,0 +1,561 @@ + ( ( ) ( + ( )\ ) ( )\ ) ( /( )\ ) + )\ ( (()/( ( )\ (()/( )\()) (()/( + (((_) )\ /(_)))((_) /(_))((_)\ /(_)) + )\___ ((_) (_)) ((_)_ (_)) ((_) (_)) + ((/ __|| __|| _ \ | _ )|_ _| / _ \ / __| + | (__ | _| | / | _ \ | | | (_) |\__ \ + \___||___||_|_\ |___/|___| \___/ |___/ + + + +****************************************************************************** +* * +* .:Release V2.4.2 Beta (Xbox V1.0 - 1.6) Only:. * +* * +****************************************************************************** + +****************************************************************************** +* Version :.........V2.4.2 Beta * Size :......................256 KB * +* Date :....................18/08/24 * Type :...............Xbox Bios * +* Group :........Team CerBios * Platform :.........Microsoft Xbox * +****************************************************************************** +* https://discord.gg/VcdSfajQGK * +****************************************************************************** + +****************************************************************************** +*....:Changes/Additions:.....................................................* +****************************************************************************** +* * +* --A new custom Bios for the Original Xbox.-- * +* * +* Release: V2.4.2 Beta * +* * +* The Dogs Are Back From Their Vacation (Fixed Splash Screen) * +* Improved Dual HDD Support. (DriveSetup = 3) * +* Updated UDMA Settings In INI To Support Both HDDS. Please Ensure You * +* are Running Latest Cerbios.INI * +* * +* New UDMA Settings: * +* ; Set Master Drive UDMA mode 0-6 on cold-boot * +* UdmaModeMaster = 2 * +* * +* ; Set Slave Drive UDMA mode 0-6 on cold-boot (Enable DriveSetup = 3) * +* UdmaModeSlave = 2 * +* * +* Released Updated Version Of LithiumX Which Allows Browsing Of 2nd HDD * +* Additional System Stability Improvements. * +* * +*.........................:Dual HDD Support Info?:...........................* +* This Is A First For The Original Xbox And You May Encounter Some Bugs. * +* Please Report Your Test Results In Our Discord Room For Future * +* Improvements. * +* * +* To Custom Format Your 2nd HDD You Will Require FATXplorer 3.0 beta 32 * +* or Higher. This Can Be Downloaded From The Below Link. * +* https://fatxplorer.eaton-works.com/3-0-beta/ * +* * +* Existing Partitions Are Supported With Dual HDD Configuration. * +* This Includes Stock HDD or Cerbios Formated Extended HDDS * +* * +*......................:Dashboard & Software Updates:........................* +* Existing Open Source Dashboards Will Need To Be Updated To Support * +* Secondary HDD "\Device\Harddisk1\Partition(#)\" * +* * +* Software Where Source Does Not Exist May Need To Be Patched Manually. * +* Please Share Any Patches Made With The Community. * +* * +* * +* #Please Contribute To Our Testing Efforts And Report Your Test Results, * +* Bugs, Or Any Other Feedback In Our Room On Discord. Your Input Is * +* Invaluable And Greatly Appreciated. * +* * +* We Are Already Hard At Work Towards Our Next Major Release. * +* * +* * +* ------------------------------------------------------------------- * +* Release: V2.4.1 Beta * +* * +* Fixed Reported Issues With Force 480p & Force Pal * +* Fixed Reported Video Issues, Black Screen On Some Games * +* Improved VGA Mode. Still Experimental * +* Additional System Stability Improvements. * +* * +* #Please Contribute To Our Testing Efforts And Report Your Test Results, * +* Bugs, Or Any Other Feedback In Our Room On Discord. Your Input Is * +* Invaluable And Greatly Appreciated. * +* * +* We Are Already Hard At Work Towards Our Next Major Release. * +* * +* * +* ------------------------------------------------------------------- * +* * +* Release: V2.4.0 Beta * +* * +* NEW INI CONFIGURATION OPTIONS PLEASE UPDATE YOUR CERBIOS.INI FILE * +* * +* Fixed Booting / Freezing Issues with Some V1.0 Consoles * +* Fixed Video Issues Related To V1.6 Xcalibur Encoder. Composite, Scart * +* Svideo & Component Video Modes Now Working. * +* Fixed Video Issues Related to Scrambled Image On 1.6 Consoles. No More * +* Patching Of XBEs Required. * +* Added Ability To Set UDMA Mode Via Cerbios.ini * +* Added Ability To Force 480I to 480P Via Cerbios.ini & Cerbios Tool. * +* Added IGPC (In Game Power Cycle), Set Your Own Mapping Via Cerbios Tool * +* # Power Cycle = LT+RT+BLACK+DPADUP * +* Improved Bootup Times When No DVD / HDD Connected. * +* Fixed Issues with 1.6 Consoles & Fan Speed. * +* Added Default Fan Speed For CPU Upgraded Consoles To 60%. * +* Improved Safemode Detection. * +* Added Support For Force-PAL, an Automatic Setting That Temporarily * +* Switches The Console Region To PAL For Certain PAL-Only Games. * +* Added Support For An Upcoming RTC Hardware Module To Maintain Time Sync * +* Configurable Via Cerbios.ini (RTCEnable) * +* Added Experimental VGA Support. * +* Requires Cable That Can Seperate Sync-on-Green Signal Or A Monitor * +* That Supports Sync-on-Green. Video Mode Pins Set As (1+3) Or For * +* HDTV (2+3), This only Supports Xbox V1.0-1.4 Only. * +* Configurable Via Cerbios.ini (ForceVGA) * +* Added Ability To Block Xbox Dashboard Updates Via Cerbios.ini * +* This Only Blocks Checks Against C:\xboxdash.xbe. Useful When * +* Running Font Based Softmods Which Break If Dash Is Updated. * +* Additional System Stability Improvements. * +* * +* * +* An Updated Version Of Team Resurgents Cerbios Tool Will Be Found At * +* https://github.com/Team-Resurgent/CerbiosTool * +* * +* #Please Contribute To Our Testing Efforts And Report Your Test Results, * +* Bugs, Or Any Other Feedback In Our Room On Discord. Your Input Is * +* Invaluable And Greatly Appreciated. * +* * +* We Are Already Hard At Work Towards Our Next Major Release. * +* * +* * +* ------------------------------------------------------------------- * +* * +* Release: V2.3.2 HD Alpha Test Build / Bug Finder * +* * +* Added Inital Support for HD+ Hardware Mod * +* Released ElpisHD App. Ability To Control HD+ Features On Cerbios. * +* Place ElpisHD Folder To Root Of C:\ For Default Location and Run * +* Default.Xbe To Configure Settings. * +* * +*.........................:Why Is This An Alpha?:............................* +* * +* This Release Is A Public Alpha Test Build Of Cerbios, Featuring Support * +* For The HD+ Mod. We Issue This Release With An Important Warning: This * +* Build Is Not Intended For Regular, Daily Use. It Is Likely To Contain * +* Bugs, Including Some That May Have Been Overlooked Or Inadvertently * +* Introduced During The Integration Of Undocumented Support For Third- * +* Party Hardware. * +* * +* We Are Relying On The Community's Collaboration For This Phase. Your * +* Participation In Testing And Providing Feedback Is Vital. We Need Your * +* Help To Identify And Report Any Issues Before We Proceed To An Official * +* Beta Release. This Collaborative Effort Is Crucial To Ensure The * +* Stability And Functionality Of The Final Product. * +* * +* ElpisHD App is required to change settings on the HD+ And Works Only * +* With Cerbios. Source Code Will Be Released Once Testing Is Complete * +* And Offical Beta Version With HD Support Is Released. * +* * +* #Please Contribute To Our Testing Efforts And Report Your Test Results, * +* Bugs, Or Any Other Feedback In Our Room On Discord. Your Input Is * +* Invaluable And Greatly Appreciated. * +* * +* * +* ------------------------------------------------------------------- * +* Release: V2.3.1 Beta * +* * +* Added Ability To Launch Cerbios As A BFM Bios Via PBL Methods. * +* * +*..............................:What Is BFM?:................................* +* * +* Thanks To Team Resurgent For Providing The Required Patches, Cerbios * +* Is Now BFM Compatible. This Means Your Favourite Bios Can Now Be Used * +* On Softmodded Consoles, TSOP And All Modchips. * +* * +* To Launch Cerbios As A BFM Bios, Simply Copy The Pheonix Bios Loader * +* Folder To Your HDD A Long With A Copy Of Cerbios Bios File Renamed As * +* Cerbios.bin , Copy BootAnims Folder & Cerbios.ini to Root Of C: * +* Launch Default.XBE & Let The Magic Happen. Console Should Reboot Into * +* Cerbios. * +* Please Note Doing A FULL IGR While Using PBL Will Reload Your Default * +* Bios Again. * +* * +* For Modchip & TSOP Users Nothing Has Changed. Simply Flash To Your * +* Hardware, Copy BootAnims Folder & Cerbios.ini to Root Of C: * +* * +* The Updated Version Of Team Resurgents Cerbios Tool Can Be Found At * +* https://github.com/Team-Resurgent/CerbiosTool * +* Please Show Them Some Love, As They Continue To Release Some Amazing * +* Free Tools For The Scene. They Have Set Up A Patreon & Kofi * +* * +* Thanks Also Go Out To Team Pheonix & Meetoo For Their Amazing Work * +* They Did With PBL. 20 Years Later & Still Works As It Did On Day One * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS IN OUR ROOM ON * +* DISCORD THANKS * +* * +* * +* ------------------------------------------------------------------- * +* Release: V2.3.0 Beta * +* * +* Added New Way To Customize Bios Using Cerbios Tool (windows Only ATM) * +* Added Ability To Theme Cerbios Logo Via Cerbios Tool * +* Added Ability To Scale or Hide Cerbios Logo Entirely Via Cerbios Tool * +* Added Experimental UDMA Mode 6 (Requires Ultra DMA (80-Conductor) * +* IDE/ATA Cable & Startech Adapter. * +* Removed Custom IGR Keys From INI. Now Configureable Via Cerbios Tool * +* Added Ability To Use Drive Letters In Paths As Well As \Device* Format * +* Added Ability To Set UDMA Modes 2-6 Via Cerbios Tool * +* Added Ability To Set UDMA Mode Auto Via Cerbios Tool For Startech or * +* Generic Sata to IDE Adapters. Auto Mode Will Detect Supported * +* UDMA Mode Of Drive & Sets that. This Feature Is Experimental, You * +* Can Boot Into UDMA Mode 2 (Safe Mode) by Booting Xbox Using Eject. * +* Please Share Your Results Of Auto Mode In Our Room On Discord. * +* Added Auto Boot Into Safe Mode If Error 9 Or 13 Detected Due To * +* Incompatble UDMA Mode. * +* Updated Cerbios.ini to Support Drive Letter Path Names As well. * +* System Stability Improvements * +* * +* We Are Working On Fixing Some Of The Reported 1.6 Video Issues With * +* Composite Video Cables. We Recommend You Use Component Or HDMI Plug * +* And Play Solutions Such As Chimeric HDMI, XBOX2HDMI Or Xedusa. * +* * +* We Are Already Hard At Work Towards Our Next Major Release. * +* * +*.........................:What Is Cerbios Tool?:............................* +* * +* Cerbios Tool Allows You To Customize Some Of the Features Found In * +* Cerbios. This Tool Was Created And Released By Team Resurgent. * +* More Information And Features can Be Found On Their Github Page. * +* * +* Some Of Its Core Features & Functionality Are Listed Below . * +* Ability To Theme Cerbios Logo. * +* Comes Preloaded With Themes To Pick From * +* Ability To Copy & Share Themes With Your Friends. * +* Ability To Add & Load Themes into App Using Themes.JSON. * +* Ability To Scale or Hide Cerbios Logo Apart From Safe Mode Notice * +* Ability To Set UDMA MODES AUTO or 2-6 * +* Ability To Save Favourite Configs To Re-Use Later * +* Ability To Set Config Defaults * +* Ability To Set IGR Combo Keys & Controller Port * +* Ability To Set Or Edit Existing Functionality Such as Debug, Fan Speed * +* DriveSetup, AV Check, CD, Dash & Boot Animation Paths And Front LED * +* Directly Into Bios. * +* Ability To Disable Config Loading From HDD And Use Settings Saved In * +* In Bios Instead. Config Loading From HDD Is Enabled By Default And Will * +* Overwrite Any Settings In Bios With That In INI File. * +* Many More Features Please Check Github For Updates. * +* * +* The Latest Version Of Team Resurgents Cerbios Tool Can Be Found At * +* https://github.com/Team-Resurgent/CerbiosTool * +* Please Show Them Some Love, As They Continue To Release Some Amazing * +* Free Tools For The Scene. * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS IN OUR ROOM ON * +* DISCORD THANKS * +* * +* * +* ------------------------------------------------------------------- * +* Release: V2.2.1 Beta * +* * +* Fixed Issue Where Some Split Isos Would Not Work Properly * +* Shout-Out To Those That Reported This Bug To Us. * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS IN OUR ROOM ON * +* DISCORD THANKS * +* * +* * +* ------------------------------------------------------------------- * +* Release: V2.2.0 Beta - MERRY XMAS AND HAPPY NEW YEAR - * +* * +* Added Support for .CCI, Cerbios Compressed Image (Compressed Games) * +* System Stability Improvements * +* Added UDMA4 Build. For Those Who Requested It * +* * +* * +*................:What Is CCI, Cerbios Compressed Image?:....................* +* * +* .CCI Is A Compression Method For The ISO Image Format. It Is Used To * +* Compress Your Dumped Xbox Games As An Alternative To The .CSO * +* Compression Method. CCI Was Designed With Fast Creation Of The File * +* Format And Optimal Decompression In Kernel Without The Need For Any * +* Additional Hardware, Modifications Or Addons. * +* * +* .CCI Is The First Compression Method For ISO That Has Support For * +* Split Compressed ISO's To Work On An Xbox. It Was Created So That * +* Additional Storage Space Can Be Saved, Whilst Also Using A Low Memory * +* Footprint. Other Benefits Include Being Able To Be Decompressed With * +* Minimal Code As Well As Fast LZ4 Decompression That Does Not Impact * +* System Performance And Future Expandability. Team Resurgent Created * +* The First Prototype Code That We Have Iterated Upon And Incorporated * +* Into Cerbios Today. * +* * +* Team Resurgent Has Updated Their Repackinator Tool & Have Added The * +* Ability For Users To Create Compressed Images (.CCI) Of Your Dumps * +* * +* The Latest Version Of Team Resurgents Repackinator Can Be Found At * +* https://github.com/Team-Resurgent/Repackinator * +* Please Show Them Some Love, As They Continue To Release Some Amazing * +* Free Tools For The Scene. * +* * +* All Image Formats Created By Repackinator Keep Sectors & Disk Info * +* Intact To Ensure DRM Problamatic Games Such As Toca 3 Etc Work. * +* * +* To All Our Beta Testers, Thank You For All The Testing And Support * +* Much Love & Respect <3. * +* * +* We Will Be Back In 2023 With New Amazing Releases For All To Enjoy. * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS IN OUR ROOM ON * +* DISCORD, INCLUDING ANY ISSUES FACED WITH CCI THANKS * +* * +* * +* ------------------------------------------------------------------- * +* Release: V2.1.0 Beta * +* * +* Added Support for Xbox Console Revision V1.6 * +* Fixed Issues With Insignia Account Creation (MACS) * +* Will No Longer Report As Live Blocking Bios. * +* System Stability Improvements * +* * +* * +* People Doubted That It Would Be Possible However We Are Proud To * +* Introduce Cerbios Hybrid V2.1.0, Compatible With All Xbox Revisions * +* V1.0 - V1.6 Including all 128MB Ram Upgraded Systems * +* * +* For the Best Compatibility With Larger HDDS, We Recommend You Format * +* Your HDD Using FATXPLORER 3.X Beta & The Cerbios Option. We Have Seen * +* Issues When Drives Are Formatted for Titan Use. * +* * +* A Big Shout-Out To All The Talented People Whom Contributed To This * +* Release, Endless Hours Were Spent Writing Custom Tools, Disassembly & * +* Analysing Hundreds of Lines of ASM, To Recreate The Code We Use Today * +* You Know Who You Are. To All Our Beta Testers, Thank You For All The * +* Testing And Support, Much Love & Respect <3. * +* * +* We Are Already Hard At Work Towards Our Next Major Release. * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS IN OUR ROOM ON * +* DISCORD THANKS * +* * +* * +* ------------------------------------------------------------------- * +* Release: V2.03 Repack * +* * +* Contains All Features And Fixes From V2.03 * +* Fixed Booting Issue When DriveSetup = 0 * +* Updated Safemode Boot Screen * +* System Stability Improvements * +* * +* * +* * +* Apologies For Our Last Release, Our Devs Were A Little Too Eager To * +* Get Back Into The Grind Of Things. * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS IN OUR ROOM ON * +* DISCORD THANKS * +* * +* * +* ------------------------------------------------------------------- * +* * +* Release: V2.03 * +* * +* AIO Hybrid Build No More Retail / Debug * +* The Dogs Are Back From Their Vacation (Now Show On Boot) * +* Fixed Random Screen Corruption On Cerbios Boot Logo * +* Fixed Error 12 When DriveSetup = 0 In Config and using UDMA5 * +* Fixed Issue With Some Games Not Booting (WIP) * +* Added Parental Control Removal. If Parental Controls Are Enabled * +* Cerbios Will Now Remove / Unlock Them From EEPROM. * +* Added New Safemode, Press Eject To Bypass UDMA Settings, This Will * +* Revert UDMA5 Back To UDMA2 (For That Boot). This Does Not Work * +* With The Xenium Based Mod Chips. * +* * +* * +* * +* We Are Still Here!!! Life Sometimes Takes Over Your Free Time. * +* Additional Features & Hardware Support Is Still Worked On & Will Be * +* Released Once Ready. Stay Tuned. * +* * +* For the Best Compatibility With Your Games, We Recommend You Make * +* Or Use Full Redump Images, Check Out The Newly Released Repackinator * +* by Team Resurgent. This Tool Will Convert Your Redumps Into Split * +* Images With Default.Xbe. Simply Copy To Your Xbox & Game On * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS IN OUR ROOM ON * +* DISCORD THANKS * +* * +* ------------------------------------------------------------------- * +* * +* Release: V2.02 Repack * +* * +* Fixed Issue With XMV Player Not Playing Video On Startup * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS ON DISCORD * +* OR THE FORUMS. THANKS * +* * +* * +* ------------------------------------------------------------------- * +* * +* Release: V2.02 * +* * +* Bios No Longer In Beta Phase * +* Fixed Issue With Sonic Mega Collection Not Booting * +* Included Nyan Cat Boot Animation from T.H.D * +* Added New Boot Animation (XMV Player) Convert Your Animations To * +* XMV Movie Files. Included Xbox One Boot Screen As Demo. * +* Fixed OG Xbox Boot Animation. Now Supports Widescreen & Upto 720P * +* Two Addition Bios Binaries Released. Retail UDMA5 & Debug UDMA5 * +* Use At Own Risk, A few IDE To Sata Adapters Do Not Support Higher * +* Transfer Speeds, This Is Experimental. DO NOT FLASH UNLESS YOU * +* YOU HAVE A WAY TO RECOVER, YOU HAVE BEEN WARNED!!!! * +* * +* We Are Working Hard In The Background To Add Additional Features * +* And Hardware Support. Keep An Eye Out For Further Announcements * +* * +* For the Best Compatibility With Your Games, We Recommend You Make * +* Or Use Full Redump Images, Use DD To Remove Video Partition * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS ON DISCORD * +* OR THE FORUMS. THANKS * +* * +* * +* ------------------------------------------------------------------- * +* * +* Release: Beta V2.01 * +* * +* Bug Fixes Related To No DVD Drive Checks * +* All DriveSetup Modes In Config Now Work. * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS ON DISCORD * +* OR THE FORUMS. THANKS * +* * +* * +* ------------------------------------------------------------------- * +* * +* Release: Beta V2.00 * +* * +* Two Bios Binaries Released. Retail & Hybrid Debug * +* Use Retail Unless You Require Debug Features For XDK Tools ETC * +* #PLEASE NOTE: Current ATTACH.XBE DOES NOT WORK FOR ISO LOADING * +* USING DEBUG BIOS. NEW ATTACH.XBE WILL BE RELEASED IN FUTURE * +* Xbox V1.4 (Focus) Support Enabled * +* Improved No DVD Drive Check With Two New Modes * +* # 1 = HDD & No DVD (Legacy Mode) Same as Existing Bioses * +* # 2 = HDD & No DVD (Modern Mode) Complete Removal Of DVD Code * +* Fixed 16 Invalid Clock Error. Xbox With Invalid Date/Time * +* Will Now Boot And Default Will Be Set To 01/01/2022 12:00AM * +* Fixed 07 HDD Time-Out Error when using cheap Ali Express Sata * +* Adapters. (Boot Times May Take Longer With Cheaper Adapters) * +* Added Dual HDD Support (Another Scene First By Team CerBios) * +* New Tools Will Be Released To Take Advantage Of Dual HDD * +* Added Single & Multiple Extended Partition Support & Cluster Sizes * +* Expand Partitions past 998GB Limit * +* Added Debug Enabled Bios With Option To Enable/Disable Via Config * +* Added Customizable IGR , Set Your Own Button Mappings Via Config * +* Added IGS (In Game Shutdown), Set Your Own Button Mappings Via Config * +* # Shutdown = LT+RT+BACK+DPADUP * +* Added Custom Fan Speed Control, Can Be Set Via Config * +* External Boot Animations, Easy To Replace Boot Animation XBE * +* Path can be set Via Cerbios.ini Config. * +* Included Two Boot Animation XBE's. XBOX OG & Custom (Modern) With * +* Bootanim.ini To Allow For Custom Colors ETC. * +* Place BootAnims Folder In Root Of C: For Default Location * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS ON DISCORD * +* OR THE FORUMS. THANKS * +* * +* * +* ------------------------------------------------------------------- * +* * +* Release: Alpha V1.02 * +* Enabled 3 different IGR Modes * +* # Dash = LT+RT+Back+Start * +* # Game = LT+RT+Black+Start * +* # Full = LT+RT+Black+Back * +* Bug Fixes Related To ISO Image Dismount * +* * +* #PLEASE REPORT YOUR TEST RESULTS OR ANY BUGS REPORTS ON DISCORD * +* OR THE FORUMS. THANKS * +* * +* * +* ------------------------------------------------------------------- * +* * +* Release: Alpha V1.01 * +* Bug Fixes Related To Partition Table & Locked/Unlocked Drives * +* * +* ------------------------------------------------------------------- * +* Release: Alpha V1 * +* Custom LBA V4 Support. HDD up to 8TB #READ WARNING# * +* Custom Partition Hack (Auto Detects!) * +* Native XISO Support. Just run attach.xbe to load game.. * +* Custom Error Messages With Full Explanation * +* Full 128MB Ram Support (MTRR Fix) * +* Custom Config File For Animation Colors, Dash Paths CD Paths. * +* Universal Region Fix. (GTA SA NTSC Will Now Boot On Pal Consoles) * +* Boots All Originals * +* Boots All Unsigned Code * +* Boots All Backups * +* Boots Debug XBE's * +* Macrovision Protection Disabled * +* No Patch Hack * +* No Reset On Eject * +* No DVD Rom Check * +* No AV Cable Check * +* Front Led Support * +* * +* #WARNING PLEASE USE AT OWN RISK. AS AN ALPHA TESTER THERE IS A * +* POSSIBILITY THAT SOMETHING MIGHT GO WRONG. DONT BLAME US. YOU * +* HAVE BEEN WARNED * +* * +****************************************************************************** + +****************************************************************************** +*....:Frequently Asked Questions:............................................* +****************************************************************************** +* * +* Q: How do i format my HDD for extra partition support? * +* A: We have reached out to scene members with details. Their tools * +* will be updated to make this process easier for you. We will also * +* release a Xbox app that you can run on your xbox. * +* * +* Q: When will there be 1.4 - 1.6 support? * +* A: We currently have support for those hardware revisions disabled * +* during this alpha stage of testing. Once we are happy with the * +* testing and feedback received from the community we will introduce * +* new features & hardware support. * +* UPDATE: Xbox V1.4 SUPPORT ENABLED 09/04/2022 * +* UPDATE: Xbox V1.6 SUPPORT ENABLED 20/11/2022 * +* * +* Q: What about IGR & fan speed control, what gives? * +* A: Like mentioned above some features have been disabled. These will * +* make an appearance in future build releases. * +* UPDATE: IGR SUPPORT ENABLED 17/02/2022 * +* UPDATE: Custom Fan SUPPORT Added 22/04/2022 * +* * +* Q: My dashboard cant see my extra partitions 8-14. * +* A: Some dashboards were programed to only support F & G therefore * +* your extra partitions wont show. We suggest using XBMC which supports * +* 6 extra partitions. As new dashboards and apps are developed we are * +* sure that they will include support for extra partitions. * +* UPDATE: Larger Single Partition Support Added 22/04/2022 * +* * +* Q: Will this run on XEMU?. * +* A: Yes * +* * +* Q: How do i report my test results? * +* A: You can share your findings on the xboxscene forums or in the * +* Cerbios room on the xbox-scene discord. https://discord.gg/VcdSfajQGK * +* * +* Q: Where can i find help the forums are dead? * +* A: Try the discord the xbox community is helpful. * +* * +* Q: Where do i put the cerbios.ini? * +* A: Root of C:. * +* * +****************************************************************************** + diff --git a/Cerbios Bios/cerbios.ini b/Cerbios Bios/cerbios.ini new file mode 100644 index 0000000..957d778 --- /dev/null +++ b/Cerbios Bios/cerbios.ini @@ -0,0 +1,48 @@ +; Cerbios Config + +; Check For AV Pack +AVCheck = True + +; LED Ring Color, G = Green, R = Red, A = Amber, O = Off +FrontLed = GGGG + +; Fan Speed 0 = Default, 10-100 = Manual Control, Supports increments of 2's +FanSpeed = 0 + +; Drive Setup +; 0 = HDD & DVD, 1 = HDD & No DVD (Legacy Mode), 2 = HDD & No DVD (Modern Mode), 3 = Dual HDD +DriveSetup = 1 + +; Set Master Drive UDMA mode 0-6 on cold-boot +UdmaModeMaster = 2 + +; Set Slave Drive UDMA mode 0-6 on cold-boot (if enabled by DriveSetup = 3) +UdmaModeSlave = 2 + +; Enables Automatic Time Sync With Optional RTC Hardware Connected to SMBus +RtcEnable = False + +; Forces AV Modes That Would Normally Be Rendered At 480i to 480p. Requires 480p Set In MS Dash And Component Cables +Force480p = False + +; Forces VGA Modes For Component Cables Or Custom VGA Cables Using Mode(2+3) for VGA Displays Only, This Enables Force480p By Default & Sets Console To NTSC. +ForceVGA = False + +; Load XDK Launcher/XBDM if it exists (Debug Bios Only) +Debug = False + +; Blocks Games From Updating The Original Xbox Dashboard, Useful for softmods. +BlockDashUpdate = False + +; CD Paths (always falls back to D:\default.xbe) +CdPath1 = D:\Evolutionx\evoxdash.xbe +CdPath2 = D:\Avalaunch\avalaunch.xbe +CdPath3 = D:\UnleashX\unleashx.xbe + +; Dash Paths (always falls back to C:\xboxdash.xbe) +DashPath1 = C:\evoxdash.xbe +DashPath2 = C:\avalaunch.xbe +DashPath3 = C:\nexgen.xbe + +; Boot Animation Path (always falls back to C:\BootAnims\Xbox\bootanim.xbe) +BootAnimPath = C:\BootAnims\Xbox\bootanim.xbe \ No newline at end of file diff --git a/Cerbios Bios/older versions/BootAnim.xbe b/Cerbios Bios/older versions/BootAnim.xbe new file mode 100644 index 0000000..a529fea Binary files /dev/null and b/Cerbios Bios/older versions/BootAnim.xbe differ diff --git a/Cerbios Bios/older versions/Cerbios V1.0.0 Alpha.zip b/Cerbios Bios/older versions/Cerbios V1.0.0 Alpha.zip new file mode 100644 index 0000000..091626a Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V1.0.0 Alpha.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V1.0.1 Alpha.zip b/Cerbios Bios/older versions/Cerbios V1.0.1 Alpha.zip new file mode 100644 index 0000000..c0e3dd5 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V1.0.1 Alpha.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V1.0.2 Alpha.zip b/Cerbios Bios/older versions/Cerbios V1.0.2 Alpha.zip new file mode 100644 index 0000000..31a2b94 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V1.0.2 Alpha.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.0 Beta Debug.zip b/Cerbios Bios/older versions/Cerbios V2.0.0 Beta Debug.zip new file mode 100644 index 0000000..dbb2f5d Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.0 Beta Debug.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.0 Beta Retail.zip b/Cerbios Bios/older versions/Cerbios V2.0.0 Beta Retail.zip new file mode 100644 index 0000000..ceaae88 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.0 Beta Retail.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.1 Beta Debug.zip b/Cerbios Bios/older versions/Cerbios V2.0.1 Beta Debug.zip new file mode 100644 index 0000000..aa22e08 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.1 Beta Debug.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.1 Beta Retail.zip b/Cerbios Bios/older versions/Cerbios V2.0.1 Beta Retail.zip new file mode 100644 index 0000000..6d8522d Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.1 Beta Retail.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.2 Debug UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.0.2 Debug UDMA5.zip new file mode 100644 index 0000000..55d262d Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.2 Debug UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.2 Debug.zip b/Cerbios Bios/older versions/Cerbios V2.0.2 Debug.zip new file mode 100644 index 0000000..6c4621d Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.2 Debug.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.2 Retail UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.0.2 Retail UDMA5.zip new file mode 100644 index 0000000..2604e28 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.2 Retail UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.2 Retail.zip b/Cerbios Bios/older versions/Cerbios V2.0.2 Retail.zip new file mode 100644 index 0000000..7e9ab3f Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.2 Retail.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.2R Debug UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.0.2R Debug UDMA5.zip new file mode 100644 index 0000000..394c117 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.2R Debug UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.2R Debug.zip b/Cerbios Bios/older versions/Cerbios V2.0.2R Debug.zip new file mode 100644 index 0000000..0afc4ab Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.2R Debug.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.2R Retail UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.0.2R Retail UDMA5.zip new file mode 100644 index 0000000..e371fff Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.2R Retail UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.2R Retail.zip b/Cerbios Bios/older versions/Cerbios V2.0.2R Retail.zip new file mode 100644 index 0000000..4c0806f Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.2R Retail.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.3R UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.0.3R UDMA5.zip new file mode 100644 index 0000000..9dd11d4 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.3R UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.0.3R.zip b/Cerbios Bios/older versions/Cerbios V2.0.3R.zip new file mode 100644 index 0000000..d746ce8 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.0.3R.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.1.0 Beta UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.1.0 Beta UDMA5.zip new file mode 100644 index 0000000..9ff0a48 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.1.0 Beta UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.1.0 Beta.zip b/Cerbios Bios/older versions/Cerbios V2.1.0 Beta.zip new file mode 100644 index 0000000..44dca4c Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.1.0 Beta.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.2.0 Beta UDMA4.zip b/Cerbios Bios/older versions/Cerbios V2.2.0 Beta UDMA4.zip new file mode 100644 index 0000000..8a5e903 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.2.0 Beta UDMA4.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.2.0 Beta UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.2.0 Beta UDMA5.zip new file mode 100644 index 0000000..bbfc1b0 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.2.0 Beta UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.2.0 Beta.zip b/Cerbios Bios/older versions/Cerbios V2.2.0 Beta.zip new file mode 100644 index 0000000..9d371dc Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.2.0 Beta.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.2.1 Beta UDMA4.zip b/Cerbios Bios/older versions/Cerbios V2.2.1 Beta UDMA4.zip new file mode 100644 index 0000000..e6576b3 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.2.1 Beta UDMA4.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.2.1 Beta UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.2.1 Beta UDMA5.zip new file mode 100644 index 0000000..5f0bdb7 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.2.1 Beta UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.2.1 Beta.zip b/Cerbios Bios/older versions/Cerbios V2.2.1 Beta.zip new file mode 100644 index 0000000..bd79243 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.2.1 Beta.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA4.zip b/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA4.zip new file mode 100644 index 0000000..b2a9582 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA4.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA5.zip new file mode 100644 index 0000000..e3ebf04 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA6.zip b/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA6.zip new file mode 100644 index 0000000..f611500 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.0 Beta UDMA6.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.0 Beta.zip b/Cerbios Bios/older versions/Cerbios V2.3.0 Beta.zip new file mode 100644 index 0000000..1b1410f Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.0 Beta.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA4.zip b/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA4.zip new file mode 100644 index 0000000..c83f522 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA4.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA5.zip new file mode 100644 index 0000000..ab7ac06 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA6.zip b/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA6.zip new file mode 100644 index 0000000..ae7e8e9 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.1 Beta UDMA6.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.1 Beta.zip b/Cerbios Bios/older versions/Cerbios V2.3.1 Beta.zip new file mode 100644 index 0000000..865d282 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.1 Beta.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA2.zip b/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA2.zip new file mode 100644 index 0000000..9a1fa6a Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA2.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA4.zip b/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA4.zip new file mode 100644 index 0000000..38aefa7 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA4.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA5.zip b/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA5.zip new file mode 100644 index 0000000..0b31c2c Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA5.zip differ diff --git a/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA6.zip b/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA6.zip new file mode 100644 index 0000000..a13060f Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios V2.3.2 Alpha UDMA6.zip differ diff --git a/Cerbios Bios/older versions/Cerbios v2.4.2. bios.txt b/Cerbios Bios/older versions/Cerbios v2.4.2. bios.txt new file mode 100644 index 0000000..63f8508 --- /dev/null +++ b/Cerbios Bios/older versions/Cerbios v2.4.2. bios.txt @@ -0,0 +1,112 @@ + +****************************************************************************** +* * +* .:Release V2.4.2 Beta (Xbox V1.0 - 1.6) Only:. * +* * +****************************************************************************** + +****************************************************************************** +* Version :.........V2.4.2 Beta * Size :......................256 KB * +* Date :....................18/08/24 * Type :...............Xbox Bios * +* Group :........Team CerBios * Platform :.........Microsoft Xbox * +****************************************************************************** +* https://discord.gg/VcdSfajQGK * +****************************************************************************** + +****************************************************************************** +*....:Changes/Additions:.....................................................* +****************************************************************************** +* * +* --A new custom Bios for the Original Xbox.-- * +* * +* Release: V2.4.2 Beta * +* * +* The Dogs Are Back From Their Vacation (Fixed Splash Screen) * +* Improved Dual HDD Support. (DriveSetup = 3) * +* Updated UDMA Settings In INI To Support Both HDDS. Please Ensure You * +* are Running Latest Cerbios.INI * +* * +* New UDMA Settings: * +* ; Set Master Drive UDMA mode 0-6 on cold-boot * +* UdmaModeMaster = 2 * +* * +* ; Set Slave Drive UDMA mode 0-6 on cold-boot (Enable DriveSetup = 3) * +* UdmaModeSlave = 2 * +* * +* Released Updated Version Of LithiumX Which Allows Browsing Of 2nd HDD * +* Additional System Stability Improvements. * +* * +*.........................:Dual HDD Support Info?:...........................* +* This Is A First For The Original Xbox And You May Encounter Some Bugs. * +* Please Report Your Test Results In Our Discord Room For Future * +* Improvements. * +* * +* To Custom Format Your 2nd HDD You Will Require FATXplorer 3.0 beta 32 * +* or Higher. This Can Be Downloaded From The Below Link. * +* https://fatxplorer.eaton-works.com/3-0-beta/ * +* * +* Existing Partitions Are Supported With Dual HDD Configuration. * +* This Includes Stock HDD or Cerbios Formated Extended HDDS * +* * +*......................:Dashboard & Software Updates:........................* +* Existing Open Source Dashboards Will Need To Be Updated To Support * +* Secondary HDD "\Device\Harddisk1\Partition(#)\" * +* * +* Software Where Source Does Not Exist May Need To Be Patched Manually. * +* Please Share Any Patches Made With The Community. * +* * +* * +* #Please Contribute To Our Testing Efforts And Report Your Test Results, * +* Bugs, Or Any Other Feedback In Our Room On Discord. Your Input Is * +* Invaluable And Greatly Appreciated. * +* * +* We Are Already Hard At Work Towards Our Next Major Release. * +* * +* * +****************************************************************************** + +****************************************************************************** +*....:Frequently Asked Questions:............................................* +****************************************************************************** +* * +* Q: How do i format my HDD for extra partition support? * +* A: We have reached out to scene members with details. Their tools * +* will be updated to make this process easier for you. We will also * +* release a Xbox app that you can run on your xbox. * +* * +* Q: When will there be 1.4 - 1.6 support? * +* A: We currently have support for those hardware revisions disabled * +* during this alpha stage of testing. Once we are happy with the * +* testing and feedback received from the community we will introduce * +* new features & hardware support. * +* UPDATE: Xbox V1.4 SUPPORT ENABLED 09/04/2022 * +* UPDATE: Xbox V1.6 SUPPORT ENABLED 20/11/2022 * +* * +* Q: What about IGR & fan speed control, what gives? * +* A: Like mentioned above some features have been disabled. These will * +* make an appearance in future build releases. * +* UPDATE: IGR SUPPORT ENABLED 17/02/2022 * +* UPDATE: Custom Fan SUPPORT Added 22/04/2022 * +* * +* Q: My dashboard cant see my extra partitions 8-14. * +* A: Some dashboards were programed to only support F & G therefore * +* your extra partitions wont show. We suggest using XBMC which supports * +* 6 extra partitions. As new dashboards and apps are developed we are * +* sure that they will include support for extra partitions. * +* UPDATE: Larger Single Partition Support Added 22/04/2022 * +* * +* Q: Will this run on XEMU?. * +* A: Yes * +* * +* Q: How do i report my test results? * +* A: You can share your findings on the xboxscene forums or in the * +* Cerbios room on the xbox-scene discord. https://discord.gg/VcdSfajQGK * +* * +* Q: Where can i find help the forums are dead? * +* A: Try the discord the xbox community is helpful. * +* * +* Q: Where do i put the cerbios.ini? * +* A: Root of C:. * +* * +****************************************************************************** + diff --git a/Cerbios Bios/older versions/Cerbios.U2.1024kb.zip b/Cerbios Bios/older versions/Cerbios.U2.1024kb.zip new file mode 100644 index 0000000..de00018 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U2.1024kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U2.256kb.zip b/Cerbios Bios/older versions/Cerbios.U2.256kb.zip new file mode 100644 index 0000000..0e13bc3 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U2.256kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U2.512kb.zip b/Cerbios Bios/older versions/Cerbios.U2.512kb.zip new file mode 100644 index 0000000..6b31d28 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U2.512kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U4.1024kb.zip b/Cerbios Bios/older versions/Cerbios.U4.1024kb.zip new file mode 100644 index 0000000..80f272b Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U4.1024kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U4.256kb.zip b/Cerbios Bios/older versions/Cerbios.U4.256kb.zip new file mode 100644 index 0000000..16ad149 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U4.256kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U4.512kb.zip b/Cerbios Bios/older versions/Cerbios.U4.512kb.zip new file mode 100644 index 0000000..7914654 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U4.512kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U5.1024kb.zip b/Cerbios Bios/older versions/Cerbios.U5.1024kb.zip new file mode 100644 index 0000000..8f5dc2f Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U5.1024kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U5.256kb.zip b/Cerbios Bios/older versions/Cerbios.U5.256kb.zip new file mode 100644 index 0000000..a10cf8e Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U5.256kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U5.512kb.zip b/Cerbios Bios/older versions/Cerbios.U5.512kb.zip new file mode 100644 index 0000000..0d0a096 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U5.512kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U6.1024kb.zip b/Cerbios Bios/older versions/Cerbios.U6.1024kb.zip new file mode 100644 index 0000000..4f365fb Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U6.1024kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U6.256kb.zip b/Cerbios Bios/older versions/Cerbios.U6.256kb.zip new file mode 100644 index 0000000..a58604c Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U6.256kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.U6.512kb.zip b/Cerbios Bios/older versions/Cerbios.U6.512kb.zip new file mode 100644 index 0000000..b156fc9 Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.U6.512kb.zip differ diff --git a/Cerbios Bios/older versions/Cerbios.ini.zip b/Cerbios Bios/older versions/Cerbios.ini.zip new file mode 100644 index 0000000..7c990bb Binary files /dev/null and b/Cerbios Bios/older versions/Cerbios.ini.zip differ diff --git a/Cerbios Bios/older versions/CerbiosU2Pack.zip b/Cerbios Bios/older versions/CerbiosU2Pack.zip new file mode 100644 index 0000000..20db098 Binary files /dev/null and b/Cerbios Bios/older versions/CerbiosU2Pack.zip differ diff --git a/Cerbios Bios/older versions/CerbiosU4Pack.zip b/Cerbios Bios/older versions/CerbiosU4Pack.zip new file mode 100644 index 0000000..17b0109 Binary files /dev/null and b/Cerbios Bios/older versions/CerbiosU4Pack.zip differ diff --git a/Cerbios Bios/older versions/CerbiosU5Pack.zip b/Cerbios Bios/older versions/CerbiosU5Pack.zip new file mode 100644 index 0000000..fdf30fd Binary files /dev/null and b/Cerbios Bios/older versions/CerbiosU5Pack.zip differ diff --git a/Cerbios Bios/older versions/CerbiosU6Pack.zip b/Cerbios Bios/older versions/CerbiosU6Pack.zip new file mode 100644 index 0000000..dd4737a Binary files /dev/null and b/Cerbios Bios/older versions/CerbiosU6Pack.zip differ diff --git a/Cerbios Bios/older versions/LICENSE b/Cerbios Bios/older versions/LICENSE new file mode 100644 index 0000000..0f6497c --- /dev/null +++ b/Cerbios Bios/older versions/LICENSE @@ -0,0 +1,24 @@ +Based on the works of K Lange, Peter Gordon, and Chris Torres + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to +do so, subject to the following conditions: +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the documentation + and/or other materials provided with the distribution. +* Neither the name of CERBIOS, nor the names of its contributors + may be used to endorse or promote products derived from this Software + without specific prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. diff --git a/Cerbios Bios/older versions/Readme.nfo b/Cerbios Bios/older versions/Readme.nfo new file mode 100644 index 0000000..0e8e839 --- /dev/null +++ b/Cerbios Bios/older versions/Readme.nfo @@ -0,0 +1,50 @@ + + +TTTTTTTTTTTTTTTTTTTTTTT HHHHHHHHH HHHHHHHHH DDDDDDDDDDDDD +T:::::::::::::::::::::T H:::::::H H:::::::H D::::::::::::DDD +T:::::::::::::::::::::T H:::::::H H:::::::H D:::::::::::::::DD +T:::::TT:::::::TT:::::T HH::::::H H::::::HH DDD:::::DDDDD:::::D +TTTTTT T:::::T TTTTTT H:::::H H:::::H D:::::D D:::::D + T:::::T H:::::H H:::::H D:::::D D:::::D + T:::::T H::::::HHHHH::::::H D:::::D D:::::D + T:::::T H:::::::::::::::::H D:::::D D:::::D + T:::::T H:::::::::::::::::H D:::::D D:::::D + T:::::T H::::::HHHHH::::::H D:::::D D:::::D + T:::::T H:::::H H:::::H D:::::D D:::::D + T:::::T H:::::H H:::::H D:::::D D:::::D + TT:::::::TT HH::::::H H::::::HH DDD:::::DDDDD:::::D + T:::::::::T ...... H:::::::H H:::::::H ...... D:::::::::::::::DD + T:::::::::T .::::. H:::::::H H:::::::H .::::. D::::::::::::DDD + TTTTTTTTTTT ...... HHHHHHHHH HHHHHHHHH ...... DDDDDDDDDDDDD + + + +----------- +DESCRIPTION +----------- + +Custom Boot animation for Cerbios V2.X based on the greatest internet meme NYAN CAT. + +----------------------------------------------------- + Instructions +----------------------------------------------------- + +Create a new folder called (Nyan Cat) in the root of your C:\Bootanims\ +Copy default.xbe into Nyan Cat Folder +Update Cerbios.ini with new path name + +BootAnimPath = \Device\Harddisk0\Partition2\BootAnims\Nyan Cat\default.xbe + + +----------------------------------------------------- + + +------ +THANKS +------ + +Team Cerbios for the amazing work they have done so far with this amazing bios & breathing some new life into the scene. +Massive shout out to all groups that are still working with the OG XBOX & making some sweet stuff after all these years. + +Source Code released & included for other teams to improve on & hopefully assist with creating new boot animations. We dont obfuscate or hide our code behind patch loaders or IPS. + diff --git a/Cerbios Bios/older versions/animation.h b/Cerbios Bios/older versions/animation.h new file mode 100644 index 0000000..86940e9 --- /dev/null +++ b/Cerbios Bios/older versions/animation.h @@ -0,0 +1,818 @@ +/* + * Pop Tart Cat animation frames + */ +#ifndef ANIMATION_H +#define ANIMATION_H + +const char frame0[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$''$-$$@','',,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$$$$$$$'**'$$$@''**',,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&'''++'@$$$$$-$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"++++++++++++++++++**''+'@$$$$$$$$'***''''****',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'**'''@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"++########++++++++''**''@$$$$$$-'*************',,,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$'***.'****.'**',,,,,,,,,,,,,,,,," +"####################''''@$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"##========########====''@@$$$-$$'*%%********%%',,,,,,,,,,,,,,,,," +"======================='@@@$$$$$$'***''''''**',,,,,,,,,,,,,,,,,," +"==;;;;;;;;.=======;;;;'''@@@@@@@@@'*********',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;'***''''''''''''''''''',,,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;'**'','*',,,,,'*','**',,,,,,,,,,,,,,,,,,,,," +";;,,,,,.,,;;;.;;;;,,,'''',,'',,,,,,,'',,'',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame1[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++'+++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"++++++++++++++++++'*'++'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"++########++++++++'*''''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################****'@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"###################''**'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"##========########==='''@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +"======================='@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +"==;;;;;;;;========;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**','*',,,,,,**','**',,,,,,,,,,,,,,,,,,,," +";;,,,.,,,,;;;;;;;;,,,,''',,,'',,,,,,''',,''',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,..,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame2[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,..,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +">>,,,,,,,>>>>>>>>,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"##+++++++########++++++'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"######################''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################'''''@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"==#######========#'****'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"==================='''='@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +";;=======;;;;;;;;======'@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";.;;;;;;;;;;;;;;;;;;;;;'*'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +".,.;;;;;;,,,,,,,,;;;;;;'**',**',,,,,,**','**',,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,''',,''',,,,,,''',,''',,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame3[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"##+++++++########++++++'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"#####################'''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"==#######========##****'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"=================='*'=='@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +";;=======;;;;;;;;=='==='@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,,;;;;;'**','*',,,,,,'*','**',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,''',,,'',,,,,,,'',,''',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame4[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>>''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$''$-$$@','',,,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$$$$'**'$$$@''**',,,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'''++'@$$$$$$$$'***''''****',,,,,,,,,,,,,,,,,," +"++########+++++++'**''''@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"#################'****''@$$$$$$-'*************',,,,,,,,,,,,,,,,," +"##################''''*'@$-$$$$$'***.'****.'**',,,,,,,,,,,,,,,,," +"##========########==='''@$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"======================='@@$$$-$$'*%%********%%',,,,,,,,,,,,,,,,," +"==;;;;;;;;========;;;;''@@@$$$$$$'***''''''**',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;''''@@@@@@@@@'*********',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;'***'''''''''''''''''''',,,,,,,,,,,,,,,,,,,," +";;,,,,,,,,;;;;;;;;,,'**','**,,,,,,'**,'**',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,''',,,'',,,,,,,'',,''',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,..,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame5[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>>''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$''$$$@@','',,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$'**'-$$@''**',,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$$$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"+++++++++++++++++++'+++'@$$$$$-$$'***''''****',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'*'++'@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"++########++++++++'*''''@$$$$$$$'*************',,,,,,,,,,,,,,,,," +"###################****'@$$$$$$-'***.'****.'**',,,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"##========########==='''@$$$$$$$'*%%********%%',,,,,,,,,,,,,,,,," +"======================='@@$$$-$$$'***''''''**',,,,,,,,,,,,,,,,,," +"==;;;;;;;;========;;;;''@@@$$$$$$$'*********',,,,,,,,,,,,,,,,,,." +";;;;;;;;;;;;;;;;;;;;;'*''@@@@@@@@@@''''''''',,,,,,,,,,,,,,,,,,,." +";;;;;;;;;;;;;;;;;;;;'***''''''''''''''''*',,,,,,,,,,,,,,,,,,,,,," +";;,,,,,,,,;;;;;;;;,,'**','**,,,,,,'**,'**',,,,,,,,,,,,,,,,,,..,." +",,,,,,,,,,,,,,,,,,,,''',,''',,,,,,''',,''',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,." +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame6[] = +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,..,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$''$-$$@','',,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$$$$$$$'**'$$$@''**',,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&'''&&'@$$$$$-$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'*''+'@$$$$$$$$'***''''****',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'**'''@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"##+++++++########++'**''@$$$$$$-'*************',,,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$'***.'****.'**',,,,,,,,,,,,,,,,," +"####################''''@$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"==#######========#####''@@$$$-$$'*%%********%%',,,,,,,,,,,,,,,,," +"======================='@@@$$$$$$'***''''''**',,,,,,,,,,,,,,,,,," +";;=======;;;;;;;;====='''@@@@@@@@@'*********',,,,,,,,,,,.,,,,,,," +";;;;;;;;;;;;;;;;;;;;;'***''''''''''''''''''',,,,,,,,,,.,,,.,,,,," +";;;;;;;;;;;;;;;;;;;;;'**'','*',,,,,'**,'**',,,,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,,;;;;'''',,'',,,,,,,'',,'',,,,,,,,,,,.,,,,,.,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame7[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,..,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++'+++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"++++++++++++++++++'*'++'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"##+++++++########+'*''''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################****'@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"###################''**'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"==#######========####'''@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +"======================='@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;=======;;;;;;;;======''@@@@@@@@@@'*********',,,.,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**','*',,,,,,**','**',,,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,,;;;;;''',,,'',,,,,,''',,''',,.,,,,.,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame8[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,..,...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>>''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"++########++++++++#####'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"######################''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################'''''@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"##========########'****'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"==================='''='@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +"==;;;;;;;;========;;;;;'@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;'*'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +";;,,,,,,,,;;;;;;;;,,,,,'**',**',,,,,,**'.'**',,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,''',,''',,,,,,''',,''',,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,"; + +const char frame9[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,>>>>>>>>,,,,,,,,>>>>>>>''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +">>&&&&&&&&>>>>>>>>&&&&&'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$$''-$$@',,'',,,,,,,,,,,,,,,,,," +"&&++++++++&&&&&&&&+++++'@$$$$$$$$$'**'$$@','**',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$$'***$$@''***',,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$$$$$'***''''****',,,,,,,,,,,,,,,,," +"++########++++++++#####'@$$$$$$$$$'***********',,,,,,,,,,,,,,,,," +"#####################'''@$$$$$$-$'*************',,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$$'***.'****.'**',,,,,,,,,,,,,,,," +"##========########=****'@$$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,," +"=================='*'=='@@$$$-$$$'*%%********%%',,,,,,,,,,,,,,,," +"==;;;;;;;;========;';;;'@@@$$$$$$$'***''''''**',,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;;''@@@@@@@@@@'*********',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;;'**'''''''''''''''''''',,,,,,,,,,,,,,,,,,," +";;,,,,,,,,;;;;;;;;,,,,'**','*',,..,.**','**',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,''',,,'',,,,.,''',,''',,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,"; + +const char frame10[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$-$$$$@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$$''$-$$@','',,,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$$$$'**'$$$@''**',,,,,,,,,,,,,,,,,," +"+++++++++++++++++++++++'@$$$$$-$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'''++'@$$$$$$$$'***''''****',,,,,,,,,,,,,,,,,," +"##+++++++########'**''''@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"#################'****''@$$$$$$-'*************',,,,,,,,,,,,,,,,," +"##################''''*'@$-$$$$$'***.'****.'**',,,,,,,,,,,,,,,,," +"==#######========####'''@$$$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"======================='@@$$$-$$'*%%********%%',,,,,,,,,,,,,,,,," +";;=======;;;;;;;;=====''@@@$$$$$$'***''''''**',,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;;''''@@@@@@@@@'*********',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;'***'''''''''''''''''''',,,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,,;;;'**'.'**..,,,,'**''**',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,''',,,'',,,,,,,''',''',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +".,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char frame11[] = +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +">>,,,,,,,>>>>>>>>,,,,,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,," +">>>>>>>>>>>>>>>>>>>>>>>>'@@@@@@@@@@@@@@@',,,,,,,,,,,,,,,,,,,,,,," +"&&>>>>>>>&&&&&&&&>>>>>>'@@@$$$$$$$$$$$@@@',,,,,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@@$$$$$-$$''$$$@@','',,,,,,,,,,,,,,,,,,," +"&&&&&&&&&&&&&&&&&&&&&&&'@$$-$$$$$'**'-$$@''**',,,,,,,,,,,,,,,,,," +"++&&&&&&&++++++++&&&&&&'@$$$$$$$$'***$$$@'***',,,,,,,,,,,,,,,,,," +"+++++++++++++++++++'+++'@$$$$$-$$'***''''****',,,,,,,,,,,,,,,,,," +"++++++++++++++++++'*'++'@$$$$$$$$'***********',,,,,,,,,,,,,,,,,," +"##+++++++########+'*''''@$$$$$$$'*************',,,,,,,,,,,,,,,,," +"###################****'@$$$$$$-'***.'****.'**',,,,,,,,,,,,,,,,," +"###################''**'@$-$$$$$'***''**'*''**',,,,,,,,,,,,,,,,," +"==#######========####'''@$$$$$$$'*%%********%%',,,,,,,,,,,,,,,,," +"======================='@@$$$-$$$'***''''''**',,,,,,,,,,,,,,,,,," +";;=======;;;;;;;;=.===''@@@$$$$$$$'*********',,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;.'*''@@@@@@@@@@''''''''',,,,,,,,,,,,,,,,,,,," +";;;;;;;;;;;;;;;;;;;;'***''''''''''''''''*',,,,,,,,,,,,,,,,,,,,,," +",,;;;;;;;,,,,,,,.;;;'**','**,,,,,,'**''**',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,''',,''',,,,,,''',,''',,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; + +const char * frames[] = { + frame0, + frame1, + frame2, + frame3, + frame4, + frame5, + frame6, + frame7, + frame8, + frame9, + frame10, + frame11, + NULL +}; + +#define FRAME_WIDTH 64 +#define FRAME_HEIGHT 64 + +#endif diff --git a/Cerbios Bios/older versions/bios.bin.txt b/Cerbios Bios/older versions/bios.bin.txt new file mode 100644 index 0000000..518411a --- /dev/null +++ b/Cerbios Bios/older versions/bios.bin.txt @@ -0,0 +1,81 @@ +========================================================================= + + \\!// + (o o) +----------------------oOOo-(_)-oOOo------------------------------ + + Bios.bin File Overview + +========================================================================= + +First of, check that this info file is for the bios.bin you +like to flash. To do so simply check the MD5 of the bios.bin +with the one below. + +Bios MD5 Checksum ........ : eb8effda7e26ae6bf9d1d33614aacf0a + +------------------------------------------------------------------------- + +This bios.bin here is to be used by Raincoat (if still someone used that). + +How ever its just a 256kb version which probably should serv most needs +but let me tell you that you cant flash this to a 1024kb TSOP with raincoat. +Raincoat aint resize bios files like EvoX or XBlast do so don't do shit. ;) + +If you unsure just ask for help, no one will blame you for that. :) + +------------------------------------------------------------------------- + +Bios Name ................ : Cerbios +File Name ................ : bios.bin +Version .................. : 2.4.2 beta +Release Date ............. : 18 Aug. 2024 +Size ..................... : 256kb + +Retail Flag .............. : True +Degug Flag ............... : False + +Hardcoded ................ : True +Uses Config .ini ......... : True +BFM Bios ................. : False +No DVD *¹ ................ : True +UDMA Mode ................ : 2 +Force 480p ............... : False +VGA ...................... : False +RTC Enable ............... : False +Block Dashupdate ......... : False +AV Check ................. : True +Fan Speed ................ : Auto +Intro .................... : True + +Overclock FSB ............ : False +Overclock NVCLK .......... : False + +------------------------------------------------------------------------- + +Hardcoded Dash Paths +Dash Path 1 .............. : C:\evoxdash.xbe +Dash Path 2 .............. : E:\evoxdash.xbe +Dash Path 3 .............. : E:\Dash\UnleashX\default.xbe + +Cerbios.ini Dash Paths +Dash Path 1 .............. : C:\evoxdash.xbe +Dash Path 2 .............. : E:\evoxdash.xbe +Dash Path 3 .............. : E:\Dash\UnleashX\default.xbe + +------------------------------------------------------------------------- + +*¹ This disables only the check if there is a working DVD drive + present. So in case you dont have a working drive your XBox + will still boot to your custom dash. + And in case you have a NoDVD bios flashed and you have a + working drive with a working disc in your drive, the XBox will + still boot the disc even with a NoDVD bios flashed to your + ModChip/TSOP. :) + +========================================================================= +========================================================================= + +PEACE! + +========================================================================= diff --git a/Cerbios Bios/older versions/bootanim.ini b/Cerbios Bios/older versions/bootanim.ini new file mode 100644 index 0000000..6820c87 --- /dev/null +++ b/Cerbios Bios/older versions/bootanim.ini @@ -0,0 +1,22 @@ +;Render Xbox Logo +XSplitRender = true + +;Render Xbox Text +TextRender = true + +;Background Color +BackgroundColor = #7477FF + +;Foreground Color (Text & Logo) +ForegroundColor = #FFFFFF + +;Animation Times (Frames) +Stable = 60 +BackgroundFadeIn = 30 +BackgroundHold = 30 +BackgroundFadeOut = 30 +ForegroundFadeIn = 30 +ForegroundHold = 30 +ForegroundFadeOut = 30 +BarnDoor = 20 +XSplit = 20 diff --git a/Cerbios Bios/older versions/bootanim.xmv b/Cerbios Bios/older versions/bootanim.xmv new file mode 100644 index 0000000..ce3c80d Binary files /dev/null and b/Cerbios Bios/older versions/bootanim.xmv differ diff --git a/Cerbios Bios/older versions/cerbios.ini b/Cerbios Bios/older versions/cerbios.ini new file mode 100644 index 0000000..2d0105d --- /dev/null +++ b/Cerbios Bios/older versions/cerbios.ini @@ -0,0 +1,48 @@ +; Cerbios Config + +; Check For AV Pack +AVCheck = True + +; LED Ring Color, G = Green, R = Red, A = Amber, O = Off +FrontLed = GGGG + +; Fan Speed 0 = Default, 10-100 = Manual Control, Supports increments of 2's +FanSpeed = 20 + +; Drive Setup +; 0 = HDD & DVD, 1 = HDD & No DVD (Legacy Mode), 2 = HDD & No DVD (Modern Mode), 3 = Dual HDD +DriveSetup = 1 + +; Set Master Drive UDMA mode 0-6 on cold-boot +UdmaModeMaster = 2 + +; Set Slave Drive UDMA mode 0-6 on cold-boot (if enabled by DriveSetup = 3) +UdmaModeSlave = 2 + +; Enables Automatic Time Sync With Optional RTC Hardware Connected to SMBus +RtcEnable = False + +; Forces AV Modes That Would Normally Be Rendered At 480i to 480p. Requires 480p Set In MS Dash And Component Cables +Force480p = False + +; Forces VGA Modes For Component Cables Or Custom VGA Cables Using Mode(2+3) for VGA Displays Only, This Enables Force480p By Default & Sets Console To NTSC. +ForceVGA = False + +; Load XDK Launcher/XBDM if it exists (Debug Bios Only) +Debug = False + +; Blocks Games From Updating The Original Xbox Dashboard, Useful for softmods. +BlockDashUpdate = False + +; CD Paths (always falls back to D:\default.xbe) +CdPath1 = D:\Evolutionx\evoxdash.xbe +CdPath2 = D:\Avalaunch\avalaunch.xbe +CdPath3 = D:\UnleashX\unleashx.xbe + +; Dash Paths (always falls back to C:\xboxdash.xbe) +DashPath1 = C:\evoxdash.xbe +DashPath2 = E:\evoxdash.xbe +DashPath3 = E:\Dash\UnleashX\default.xbe + +; Boot Animation Path (always falls back to C:\BootAnims\Xbox\bootanim.xbe) +BootAnimPath = C:\BootAnims\Xbox\bootanim.xbe \ No newline at end of file diff --git a/Cerbios Bios/older versions/default.vcproj b/Cerbios Bios/older versions/default.vcproj new file mode 100644 index 0000000..aa9001d --- /dev/null +++ b/Cerbios Bios/older versions/default.vcproj @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Cerbios Bios/older versions/desktop.ini b/Cerbios Bios/older versions/desktop.ini new file mode 100644 index 0000000..0e3b4ee --- /dev/null +++ b/Cerbios Bios/older versions/desktop.ini @@ -0,0 +1,45 @@ +[LocalizedFileNames] +Cerbios V2.1.0 Beta.7z=@Cerbios V2.1.0 Beta.7z,0 +Cerbios V2.2.0 Beta.7z=@Cerbios V2.2.0 Beta.7z,0 +Cerbios V2.2.1 Beta.7z=@Cerbios V2.2.1 Beta.7z,0 +Cerbios V2.3.0 Beta.7z=@Cerbios V2.3.0 Beta.7z,0 +Cerbios Alpha V1.01.7z=@Cerbios Alpha V1.01.7z,0 +Cerbios Alpha V1.02.7z=@Cerbios Alpha V1.02.7z,0 +Cerbios Beta V2.0.0.7z=@Cerbios Beta V2.0.0.7z,0 +Cerbios Beta V2.0.1.7z=@Cerbios Beta V2.0.1.7z,0 +Cerbios V2.0.2.7z=@Cerbios V2.0.2.7z,0 +Cerbios V2.0.3R.7z=@Cerbios V2.0.3R.7z,0 +Cerbios Alpha V1.zip=@Cerbios Alpha V1.zip,0 +Cerbios V2.3.0 Beta UDMA6.zip=@Cerbios V2.3.0 Beta UDMA6.zip,0 +Cerbios V2.3.0 Beta UDMA5.zip=@Cerbios V2.3.0 Beta UDMA5.zip,0 +Cerbios V2.3.0 Beta UDMA4.zip=@Cerbios V2.3.0 Beta UDMA4.zip,0 +Cerbios V2.3.0 Beta.zip=@Cerbios V2.3.0 Beta.zip,0 +Cerbios V2.2.1 Beta UDMA5.zip=@Cerbios V2.2.1 Beta UDMA5.zip,0 +Cerbios V2.2.1 Beta UDMA4.zip=@Cerbios V2.2.1 Beta UDMA4.zip,0 +Cerbios V2.2.1 Beta.zip=@Cerbios V2.2.1 Beta.zip,0 +Cerbios V2.2.0 Beta UDMA5.zip=@Cerbios V2.2.0 Beta UDMA5.zip,0 +Cerbios V2.2.0 Beta UDMA4.zip=@Cerbios V2.2.0 Beta UDMA4.zip,0 +Cerbios V2.2.0 Beta.zip=@Cerbios V2.2.0 Beta.zip,0 +Cerbios V2.1.0 Beta UDMA5.zip=@Cerbios V2.1.0 Beta UDMA5.zip,0 +Cerbios V2.1.0 Beta.zip=@Cerbios V2.1.0 Beta.zip,0 +Cerbios V2.0.3R UDMA5.zip=@Cerbios V2.0.3R UDMA5.zip,0 +Cerbios V2.0.3R.zip=@Cerbios V2.0.3R.zip,0 +Cerbios V2.0.2R Retail UDMA5.zip=@Cerbios V2.0.2R Retail UDMA5.zip,0 +Cerbios V2.0.2R Retail.zip=@Cerbios V2.0.2R Retail.zip,0 +Cerbios V2.0.2R Debug UDMA5.zip=@Cerbios V2.0.2R Debug UDMA5.zip,0 +Cerbios V2.0.2R Debug.zip=@Cerbios V2.0.2R Debug.zip,0 +Cerbios V2.0.2 Retail UDMA5.zip=@Cerbios V2.0.2 Retail UDMA5.zip,0 +Cerbios V2.0.2 Retail.zip=@Cerbios V2.0.2 Retail.zip,0 +Cerbios V2.0.2 Debug UDMA5.zip=@Cerbios V2.0.2 Debug UDMA5.zip,0 +Cerbios V2.0.2 Debug.zip=@Cerbios V2.0.2 Debug.zip,0 +Cerbios V2.0.1 Beta Retail.zip=@Cerbios V2.0.1 Beta Retail.zip,0 +Cerbios V2.0.1 Beta Debug.zip=@Cerbios V2.0.1 Beta Debug.zip,0 +Cerbios V2.0.0 Beta Retail.zip=@Cerbios V2.0.0 Beta Retail.zip,0 +Cerbios V2.0.0 Beta Debug.zip=@Cerbios V2.0.0 Beta Debug.zip,0 +Cerbios V1.0.2 Alpha.zip=@Cerbios V1.0.2 Alpha.zip,0 +Cerbios V1.0.1 Alpha.zip=@Cerbios V1.0.1 Alpha.zip,0 +Cerbios V1.0.0 Alpha.zip=@Cerbios V1.0.0 Alpha.zip,0 +Cerbios.U6.256kb.zip=@Cerbios.U6.256kb.zip,0 +Cerbios.U2.256kb.zip=@Cerbios.U2.256kb.zip,0 +Cerbios.U4.256kb.zip=@Cerbios.U4.256kb.zip,0 +Cerbios.U5.256kb.zip=@Cerbios.U5.256kb.zip,0 diff --git a/Cerbios Bios/older versions/dsstdfx.bin b/Cerbios Bios/older versions/dsstdfx.bin new file mode 100644 index 0000000..0308a0f Binary files /dev/null and b/Cerbios Bios/older versions/dsstdfx.bin differ diff --git a/Cerbios Bios/older versions/dsstdfx_bin.h b/Cerbios Bios/older versions/dsstdfx_bin.h new file mode 100644 index 0000000..b692ac8 --- /dev/null +++ b/Cerbios Bios/older versions/dsstdfx_bin.h @@ -0,0 +1,1167 @@ +const unsigned char dsstdfx_bin[] = { +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +0x00, 0x00, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00, 0xa8, 0x27, 0x00, 0x00, 0xe6, 0x07, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x44, 0x23, 0xef, 0xaf, 0x6a, 0xa8, 0x9f, +0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0x9b, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, +0xb7, 0xcc, 0xd2, 0x75, 0x6c, 0x58, 0x5e, 0xb6, 0xa8, 0x01, 0xf8, 0x0b, 0x05, 0xf5, 0x70, 0x3d, +0xd9, 0x27, 0x05, 0x12, 0xe2, 0x9e, 0x88, 0x8d, 0xe9, 0xbe, 0xcf, 0x75, 0xfe, 0x3d, 0x01, 0x86, +0xbc, 0xf5, 0x6e, 0x46, 0xcf, 0x69, 0xbf, 0x21, 0x15, 0x58, 0x40, 0x2c, 0x60, 0x1a, 0x80, 0xc3, +0x66, 0xd1, 0xb0, 0x6a, 0x72, 0x8d, 0xb9, 0x27, 0x84, 0x24, 0xfe, 0x7c, 0xe8, 0x10, 0x54, 0x56, +0x6c, 0x89, 0x46, 0xb1, 0x89, 0xbb, 0x90, 0x0b, 0xfa, 0xe2, 0x3f, 0x4d, 0x90, 0x92, 0x9c, 0xa1, +0xd2, 0x49, 0x94, 0x54, 0x5b, 0x15, 0x1b, 0x50, 0xd9, 0x28, 0x8c, 0x51, 0x62, 0xaf, 0xc0, 0x81, +0x95, 0x34, 0x6e, 0xd6, 0x1b, 0x2c, 0x41, 0x38, 0xf1, 0x26, 0x05, 0x92, 0x01, 0xc3, 0x14, 0x55, +0x5f, 0xe9, 0x6c, 0xc1, 0x0a, 0x77, 0x32, 0xda, 0x0d, 0x44, 0x23, 0xef, 0x8d, 0x6a, 0xa8, 0x9f, +0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, +0xb7, 0xcc, 0xd2, 0x75, 0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, +0x14, 0x27, 0x05, 0x12, 0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, +0xea, 0xf5, 0x6e, 0x46, 0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, +0xb0, 0x84, 0xb6, 0x6a, 0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, +0xf5, 0xa9, 0x6c, 0xb1, 0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, +0x92, 0x3c, 0x72, 0x54, 0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, +0x15, 0x34, 0x6e, 0xd6, 0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, +0x1b, 0xe9, 0x4c, 0xc1, 0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, +0xdd, 0xa9, 0x6b, 0x41, 0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, +0x74, 0xeb, 0x48, 0x42, 0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, +0xd6, 0xb9, 0x4e, 0x34, 0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, +0xad, 0xa0, 0xe8, 0x73, 0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, +0xa0, 0xe5, 0x66, 0x43, 0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, +0x87, 0xb1, 0x33, 0xa5, 0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, +0x85, 0xd5, 0xbe, 0x7e, 0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, +0x9d, 0x8e, 0xb9, 0xe8, 0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, +0xbc, 0x79, 0xb4, 0x65, 0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, +0x63, 0x29, 0x65, 0x3c, 0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, +0x1c, 0xc8, 0x5c, 0x39, 0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, +0x73, 0x3a, 0x41, 0x30, 0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, +0xda, 0xf5, 0xe0, 0x83, 0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, +0x5b, 0x6f, 0x29, 0x20, 0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, +0xb6, 0x04, 0xf6, 0x8a, 0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, +0xf8, 0xdc, 0x7f, 0xd1, 0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, +0xf7, 0xef, 0x88, 0x4d, 0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, +0x63, 0xed, 0xea, 0x00, 0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, +0x76, 0x0d, 0x7a, 0xca, 0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, +0xc1, 0x52, 0x9f, 0x5d, 0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, +0xdb, 0x0a, 0x1c, 0x19, 0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, +0xb3, 0x83, 0x37, 0x2b, 0xd5, 0x5d, 0xe1, 0x73, 0x0d, 0x44, 0x23, 0xef, 0x04, 0x6a, 0xa8, 0x9f, +0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0x9b, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, +0xb7, 0xcc, 0xd2, 0x75, 0x6c, 0x58, 0x5e, 0xb6, 0xa8, 0x01, 0xf8, 0x0b, 0x05, 0xf5, 0x70, 0x3d, +0xd9, 0x27, 0x05, 0x12, 0xe2, 0x9e, 0x88, 0x8d, 0xe9, 0xbe, 0xcf, 0x75, 0xfe, 0x3d, 0x01, 0x86, +0xbc, 0xf5, 0x6e, 0x46, 0xcf, 0x69, 0xbf, 0x21, 0x15, 0x58, 0x40, 0x2c, 0x60, 0x1a, 0x80, 0xc3, +0x66, 0xd1, 0xb0, 0x6a, 0x72, 0x8d, 0xb9, 0x27, 0x84, 0x24, 0xfe, 0x7c, 0xe8, 0x10, 0x54, 0x56, +0x6c, 0x89, 0x46, 0xb1, 0x89, 0xbb, 0x90, 0x0b, 0xfa, 0xe2, 0x3f, 0x4d, 0x90, 0x92, 0x9c, 0xa1, +0xd2, 0x49, 0x94, 0x54, 0x5b, 0x15, 0x1b, 0x50, 0xd9, 0x28, 0x8c, 0x51, 0x62, 0xaf, 0xc0, 0x81, +0x95, 0x34, 0x6e, 0xd6, 0x1b, 0x2c, 0x41, 0x38, 0xf1, 0x26, 0x05, 0x92, 0x01, 0xc3, 0x14, 0x55, +0x5f, 0xe9, 0x6c, 0xc1, 0x0a, 0x77, 0x32, 0xda, 0x0d, 0x44, 0x23, 0xef, 0x32, 0x6b, 0xa8, 0x9f, +0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0xd7, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, +0xb7, 0xcc, 0xd2, 0x75, 0xec, 0x7c, 0x17, 0xb6, 0xd6, 0x01, 0xf8, 0x0b, 0x45, 0x87, 0x47, 0x3d, +0xaf, 0x27, 0x25, 0x12, 0xc1, 0xf3, 0xa5, 0x8d, 0xb7, 0x7a, 0xd4, 0x75, 0x6c, 0xd9, 0xda, 0x86, +0xd4, 0xf7, 0xa6, 0x46, 0x63, 0x92, 0x84, 0x21, 0x91, 0x99, 0x44, 0x2c, 0x50, 0x52, 0x3c, 0xc3, +0x26, 0x89, 0xbc, 0x6a, 0x6f, 0x8d, 0xb9, 0x27, 0x0a, 0x05, 0xe3, 0x7c, 0xe8, 0xff, 0x56, 0x56, +0x9c, 0xa9, 0x6c, 0xb1, 0x12, 0x7a, 0x91, 0x0b, 0xfa, 0x52, 0x2d, 0x4d, 0x60, 0x1e, 0x00, 0xa1, +0xb4, 0x3c, 0x92, 0x54, 0xdc, 0x3a, 0x3d, 0x50, 0x9d, 0x28, 0xac, 0x51, 0x62, 0xc3, 0xdd, 0x81, +0x55, 0xa0, 0x52, 0xd6, 0x73, 0x33, 0x2d, 0x38, 0xf1, 0x5e, 0xc9, 0x92, 0x01, 0xef, 0x58, 0x55, +0xb9, 0xa9, 0xa1, 0xc1, 0x0a, 0x9f, 0x6e, 0xda, 0x22, 0x9a, 0x55, 0x58, 0xb6, 0x92, 0x5d, 0x50, +0x5d, 0x90, 0xa8, 0x41, 0x4a, 0xab, 0xbe, 0x02, 0xf6, 0x3f, 0xdf, 0x6e, 0x6f, 0x52, 0x34, 0x47, +0x74, 0xf1, 0xaa, 0x42, 0x7b, 0x21, 0x46, 0x12, 0xfe, 0xe0, 0x80, 0x2d, 0x50, 0x26, 0xfc, 0xa3, +0xae, 0xbc, 0x52, 0x34, 0x4c, 0xf2, 0xa1, 0xa2, 0x06, 0xfc, 0x92, 0x44, 0xe4, 0x84, 0x7c, 0x31, +0xed, 0x34, 0x0c, 0x73, 0x99, 0x88, 0x5a, 0x57, 0x5c, 0x91, 0xa8, 0x41, 0xca, 0x6b, 0x1e, 0x32, +0x39, 0x9b, 0x6c, 0x43, 0xc9, 0xff, 0x1e, 0xb2, 0xae, 0xd4, 0x3c, 0xcb, 0xed, 0x6e, 0xcf, 0x89, +0xb9, 0xc2, 0x6f, 0xa5, 0x94, 0x08, 0xcd, 0x8b, 0xd9, 0xa7, 0xe4, 0x75, 0x6c, 0x50, 0xb7, 0x06, +0x94, 0x01, 0x22, 0x7e, 0x37, 0x9d, 0xbd, 0x66, 0xe4, 0x55, 0x46, 0xd0, 0xa2, 0x63, 0x29, 0xd9, +0xc7, 0x8f, 0xb9, 0xe8, 0xc2, 0x78, 0xab, 0x9f, 0x42, 0x3b, 0xb5, 0x64, 0xf2, 0xcc, 0x99, 0x97, +0xfe, 0x3d, 0xba, 0x65, 0xf0, 0x19, 0x7b, 0x47, 0xf4, 0x55, 0x21, 0x22, 0x15, 0x5e, 0xa6, 0x1c, +0xff, 0xef, 0x66, 0x3c, 0x9e, 0xd7, 0x22, 0x52, 0x1e, 0x18, 0x7f, 0x51, 0xbc, 0xcf, 0x1c, 0xd1, +0xad, 0xb8, 0x56, 0x39, 0x4b, 0x19, 0x83, 0xc2, 0xb6, 0xbc, 0x3a, 0xca, 0x25, 0xac, 0x71, 0x59, +0xdd, 0xae, 0x49, 0x30, 0xe2, 0x8b, 0xbe, 0xa3, 0xc2, 0x7c, 0xb2, 0x64, 0xf4, 0x6c, 0x14, 0x37, +0x0c, 0xe1, 0xc8, 0x83, 0x69, 0x4f, 0xa4, 0x86, 0xc8, 0xf5, 0xee, 0x06, 0xb3, 0x74, 0x2b, 0x5d, +0x64, 0x6f, 0x29, 0x20, 0x3a, 0xb7, 0x2b, 0xbc, 0x2f, 0x26, 0xab, 0x3a, 0xec, 0x19, 0x63, 0xc2, +0xb6, 0x3d, 0xcc, 0x8a, 0xf9, 0xc5, 0x95, 0x95, 0x4b, 0x09, 0x6e, 0xc5, 0x9f, 0xb4, 0x0d, 0x49, +0xd9, 0xd2, 0x47, 0xd1, 0xa2, 0x92, 0x22, 0x29, 0x29, 0x62, 0x07, 0xa3, 0xf9, 0x96, 0xc8, 0x14, +0xff, 0x19, 0x84, 0x4d, 0xd0, 0x02, 0x02, 0x01, 0x12, 0x14, 0xfe, 0x8e, 0x7f, 0x5a, 0x78, 0x65, +0x63, 0x14, 0x18, 0x00, 0x6a, 0x67, 0x8a, 0x1e, 0x80, 0xa5, 0x8f, 0xbc, 0x14, 0xf6, 0x72, 0xba, +0x22, 0xf6, 0x7b, 0xca, 0x21, 0x75, 0x2d, 0x59, 0x61, 0x8e, 0xd7, 0xa0, 0xc2, 0xdd, 0xa2, 0x14, +0x7b, 0x21, 0x4e, 0x5d, 0xe4, 0xce, 0x1e, 0x50, 0x6d, 0x18, 0x86, 0xd1, 0xa4, 0xb3, 0x0c, 0xc9, +0x19, 0x72, 0xd6, 0x19, 0x3e, 0x40, 0x79, 0x5c, 0xa2, 0x6f, 0x09, 0x20, 0x06, 0x3d, 0x52, 0xac, +0xa7, 0xba, 0x89, 0x2b, 0xc9, 0x5d, 0xe1, 0x73, 0xce, 0x40, 0x1b, 0x17, 0x40, 0xe0, 0x67, 0x3c, +0x6b, 0xe7, 0xe5, 0x82, 0x69, 0x87, 0x1c, 0x66, 0x5a, 0x38, 0x84, 0xd0, 0x9c, 0x35, 0x4c, 0xa9, +0x33, 0x57, 0xed, 0x0b, 0xc8, 0xe4, 0x65, 0xbd, 0xaf, 0x53, 0x8b, 0xaa, 0x96, 0xbd, 0x11, 0xcb, +0x24, 0x5f, 0xf1, 0x89, 0x88, 0x84, 0x35, 0x65, 0x57, 0x6d, 0x2a, 0x20, 0xba, 0x13, 0x58, 0xcc, +0x16, 0x94, 0xbe, 0x59, 0x60, 0xe4, 0x55, 0xb0, 0xaf, 0x02, 0x78, 0x4b, 0x65, 0x15, 0x5b, 0xc1, +0xa7, 0x91, 0x50, 0x3a, 0xc0, 0x18, 0x83, 0xc2, 0x28, 0xd1, 0xb0, 0xea, 0x57, 0xac, 0x89, 0x0f, +0x04, 0x1b, 0x83, 0x4d, 0x60, 0xc2, 0x19, 0xd1, 0x5e, 0x08, 0xfc, 0x89, 0x06, 0x95, 0xc0, 0x25, +0x86, 0x5d, 0x22, 0x1c, 0xc4, 0x1e, 0xc6, 0x6c, 0x95, 0xe6, 0xb5, 0x67, 0x99, 0x0d, 0xf9, 0x87, +0x4f, 0x35, 0x6d, 0xc6, 0xdd, 0xa4, 0x88, 0x89, 0x1e, 0x3a, 0x13, 0x95, 0x42, 0xf5, 0x5d, 0xb4, +0x82, 0x00, 0xf8, 0x8b, 0x82, 0x85, 0x14, 0x55, 0xa5, 0x19, 0x7f, 0x51, 0x81, 0x13, 0xfc, 0x01, +0x52, 0x54, 0xfd, 0x0e, 0x3f, 0x22, 0x44, 0xad, 0xf1, 0x73, 0x34, 0xab, 0xa6, 0x7d, 0xb1, 0x9b, +0x85, 0xbe, 0x32, 0xa4, 0x14, 0xfd, 0x71, 0x3b, 0x28, 0xd6, 0xe2, 0x02, 0x08, 0xa7, 0x0a, 0x4e, +0xa8, 0xfe, 0x21, 0x21, 0x38, 0xe1, 0x66, 0xbc, 0xdf, 0x97, 0x4f, 0xba, 0x8c, 0xb9, 0x93, 0x0a, +0xc3, 0x8f, 0xe9, 0xfd, 0x27, 0xe8, 0x6a, 0xbe, 0xf6, 0x12, 0x0f, 0x1a, 0x3d, 0x5f, 0x27, 0x5c, +0x6f, 0x9f, 0x47, 0x30, 0x54, 0x1b, 0x00, 0x03, 0x96, 0x71, 0x7d, 0x5e, 0x57, 0x2e, 0x02, 0x20, +0xe5, 0x5c, 0x02, 0x1c, 0xb8, 0x76, 0xd8, 0x0c, 0x4f, 0xdb, 0xc3, 0x7d, 0x75, 0xfb, 0xe0, 0x76, +0xcb, 0xf3, 0x70, 0x47, 0x19, 0xe1, 0x57, 0xb1, 0x00, 0xc1, 0x58, 0x3b, 0xcd, 0xc9, 0x42, 0xe2, +0x18, 0xd9, 0xb4, 0xe8, 0xd7, 0x6c, 0x29, 0xdf, 0x9c, 0x0f, 0xf9, 0x88, 0xc2, 0x30, 0xff, 0x85, +0xd9, 0xb4, 0x4e, 0x36, 0x6b, 0x1c, 0x97, 0x12, 0x96, 0x58, 0xa4, 0xdd, 0xbb, 0x32, 0xaa, 0x98, +0xa6, 0x7e, 0xb1, 0xe4, 0x07, 0x68, 0xcd, 0xef, 0xba, 0x93, 0x3f, 0x2f, 0x80, 0x16, 0x14, 0x53, +0x13, 0x28, 0x8c, 0xd1, 0x2f, 0x6f, 0x48, 0xa9, 0x04, 0x02, 0x77, 0x4b, 0x17, 0xe0, 0xd7, 0x71, +0x4b, 0x32, 0x10, 0x97, 0x7b, 0x03, 0x56, 0xb4, 0x31, 0xd4, 0xae, 0xeb, 0xb3, 0x2b, 0xc9, 0xef, +0xd6, 0x06, 0x25, 0x9f, 0x7a, 0x80, 0xb6, 0x24, 0x3f, 0x48, 0x8c, 0x4c, 0x64, 0x94, 0xbc, 0xa1, +0x85, 0xbc, 0x32, 0xb4, 0x12, 0x0d, 0x49, 0x2a, 0xe7, 0xa0, 0x47, 0x33, 0x11, 0xcb, 0x95, 0x13, +0x4a, 0x58, 0xa4, 0x5d, 0x58, 0x7c, 0x5c, 0x40, 0x35, 0x64, 0x85, 0x52, 0xa3, 0x53, 0x5c, 0xb1, +0xaf, 0x95, 0x4e, 0xbb, 0x8a, 0xb7, 0x13, 0x4a, 0x1a, 0x6a, 0x0c, 0x91, 0x13, 0x03, 0x74, 0x45, +0x69, 0xb0, 0x40, 0xb2, 0x10, 0xfd, 0xf0, 0xfb, 0x52, 0xd6, 0xbe, 0x6e, 0x11, 0x0a, 0xf8, 0x07, +0x8a, 0x40, 0x88, 0x4e, 0xe1, 0x54, 0xdc, 0x71, 0x0d, 0x40, 0x1b, 0x97, 0x3d, 0x80, 0xb7, 0x24, +0x83, 0xb3, 0x04, 0x9c, 0xb8, 0xbe, 0xb7, 0x24, 0x68, 0x1d, 0x82, 0xcc, 0x1e, 0xff, 0x46, 0xa9, +0x28, 0xc0, 0x57, 0xbb, 0xcd, 0x39, 0x72, 0x3a, 0xf5, 0x66, 0xa5, 0xe2, 0x23, 0x02, 0xc4, 0x68, +0xc7, 0x70, 0x2f, 0xa7, 0xd3, 0xbc, 0xb0, 0x1b, 0x51, 0x01, 0x78, 0xfc, 0x28, 0x36, 0x0b, 0xde, +0xe4, 0x9a, 0xd3, 0xf8, 0x73, 0x69, 0xab, 0x1e, 0x40, 0xdf, 0x42, 0xac, 0x81, 0x7b, 0xb0, 0x9b, +0x42, 0x8f, 0xf2, 0x94, 0x82, 0x75, 0x1d, 0xd4, 0x98, 0x8b, 0xbc, 0xe9, 0x46, 0x25, 0x47, 0xaf, +0x2c, 0x43, 0x17, 0x1b, 0xbd, 0xf9, 0x59, 0xcc, 0x57, 0x4b, 0x7b, 0xd9, 0x1e, 0x28, 0x41, 0xb8, +0x71, 0x76, 0xb2, 0xea, 0x0d, 0x6d, 0x29, 0xdf, 0xa0, 0x21, 0x5b, 0xa8, 0xd6, 0x3d, 0x70, 0x3b, +0x61, 0x67, 0x25, 0x22, 0xc3, 0x52, 0x6c, 0x3c, 0x72, 0x65, 0xa5, 0x62, 0x99, 0x4f, 0x7f, 0xc0, +0xde, 0xc4, 0xd6, 0xfa, 0x2f, 0x1c, 0xd1, 0x6e, 0x4a, 0xb1, 0x4f, 0x37, 0xcb, 0xc4, 0x42, 0xe2, +0xa6, 0x3c, 0xd9, 0x68, 0xe8, 0x38, 0x03, 0x87, 0x4f, 0xb7, 0x4e, 0x36, 0x11, 0x6d, 0x19, 0x52, +0xb6, 0xa8, 0x4c, 0xb1, 0x12, 0xa3, 0x7e, 0xdb, 0xa2, 0xee, 0x87, 0x28, 0x56, 0xa9, 0xaf, 0x83, +0xcf, 0xf4, 0x6e, 0x46, 0xa3, 0x04, 0xf8, 0x01, 0x81, 0x54, 0x1e, 0x9e, 0xf7, 0xac, 0x74, 0x34, +0xab, 0xa1, 0x67, 0xc3, 0x5d, 0x77, 0x32, 0xda, 0x1c, 0x5b, 0x73, 0x48, 0xe1, 0x53, 0xdd, 0x71, +0x8d, 0x30, 0x6f, 0x47, 0xe0, 0x94, 0x3d, 0xe1, 0x17, 0xd9, 0x34, 0x28, 0xd3, 0xdb, 0x21, 0x53, +0x9e, 0x28, 0xab, 0xe1, 0xd1, 0x6f, 0x2e, 0xd8, 0x9b, 0x9b, 0x53, 0x38, 0x4c, 0x17, 0x03, 0x82, +0x56, 0xa0, 0xe4, 0x16, 0x3a, 0xe0, 0x67, 0x3c, 0x2f, 0x17, 0x02, 0x92, 0x00, 0xc3, 0x94, 0x95, +0x4e, 0x39, 0x74, 0xd5, 0xa2, 0xc5, 0xa5, 0x98, 0x45, 0xbc, 0xd1, 0xf4, 0x2c, 0xdc, 0xb5, 0x7e, +0x50, 0x37, 0xcc, 0x56, 0x61, 0xe5, 0xd5, 0xf0, 0x0d, 0x92, 0x40, 0x2f, 0xcf, 0xe1, 0xf6, 0xf3, +0x90, 0x45, 0x86, 0xcf, 0x20, 0xf4, 0x6c, 0xb9, 0x63, 0x08, 0xfa, 0x0a, 0x75, 0x10, 0x4f, 0xad, +0xac, 0x01, 0x77, 0x4b, 0x65, 0x4d, 0xf3, 0xa1, 0x55, 0x69, 0x7c, 0xc4, 0x1f, 0xf2, 0x6d, 0x39, +0x35, 0x66, 0x86, 0x52, 0x21, 0x13, 0xfc, 0x81, 0x52, 0xb4, 0xad, 0x66, 0x86, 0x65, 0x99, 0xa7, +0xc4, 0xb8, 0x91, 0x44, 0x94, 0xa1, 0xb7, 0xa1, 0x44, 0x3e, 0x92, 0x54, 0x8b, 0xa5, 0x35, 0xe0, +0xa3, 0x0e, 0xfa, 0x08, 0xc6, 0xf5, 0x70, 0xbd, 0x41, 0x44, 0x15, 0x1a, 0xbd, 0x15, 0xd9, 0x8c, +0x37, 0x3b, 0x94, 0xd5, 0x22, 0x05, 0xc5, 0x68, 0xc9, 0xf0, 0xef, 0x07, 0x84, 0x26, 0x48, 0xad, +0x66, 0x49, 0x1c, 0x1b, 0xbd, 0xa1, 0xb1, 0x8c, 0x45, 0x6e, 0xf9, 0x85, 0x89, 0x85, 0x35, 0x65, +0x19, 0xb8, 0xc4, 0x70, 0x9c, 0x0a, 0x78, 0x47, 0x86, 0x65, 0x86, 0x62, 0x63, 0xe2, 0x54, 0xb0, +0xff, 0xc1, 0xd8, 0xfb, 0xf2, 0x63, 0x26, 0xde, 0x5e, 0xda, 0xb3, 0xe8, 0x28, 0xeb, 0x69, 0x3f, +0x73, 0xe7, 0xc6, 0x72, 0xaa, 0xdb, 0x1d, 0xd7, 0x36, 0x49, 0x1c, 0x19, 0xbe, 0xca, 0xe5, 0xec, +0xcf, 0x13, 0xa0, 0x5f, 0xba, 0x4e, 0xde, 0xf0, 0x8d, 0x80, 0xff, 0x1f, 0x7f, 0x5e, 0x07, 0xcc, +0x2c, 0x0a, 0x7b, 0xc9, 0xa6, 0x04, 0x2c, 0xc9, 0x5e, 0x4a, 0x7c, 0xc9, 0xd6, 0x34, 0x4d, 0x29, +0x2f, 0x52, 0x24, 0xa3, 0xe9, 0x3f, 0xd6, 0x74, 0xcb, 0xf0, 0x8f, 0x57, 0xe1, 0xa5, 0x35, 0xe0, +0x97, 0x8e, 0xba, 0xe8, 0x46, 0xa7, 0x07, 0xcf, 0x9f, 0x8b, 0x3b, 0xa9, 0x96, 0x1c, 0xdf, 0x0b, +0x7a, 0x22, 0x0e, 0xfd, 0xbc, 0xa6, 0xaa, 0x8e, 0xb8, 0x3d, 0xd4, 0x65, 0xc4, 0xcd, 0xb8, 0xa7, +0x2e, 0xb4, 0xa6, 0xa4, 0x9c, 0x3c, 0x71, 0x2b, 0x6a, 0x1b, 0x5a, 0x63, 0xe5, 0xcf, 0x1e, 0x50, +0x6d, 0x2e, 0x06, 0x11, 0x3f, 0x63, 0xa4, 0x9d, 0xbf, 0x47, 0xed, 0xe4, 0x34, 0xb5, 0x65, 0x5f, +0xe0, 0xbb, 0x37, 0xd0, 0x6b, 0x88, 0x3b, 0xe9, 0x13, 0x87, 0x65, 0x3f, 0x55, 0x98, 0x42, 0xe2, +0x6f, 0x03, 0x75, 0x48, 0x66, 0x45, 0x58, 0x31, 0x61, 0xe0, 0x68, 0xc3, 0x09, 0x27, 0x47, 0xaa, +0xb4, 0x02, 0x77, 0x4b, 0x65, 0xc5, 0x18, 0xd1, 0x92, 0xd6, 0x5d, 0x09, 0xc6, 0xf5, 0x70, 0x3d, +0xf4, 0x25, 0x05, 0x12, 0xbd, 0x23, 0x44, 0x2d, 0x67, 0x93, 0x44, 0xb3, 0xa0, 0xbb, 0x90, 0x0b, +0xfa, 0x6a, 0xa8, 0xdd, 0x6f, 0x0c, 0xf9, 0x48, 0xd9, 0xda, 0xe0, 0x01, 0x9f, 0x69, 0xaa, 0x9e, +0x3c, 0xbf, 0xd1, 0x74, 0xec, 0x22, 0xb9, 0x96, 0xfc, 0x79, 0xd3, 0xf5, 0x64, 0xa9, 0x8b, 0x8e, +0x38, 0x0b, 0x34, 0x35, 0x8c, 0xd8, 0xc2, 0x22, 0x9b, 0xc2, 0xd7, 0x4c, 0x60, 0x43, 0x9d, 0xa1, +0xd5, 0x3a, 0x10, 0x14, 0x3d, 0x60, 0x27, 0x5c, 0x5f, 0x16, 0xa5, 0x40, 0x4a, 0xbf, 0xfe, 0x22, +0xfa, 0x9c, 0x42, 0xac, 0x10, 0x10, 0x92, 0x1b, 0x02, 0x15, 0x22, 0x1c, 0xb8, 0xee, 0x27, 0x4c, +0xd7, 0x4b, 0xf5, 0x71, 0x82, 0xd0, 0x16, 0x57, 0x5d, 0xe9, 0xec, 0x01, 0x2a, 0x2f, 0xb4, 0xfe, +0x10, 0xa7, 0xde, 0x7e, 0xf3, 0xc6, 0x1a, 0xd6, 0x9c, 0x39, 0x8f, 0xd9, 0x12, 0xb0, 0x8f, 0x08, +0x59, 0x0e, 0x60, 0xbd, 0x85, 0x85, 0xb5, 0x2a, 0x0a, 0x83, 0xeb, 0x83, 0x49, 0x69, 0x96, 0x96, +0x1c, 0xda, 0xb0, 0xe5, 0x94, 0xc8, 0xa5, 0x9f, 0x20, 0xda, 0xad, 0x64, 0xf4, 0x8c, 0x35, 0xd7, +0x6c, 0xdc, 0xb2, 0xe9, 0x31, 0x6d, 0xa9, 0x1f, 0x00, 0x6f, 0xa6, 0xdc, 0xbd, 0xcc, 0x19, 0xf8, +0x91, 0xa6, 0xca, 0xee, 0x14, 0x10, 0xff, 0x4f, 0x28, 0xbe, 0x41, 0x31, 0x55, 0x9b, 0x40, 0x63, +0xe6, 0x82, 0xac, 0x50, 0x22, 0x93, 0x9d, 0x11, 0xa3, 0x98, 0xc4, 0x6d, 0xf0, 0x9b, 0x79, 0x37, +0x6c, 0x91, 0x43, 0x33, 0xdf, 0x9a, 0xc0, 0xa3, 0x46, 0x8c, 0xb5, 0xe4, 0x44, 0x2d, 0xc9, 0x6f, +0xf8, 0x26, 0x15, 0x17, 0x38, 0x60, 0xa7, 0x1c, 0xff, 0x71, 0x23, 0x8c, 0x40, 0x02, 0x55, 0xb5, +0xa2, 0xc1, 0xd8, 0x7b, 0xed, 0x18, 0x3a, 0x56, 0x5c, 0x19, 0x7f, 0x51, 0xcc, 0x12, 0x7c, 0xc1, +0xe5, 0x91, 0x50, 0xba, 0x8a, 0xb9, 0x93, 0x0a, 0x7a, 0x6b, 0x01, 0x9d, 0xf8, 0x40, 0xee, 0x74, +0xbb, 0xc1, 0xd2, 0x77, 0x6e, 0x88, 0xbb, 0xa6, 0x44, 0xf5, 0x8e, 0xb4, 0x0c, 0xa1, 0xef, 0x1a, +0x02, 0xee, 0x66, 0x3c, 0x26, 0xd8, 0x22, 0x52, 0xde, 0xd8, 0x5f, 0xc1, 0x4b, 0x85, 0xb5, 0x2a, +0x19, 0xb7, 0xbd, 0xf3, 0x2d, 0xeb, 0x68, 0xbf, 0xa0, 0x43, 0x1b, 0x9a, 0xf7, 0x41, 0x57, 0xb4, +0xdb, 0x94, 0x4e, 0x3b, 0x54, 0x99, 0xc3, 0xa2, 0xc6, 0xcc, 0x55, 0x34, 0x50, 0x62, 0x24, 0x72, +0x4e, 0x5e, 0x2e, 0xb7, 0x5b, 0x8d, 0x09, 0xca, 0x3a, 0x4a, 0x9b, 0x59, 0x0d, 0xe4, 0xd5, 0x70, +0xd1, 0x70, 0x30, 0x27, 0xd3, 0xae, 0x83, 0x33, 0x2e, 0x60, 0x87, 0x53, 0x5c, 0x53, 0xdc, 0xf1, +0x0d, 0x62, 0xdf, 0xef, 0xbf, 0x66, 0x26, 0xdf, 0x23, 0xcf, 0x59, 0xb8, 0x8e, 0x5f, 0x0f, 0xaa, +0x2a, 0xf2, 0x74, 0xcb, 0xf0, 0x07, 0xfa, 0xc9, 0x99, 0x24, 0xd9, 0xe9, 0xf6, 0xad, 0x28, 0xdf, +0x67, 0xcf, 0x59, 0xb8, 0x8e, 0xe6, 0x32, 0x4a, 0xaa, 0x7f, 0xe1, 0x01, 0x3a, 0xe7, 0x6a, 0xbe, +0xe2, 0x12, 0x8f, 0xda, 0x39, 0x71, 0xaf, 0x18, 0x01, 0x2e, 0x9b, 0x4c, 0xd0, 0x8e, 0xc2, 0x21, +0xfe, 0x9c, 0x42, 0xac, 0xa0, 0xfc, 0x6e, 0xbb, 0x34, 0xc6, 0xd5, 0xfa, 0xad, 0x78, 0xa9, 0x8e, +0xb8, 0x40, 0x6f, 0xa5, 0x14, 0x2c, 0xc4, 0x6b, 0x6c, 0xac, 0x4a, 0x97, 0xfb, 0xc0, 0x97, 0x14, +0xfb, 0xd3, 0xc0, 0x8d, 0x30, 0xef, 0x5e, 0xb5, 0xa4, 0x81, 0xb8, 0xeb, 0x06, 0xd8, 0x33, 0x5f, +0xea, 0x2f, 0x89, 0x50, 0x10, 0x5e, 0x16, 0xd1, 0x29, 0x48, 0x9c, 0xd9, 0x9e, 0xe1, 0x6a, 0x38, +0x47, 0x78, 0x34, 0x22, 0xe9, 0xd2, 0xac, 0x9c, 0xc7, 0xff, 0x71, 0x44, 0x64, 0x44, 0x58, 0xb1, +0x07, 0xde, 0xe1, 0xcb, 0xd5, 0xc0, 0xa7, 0x19, 0x0d, 0x1e, 0x81, 0xcc, 0x4f, 0x7f, 0x06, 0x49, +0x6d, 0xea, 0x6b, 0xc1, 0x0a, 0xa7, 0x07, 0x4a, 0xb1, 0x34, 0x0e, 0xb1, 0x12, 0xab, 0x85, 0x0b, +0xcb, 0xc4, 0x56, 0x0d, 0x70, 0x8f, 0x0e, 0x4d, 0xf6, 0x2b, 0x0b, 0x11, 0x71, 0x8e, 0x0e, 0x4d, +0x6b, 0xeb, 0x6b, 0x41, 0xca, 0x87, 0x37, 0x62, 0xb5, 0xb2, 0xcf, 0xd0, 0x52, 0x7e, 0x86, 0x89, +0xd3, 0xfa, 0x73, 0x45, 0x64, 0xc4, 0x18, 0xd1, 0xe2, 0x56, 0x1d, 0xa9, 0xe6, 0xc8, 0xab, 0x9b, +0x56, 0xbe, 0x51, 0xb4, 0xdb, 0x4d, 0xe9, 0x7a, 0xc5, 0xf6, 0xed, 0x06, 0x75, 0x91, 0x0f, 0x4d, +0xed, 0xab, 0xcb, 0x71, 0x72, 0xdb, 0x9d, 0x97, 0x80, 0xa7, 0xc5, 0xd5, 0xcc, 0xc5, 0xa5, 0x98, +0xd3, 0xfe, 0x71, 0x44, 0xa0, 0x21, 0x77, 0xc1, 0x13, 0x84, 0x36, 0x2a, 0x55, 0x4d, 0xd4, 0x73, +0x1c, 0x2e, 0x09, 0x37, 0x9b, 0xad, 0x39, 0xe2, 0xb2, 0x8c, 0xba, 0xe8, 0x72, 0x98, 0x13, 0xcf, +0x77, 0x4b, 0x1b, 0x99, 0xfe, 0x11, 0x02, 0x04, 0xe7, 0x4b, 0x9b, 0x6e, 0x6f, 0xda, 0x1d, 0xd7, +0xc6, 0x57, 0x9d, 0x69, 0x46, 0x78, 0xa3, 0x97, 0x24, 0xb9, 0xd4, 0xf5, 0x7b, 0x1d, 0xd1, 0x6e, +0x3c, 0x33, 0x0f, 0x97, 0x7b, 0xd0, 0x22, 0xd4, 0x4c, 0x97, 0xbd, 0x59, 0x5e, 0x41, 0xda, 0xf0, +0x70, 0x0e, 0x79, 0xff, 0xf7, 0xdb, 0x30, 0x5e, 0xf4, 0x2f, 0x89, 0xd0, 0x51, 0x7e, 0x06, 0xc9, +0x41, 0x4a, 0x9b, 0x59, 0x5e, 0x41, 0x5a, 0xb0, 0x98, 0x5e, 0xa1, 0xeb, 0x35, 0x3d, 0xcc, 0x6f, +0xbb, 0x6d, 0xaa, 0x67, 0x43, 0x79, 0x23, 0x57, 0x68, 0xe9, 0x6c, 0xc1, 0x0a, 0x15, 0x90, 0x1a, +0x42, 0x5e, 0x82, 0x4c, 0xe2, 0x12, 0xfc, 0x81, 0xd5, 0xc5, 0x8d, 0x46, 0xe3, 0x04, 0xf8, 0x01, +0x90, 0x55, 0x1e, 0x9e, 0x77, 0x6c, 0x54, 0xc4, 0x73, 0xc5, 0x35, 0xaa, 0x12, 0xbd, 0x11, 0x4b, +0x5a, 0x1b, 0xcc, 0x81, 0xea, 0x17, 0xff, 0x86, 0x53, 0xb4, 0x4e, 0xb6, 0xdb, 0x4d, 0x69, 0x3a, +0x59, 0x66, 0xa5, 0x62, 0xd9, 0xbd, 0x7c, 0x30, 0x2d, 0xe0, 0xc7, 0xf3, 0x4e, 0xeb, 0xe8, 0xff, +0x10, 0x66, 0x5e, 0x2e, 0x4f, 0x0a, 0xc8, 0x83, 0x56, 0x37, 0x05, 0x16, 0xab, 0xdf, 0x69, 0x3c, +0xf4, 0xa7, 0xc5, 0x72, 0x71, 0xdb, 0x1d, 0xd7, 0x87, 0x09, 0xfc, 0x89, 0x06, 0x8d, 0x19, 0xb5, +0x2b, 0x08, 0x1c, 0xfb, 0x79, 0x1c, 0xd1, 0xee, 0xf8, 0x93, 0x3f, 0x2f, 0x4f, 0x70, 0xe2, 0x03, +0xd6, 0x94, 0xdd, 0x7e, 0x72, 0x46, 0xda, 0xf6, 0x0c, 0x62, 0xdf, 0x6f, 0xef, 0x5a, 0x70, 0x37, +0x5c, 0x25, 0x0a, 0x13, 0xb1, 0x23, 0x44, 0xad, 0x58, 0x56, 0x6d, 0x4b, 0x81, 0x95, 0x3d, 0xe1, +0x35, 0x7c, 0xb8, 0xe8, 0xab, 0x2d, 0x49, 0xaf, 0xa8, 0x13, 0x15, 0x8b, 0x85, 0xb3, 0x97, 0xa5, +0xd6, 0xfd, 0x12, 0x84, 0xf4, 0x80, 0xbb, 0xa5, 0x3f, 0xbd, 0x52, 0x34, 0xcc, 0x10, 0x5f, 0xd2, +0x1e, 0x72, 0xd7, 0x19, 0x1b, 0x21, 0x67, 0xac, 0xa7, 0xbf, 0x89, 0xab, 0x15, 0x24, 0xed, 0x9b, +0x42, 0x8d, 0xcd, 0x14, 0x6b, 0x95, 0x8d, 0x8c, 0x47, 0x3b, 0x93, 0x55, 0x4c, 0x54, 0xe1, 0x70, +0x47, 0xb0, 0x50, 0x37, 0x9b, 0x2d, 0x79, 0xc2, 0xa0, 0x84, 0x36, 0xaa, 0x15, 0x2d, 0xc4, 0xeb, +0xaf, 0x8f, 0x3a, 0x9f, 0x77, 0x6c, 0xd4, 0x04, 0x93, 0x56, 0xf7, 0x1e, 0x67, 0x93, 0x0c, 0xcc, +0xa7, 0x8b, 0x3b, 0x29, 0x96, 0x5d, 0x00, 0x03, 0x20, 0x54, 0x9e, 0x5e, 0x57, 0xc1, 0x5f, 0xc0, +0x25, 0x80, 0xbc, 0xea, 0x32, 0xed, 0x69, 0x3f, 0x70, 0x76, 0xc7, 0x02, 0xa9, 0x77, 0x2f, 0xde, +0x65, 0x0f, 0xf9, 0x88, 0x06, 0x0a, 0x59, 0xd5, 0x6b, 0x5c, 0x72, 0xc9, 0xa1, 0xb5, 0x8d, 0x89, +0x0a, 0x2f, 0x99, 0x55, 0xe5, 0xd0, 0x9f, 0x90, 0x3d, 0x88, 0xb7, 0x65, 0xb2, 0x31, 0xce, 0xe7, +0xf3, 0x98, 0x54, 0x38, 0xd2, 0xd9, 0xa3, 0x12, 0xcc, 0x0d, 0x2a, 0x9d, 0xdc, 0xbe, 0x16, 0x54, +0x2e, 0xbc, 0xc2, 0xf1, 0x8a, 0xab, 0x88, 0x0f, 0xcc, 0x0e, 0x29, 0x9d, 0xd8, 0x3e, 0x56, 0xb4, +0xab, 0xaf, 0x96, 0x4b, 0xa5, 0xd5, 0xbc, 0xa1, 0x6d, 0x7d, 0x32, 0x24, 0xd4, 0x0c, 0xc0, 0x93, +0x78, 0x6d, 0xfa, 0x85, 0x08, 0x45, 0x55, 0x35, 0xaa, 0x74, 0x5e, 0x43, 0x46, 0xd6, 0xa2, 0x12, +0xc0, 0x0d, 0x2a, 0x9d, 0x1f, 0x7e, 0xb6, 0xa4, 0xc0, 0x79, 0xd1, 0xf4, 0x76, 0xf8, 0xee, 0xfe, +0x08, 0x17, 0x7d, 0x4e, 0xdf, 0x82, 0xb9, 0xa1, 0x57, 0xbc, 0x52, 0xb4, 0x58, 0x8d, 0x89, 0x8a, +0x19, 0x3a, 0x93, 0xd5, 0x5c, 0x20, 0x4a, 0xa8, 0x2b, 0x42, 0x17, 0x9b, 0x7d, 0x51, 0xe2, 0xf4, +0x1f, 0xd1, 0x60, 0xbf, 0xdb, 0x4b, 0x68, 0x3a, 0x90, 0x66, 0x25, 0xa2, 0xaa, 0xb2, 0xbc, 0xa4, +0x39, 0x3d, 0x12, 0x94, 0xae, 0x35, 0xfd, 0x84, 0xb1, 0x75, 0xae, 0x66, 0x46, 0xf9, 0xe3, 0xf7, +0xf3, 0x91, 0xc0, 0x6f, 0x6f, 0x60, 0xda, 0x07, 0x54, 0x55, 0xfd, 0x0e, 0xc9, 0xe3, 0x64, 0x3d, +0xef, 0x57, 0xe6, 0xf2, 0x73, 0x16, 0xd2, 0xef, 0x24, 0x12, 0xff, 0x0f, 0x86, 0x8f, 0x0e, 0x4d, +0x54, 0xaa, 0x4b, 0x31, 0x8c, 0x26, 0xfa, 0x83, 0x6d, 0x34, 0x0e, 0x96, 0xf8, 0x44, 0x76, 0xc4, +0x6d, 0x35, 0x91, 0x5a, 0x57, 0x11, 0x7f, 0x40, 0xf5, 0x54, 0x21, 0x22, 0xea, 0x1f, 0x46, 0xac, +0x67, 0xf3, 0x74, 0x4b, 0xfd, 0x55, 0xdd, 0x71, 0xcd, 0xc0, 0xdb, 0xf7, 0xcc, 0x28, 0xcb, 0xee, +0x38, 0x46, 0x05, 0x8f, 0x61, 0x82, 0x34, 0x65, 0x34, 0xb8, 0xc4, 0x70, 0xd4, 0xcb, 0x18, 0x57, +0xdc, 0x87, 0x2a, 0x11, 0x82, 0xe3, 0x45, 0xad, 0xd2, 0x43, 0x97, 0xdb, 0x1d, 0x1f, 0x0e, 0x58, +0xe1, 0x5e, 0x1e, 0xa0, 0x01, 0xff, 0xf6, 0x84, 0x83, 0xe0, 0x38, 0x26, 0x71, 0x1c, 0x81, 0x43, +0x25, 0x31, 0x80, 0x52, 0xda, 0x53, 0xdc, 0x71, 0x4d, 0x00, 0xfb, 0x87, 0xf3, 0x39, 0xd2, 0x65, +0xe3, 0x5d, 0x1d, 0x20, 0x44, 0x1a, 0x01, 0xcc, 0x67, 0xde, 0xb1, 0xe9, 0x13, 0xed, 0x69, 0x3f, +0x1f, 0xb2, 0x3f, 0x32, 0x73, 0x9b, 0x40, 0x63, 0xe6, 0x82, 0xac, 0xd0, 0x62, 0xf3, 0xcd, 0x69, +0xb4, 0x32, 0x8f, 0x57, 0x5b, 0xbe, 0x5e, 0xc0, 0xb5, 0xb4, 0x51, 0xba, 0xf8, 0x39, 0x53, 0xaa, +0xda, 0x97, 0xcd, 0xfb, 0x07, 0xe9, 0xeb, 0xfe, 0xbf, 0x02, 0x27, 0x1e, 0xc1, 0x1e, 0xc6, 0x6c, +0x47, 0x83, 0xbc, 0x67, 0x19, 0x31, 0xce, 0x67, 0x64, 0x9d, 0xbd, 0xf0, 0xde, 0x8e, 0x3f, 0x6f, +0xf8, 0xa6, 0xd5, 0xf7, 0x8b, 0xa8, 0x8b, 0x0e, 0xc7, 0x0e, 0xa9, 0xdd, 0x3e, 0x6e, 0xae, 0x98, +0xc1, 0x10, 0x53, 0xa4, 0xd4, 0xbc, 0xb0, 0x1b, 0x5f, 0x1e, 0x81, 0x4c, 0x60, 0x44, 0x9d, 0xa1, +0x45, 0x8c, 0xb5, 0x64, 0x8f, 0xcc, 0x99, 0x97, 0x8c, 0xec, 0x3a, 0xa5, 0x32, 0xfc, 0x71, 0x3b, +0xa1, 0x73, 0x5f, 0x42, 0x4c, 0x17, 0x02, 0x02, 0x96, 0x24, 0x09, 0x8e, 0x9b, 0x77, 0x33, 0x75, +0x4b, 0x01, 0x7b, 0x47, 0x3d, 0x29, 0x4a, 0x21, 0x55, 0x49, 0x8c, 0x4c, 0x7f, 0x92, 0xbc, 0x21, +0xd6, 0x09, 0xac, 0x5c, 0xfe, 0xce, 0x1e, 0xd0, 0x1d, 0xe6, 0x7a, 0xd9, 0x5e, 0xf1, 0x4e, 0x28, +0x0c, 0x62, 0xa7, 0xe3, 0x19, 0x21, 0x8f, 0x18, 0x01, 0x6e, 0x26, 0x1c, 0xe9, 0x9e, 0x86, 0x8c, +0x87, 0x6e, 0xf9, 0x05, 0x22, 0x64, 0x25, 0x5d, 0xb0, 0x7a, 0x63, 0x40, 0xd2, 0xd7, 0x22, 0x52, +0x5e, 0x98, 0xbf, 0x71, 0xb8, 0xee, 0xef, 0xd7, 0x9c, 0x39, 0x8f, 0xd9, 0x56, 0x4c, 0x58, 0x18, +0x01, 0xee, 0x66, 0x3c, 0x80, 0x16, 0x02, 0x82, 0x4a, 0x34, 0x8e, 0x56, 0xdb, 0xc0, 0x26, 0xd0, +0x1d, 0xb8, 0xc2, 0xf9, 0x2e, 0x31, 0xe7, 0x9e, 0x50, 0x8f, 0xaf, 0xe4, 0x29, 0x6c, 0x29, 0xdf, +0x20, 0x26, 0x96, 0xb8, 0x8e, 0x69, 0x0f, 0x2a, 0x0a, 0x62, 0x07, 0x23, 0x39, 0xb6, 0xab, 0xfc, +0x8f, 0xaf, 0x61, 0x5e, 0xfa, 0x0e, 0xde, 0x80, 0x55, 0x1e, 0x11, 0xf6, 0xce, 0x68, 0x0b, 0x5e, +0x60, 0x15, 0xa6, 0x40, 0xa7, 0x97, 0xa2, 0xa2, 0xc6, 0xc7, 0xad, 0x04, 0x55, 0xa4, 0xa5, 0x8d, +0xc5, 0x86, 0x37, 0x25, 0x54, 0xc0, 0xef, 0xa3, 0x3a, 0x3c, 0x12, 0x94, 0xfc, 0xd0, 0xb3, 0x14, +0xfb, 0x29, 0x9a, 0x4d, 0xe0, 0xc2, 0x25, 0x51, 0x5d, 0x10, 0x28, 0x81, 0xea, 0xe5, 0xba, 0x16, +0x5e, 0x59, 0x04, 0x1d, 0xb8, 0x65, 0xe7, 0x6c, 0x37, 0x83, 0x31, 0xa7, 0xa5, 0x3c, 0x51, 0x2b, +0x6a, 0x0b, 0x2c, 0x83, 0x69, 0x57, 0x76, 0xe6, 0xbc, 0x4d, 0x7a, 0x58, 0xde, 0x88, 0x22, 0xb0, +0x2d, 0xf8, 0x1c, 0x7b, 0xcd, 0x09, 0x5b, 0xc6, 0x34, 0x2f, 0x19, 0x7a, 0x94, 0x09, 0xdb, 0x06, +0x14, 0xef, 0xc1, 0x0e, 0xe2, 0x62, 0x84, 0x1d, 0xff, 0x64, 0xfe, 0x6c, 0x99, 0x8a, 0x98, 0xa7, +0x75, 0x7d, 0x52, 0xa4, 0x89, 0xe1, 0x65, 0xbb, 0xac, 0xfb, 0x71, 0x4a, 0xe5, 0x79, 0xd2, 0x11, +0xfd, 0x64, 0xae, 0x0d, 0x3c, 0xe2, 0xe4, 0x7d, 0xcf, 0x99, 0x8f, 0xc6, 0x63, 0xf4, 0x4c, 0x29, +0xe4, 0x23, 0x87, 0xd3, 0xa1, 0x63, 0xa9, 0x99, 0x76, 0xbf, 0xd1, 0xf4, 0x30, 0x68, 0x2b, 0x5e, +0xe0, 0x81, 0x2b, 0x10, 0x02, 0x23, 0x65, 0xbd, 0x3c, 0x07, 0xf5, 0x8a, 0x05, 0x95, 0xc0, 0x25, +0x1b, 0x5c, 0x22, 0x1c, 0x44, 0xde, 0x66, 0x3c, 0x25, 0x26, 0x07, 0x92, 0xf4, 0x0a, 0xf6, 0x85, +0xc3, 0xc5, 0xd4, 0x76, 0x6a, 0x08, 0xfb, 0x86, 0x40, 0x74, 0xb0, 0xe6, 0x03, 0x6c, 0x89, 0x1f, +0x80, 0xff, 0x1e, 0xfc, 0x5a, 0xa6, 0x2a, 0x4e, 0xe6, 0x6a, 0x29, 0xa1, 0x7a, 0x57, 0x28, 0x44, +0xe7, 0x25, 0x86, 0x52, 0xe1, 0xa4, 0xbe, 0x11, 0x0d, 0x68, 0x1e, 0x9d, 0xfc, 0x3e, 0x56, 0x34, +0x6b, 0x19, 0x2c, 0x03, 0xa9, 0xee, 0x06, 0x2e, 0x68, 0x1a, 0x6b, 0x63, 0x59, 0x9f, 0x1c, 0x60, +0xe5, 0x5d, 0xac, 0x50, 0xe2, 0x03, 0x79, 0x41, 0xf4, 0xa4, 0x46, 0x32, 0xcd, 0x5b, 0xe0, 0xf3, +0x92, 0xd0, 0xe0, 0x7f, 0xe7, 0x59, 0xf8, 0x76, 0x4c, 0xdf, 0x6e, 0xd7, 0x5b, 0xf0, 0x4e, 0xa8, +0xb8, 0xc2, 0x57, 0xbb, 0x8d, 0x67, 0x72, 0x2a, 0x6a, 0x12, 0x04, 0x93, 0xfd, 0xc3, 0x94, 0x15, +0x7b, 0x89, 0x42, 0x3d, 0xc8, 0xff, 0x5e, 0xd2, 0x9e, 0x31, 0xf8, 0xe9, 0xb6, 0x3f, 0xab, 0x0f, +0x38, 0xdb, 0x44, 0xad, 0x38, 0x3a, 0xd0, 0x6b, 0x4a, 0x80, 0x70, 0x57, 0xdb, 0x00, 0xfa, 0x00, +0x14, 0x94, 0x3e, 0x2e, 0xcb, 0x5a, 0x60, 0x33, 0x58, 0xa1, 0xc6, 0xf3, 0x84, 0x2a, 0x4a, 0xaf, +0x98, 0xe3, 0xd9, 0xfb, 0x3d, 0x69, 0xab, 0x9e, 0x54, 0xf5, 0x73, 0xc4, 0x0f, 0x22, 0xcf, 0x69, +0x89, 0x72, 0x4f, 0x27, 0xbb, 0x9c, 0x21, 0x63, 0x32, 0x2e, 0x8c, 0x50, 0x95, 0x1d, 0x7e, 0x41, +0x75, 0x23, 0xc6, 0x82, 0x37, 0x47, 0x7a, 0x36, 0xd6, 0x61, 0x08, 0x23, 0x39, 0x3f, 0xea, 0x9c, +0x77, 0x3f, 0x71, 0xd4, 0x87, 0x6e, 0x2d, 0xd8, 0x21, 0x28, 0x3a, 0x38, 0xac, 0x99, 0xa3, 0xa2, +0xc6, 0xc4, 0x80, 0x24, 0xd2, 0x9d, 0x43, 0x63, 0x9f, 0x6d, 0xac, 0xe0, 0x26, 0xef, 0x6e, 0xb8, +0x31, 0x68, 0xb7, 0xfa, 0x6d, 0x69, 0x8a, 0x0e, 0x73, 0x9b, 0x43, 0xad, 0x90, 0xea, 0xb1, 0x0b, +0xfa, 0x9d, 0x5b, 0xad, 0x10, 0xfa, 0xc8, 0x7b, 0xd2, 0x06, 0x19, 0x06, 0xc3, 0x10, 0xc9, 0x8d, +0x09, 0x70, 0xd3, 0x75, 0xec, 0xfc, 0xd5, 0x16, 0x82, 0xd9, 0xe4, 0x7d, 0xe8, 0x96, 0xbf, 0x26, +0xce, 0x1d, 0x82, 0x4c, 0x60, 0x1e, 0x80, 0xe1, 0xf5, 0x87, 0x5a, 0x38, 0xce, 0x6d, 0x1d, 0x32, +0x5f, 0xe0, 0xe8, 0x03, 0x29, 0xb7, 0x8f, 0x8e, 0x0c, 0xfb, 0xf3, 0x05, 0xa4, 0x10, 0x88, 0x8d, +0x76, 0x64, 0x26, 0xa5, 0x94, 0xb7, 0x39, 0xcb, 0x1a, 0xe4, 0x79, 0x59, 0x1e, 0x91, 0x1e, 0x50, +0x1d, 0xa8, 0xcc, 0x71, 0x72, 0x5b, 0x19, 0xe7, 0xea, 0xe0, 0x5c, 0xb8, 0x0e, 0x31, 0xbd, 0xfa, +0x3c, 0xb3, 0xbf, 0xee, 0xbf, 0xed, 0x66, 0xbf, 0xb1, 0x87, 0xb5, 0x6a, 0xf5, 0x85, 0xc7, 0x17, +0xfc, 0x79, 0xe3, 0xfd, 0xc6, 0x9b, 0x28, 0xde, 0xb0, 0x47, 0x97, 0x58, 0xdb, 0x51, 0x5f, 0xb0, +0xad, 0x48, 0xca, 0x8b, 0x05, 0x55, 0xf4, 0x85, 0x39, 0x40, 0xf0, 0x06, 0xb3, 0xe2, 0xeb, 0xfd, +0x92, 0xd7, 0x5d, 0x3e, 0xc7, 0x8e, 0xcc, 0x12, 0x7e, 0xe8, 0x43, 0xad, 0x10, 0x10, 0x92, 0x1b, +0x42, 0xde, 0xc2, 0xec, 0x12, 0xeb, 0xe8, 0x7f, 0xd0, 0x47, 0xce, 0x66, 0x73, 0x87, 0x11, 0xe7, +0x6a, 0xa0, 0x3c, 0xa8, 0xa6, 0xde, 0xef, 0x7b, 0xcf, 0xf6, 0x6d, 0xc6, 0xa3, 0x7c, 0xe3, 0x09, +0xf9, 0x2a, 0xa4, 0x5d, 0x58, 0x7c, 0xdc, 0x00, 0x55, 0x54, 0x7d, 0xce, 0x0e, 0xf3, 0xec, 0x79, +0xd1, 0x46, 0x4e, 0xa6, 0x93, 0x4e, 0xb3, 0x8b, 0x3a, 0xd0, 0xb4, 0xe5, 0x34, 0xbd, 0x48, 0xbf, +0x30, 0xa6, 0x59, 0xda, 0x4a, 0xb0, 0x8d, 0x88, 0x49, 0xf7, 0xed, 0x05, 0x40, 0x64, 0x25, 0xdd, +0x63, 0x7f, 0x3b, 0xa8, 0x11, 0xa5, 0x13, 0x4b, 0x5a, 0xa2, 0xd7, 0x21, 0x2a, 0x23, 0x48, 0xac, +0xb0, 0x83, 0x37, 0x2b, 0xd5, 0x84, 0x9d, 0xf3, 0x8e, 0x29, 0xa3, 0xbf, 0x17, 0xb8, 0x8c, 0x0a, +0x7e, 0xda, 0x63, 0x3d, 0x0c, 0x46, 0x60, 0x32, 0x69, 0x98, 0xc6, 0xf3, 0x31, 0x23, 0x74, 0x5f, +0xe0, 0xaf, 0x49, 0x30, 0x62, 0x55, 0xde, 0xf3, 0x08, 0x10, 0x00, 0x8f, 0xff, 0x9b, 0x98, 0xf5, +0xc7, 0xe1, 0x5e, 0xbf, 0x07, 0x1f, 0x6f, 0x5a, 0xe5, 0x56, 0x2b, 0x20, 0xba, 0xe7, 0x5a, 0xcc, +0x17, 0xe5, 0x79, 0x59, 0x9e, 0x51, 0xfe, 0x80, 0x9a, 0xb4, 0x4e, 0x36, 0x4b, 0x48, 0x22, 0x62, +0x66, 0xc2, 0x8c, 0xe0, 0x9a, 0xd9, 0x2f, 0xd8, 0x21, 0x7f, 0xfa, 0x98, 0xee, 0x0b, 0xf9, 0x84, +0x51, 0x35, 0x8e, 0x56, 0x5b, 0x49, 0x83, 0x60, 0xa1, 0xdc, 0x6c, 0x40, 0x4a, 0xbe, 0xbf, 0x82, +0xd1, 0x4c, 0x90, 0xd6, 0x9b, 0x78, 0xa3, 0x68, 0x49, 0x82, 0xbc, 0x67, 0x84, 0x0c, 0xf9, 0x87, +0xc8, 0x75, 0x2e, 0x26, 0x53, 0x8d, 0x23, 0xe3, 0xb6, 0xca, 0x78, 0x48, 0x5e, 0x95, 0x3d, 0xe1, +0xb5, 0x9d, 0xd4, 0x78, 0xee, 0xc9, 0x1b, 0xd6, 0xd8, 0x49, 0x9a, 0x59, 0xe2, 0x99, 0xbd, 0xa0, +0x3d, 0x8c, 0xb4, 0xe4, 0xb4, 0x3d, 0x6b, 0x2f, 0x68, 0x2b, 0xac, 0x43, 0x49, 0x2b, 0xfe, 0xa2, +0x46, 0xfc, 0x92, 0xd4, 0x1c, 0x51, 0x33, 0x38, 0x6d, 0xe6, 0xe5, 0x02, 0x29, 0xb7, 0x8f, 0x0e, +0xfb, 0x1b, 0x83, 0x4d, 0x60, 0x42, 0x59, 0x31, 0xb5, 0xa0, 0xc8, 0xf3, 0x2d, 0xeb, 0x68, 0x3f, +0xf0, 0x09, 0xe7, 0xf2, 0x71, 0x6b, 0x09, 0x4f, 0x1e, 0x6b, 0xab, 0xe1, 0x9a, 0x61, 0x6f, 0x28, +0x29, 0x62, 0x08, 0x13, 0x54, 0xe3, 0x64, 0x3d, 0x6f, 0x17, 0xc6, 0x82, 0xa9, 0x47, 0x7b, 0x46, +0xd6, 0x25, 0x06, 0x12, 0xc1, 0xf2, 0xa5, 0x0d, 0x77, 0xdb, 0xbd, 0xfd, 0xa8, 0x1a, 0x45, 0xce, +0x1b, 0xcb, 0xdb, 0x79, 0x6e, 0x59, 0xde, 0xf6, 0xac, 0x91, 0xc0, 0xef, 0xaf, 0xc0, 0xea, 0xef, +0x48, 0x53, 0x80, 0xcf, 0x92, 0x72, 0x2c, 0xd9, 0x21, 0x7c, 0x7a, 0x58, 0xde, 0xbb, 0x7d, 0x30, +0x2d, 0x60, 0x87, 0x53, 0xee, 0x13, 0x7c, 0xc1, 0x35, 0xf4, 0xb5, 0x7a, 0xad, 0xc9, 0xba, 0xa6, +0xbf, 0x3d, 0x92, 0x54, 0x5c, 0x41, 0x1e, 0xe0, 0x5f, 0x59, 0x74, 0xc8, 0xdb, 0xb5, 0x8d, 0x89, +0x39, 0xae, 0xce, 0x15, 0xc4, 0x20, 0x47, 0xac, 0xa7, 0xb3, 0x54, 0xbb, 0xd0, 0x39, 0xd3, 0xea, +0x8a, 0x3c, 0xbd, 0x7f, 0x27, 0x86, 0x1b, 0x56, 0x28, 0xe9, 0xec, 0x81, 0xea, 0x99, 0x7b, 0xb6, +0xec, 0x01, 0x17, 0x9b, 0x7a, 0x41, 0x57, 0x34, 0xeb, 0xd1, 0x27, 0x93, 0xc1, 0x43, 0x75, 0x45, +0x9c, 0x65, 0xa6, 0x62, 0xd9, 0x7e, 0x7f, 0x30, 0x6d, 0x67, 0xf0, 0x23, 0x39, 0xe4, 0x5f, 0xbc, +0x1f, 0x83, 0x3b, 0x2a, 0x4f, 0x9d, 0xc1, 0x23, 0x06, 0xe6, 0x3d, 0xcc, 0x20, 0xa2, 0x09, 0xc9, +0x61, 0x4a, 0x9b, 0x59, 0xde, 0x99, 0x23, 0xb0, 0x2d, 0x89, 0xdc, 0x9b, 0x7d, 0xeb, 0x15, 0xe4, +0xe3, 0x8d, 0x59, 0xb8, 0x1d, 0x78, 0xb3, 0x9a, 0xc2, 0x4e, 0xd2, 0x64, 0xb4, 0x4c, 0xf8, 0x07, +0xbb, 0xd5, 0xde, 0x7e, 0xe7, 0x17, 0x3b, 0x56, 0x5c, 0xee, 0xb4, 0x01, 0x2a, 0xec, 0xe3, 0xfe, +0x80, 0x15, 0x83, 0xce, 0x26, 0xf2, 0xec, 0xf9, 0xd6, 0x03, 0x27, 0x9e, 0x2f, 0xfe, 0xf6, 0x84, +0x53, 0x05, 0x79, 0xc6, 0xb2, 0x34, 0xcd, 0xe9, 0x09, 0x5a, 0x83, 0x2f, 0xcf, 0x13, 0xdc, 0x13, +0x02, 0x98, 0xc4, 0xed, 0xb0, 0xc0, 0x6a, 0x2f, 0xa8, 0xa3, 0xe8, 0x03, 0x75, 0xe7, 0xea, 0xfe, +0x10, 0x65, 0xde, 0xee, 0xef, 0xaa, 0xa9, 0x1f, 0x2f, 0x5f, 0xa1, 0xdc, 0x18, 0x1e, 0x0f, 0xd8, +0x61, 0x4e, 0xfa, 0x88, 0x49, 0xc5, 0x95, 0x95, 0x3b, 0x88, 0x73, 0x55, 0x5c, 0x13, 0xc7, 0x80, +0x45, 0x70, 0xb4, 0x66, 0x72, 0x8c, 0xb9, 0xa7, 0x44, 0x3d, 0xf0, 0x94, 0x7c, 0xb4, 0x38, 0xc4, +0x35, 0xc5, 0x56, 0x3a, 0x4d, 0xc9, 0x96, 0x12, 0x96, 0x58, 0xa4, 0xdd, 0x18, 0x36, 0xf2, 0x18, +0x01, 0xf0, 0x63, 0x2c, 0x10, 0x1a, 0x61, 0xb3, 0xf9, 0xc0, 0xd8, 0x7b, 0xed, 0x99, 0x7a, 0xb6, +0x6c, 0x41, 0x77, 0xcb, 0xce, 0xf5, 0x6d, 0x39, 0x71, 0x97, 0x06, 0x22, 0xb9, 0x4d, 0xa4, 0x8c, +0x77, 0x3b, 0xf4, 0x85, 0xed, 0x04, 0x75, 0xc5, 0x33, 0x77, 0x75, 0xda, 0x1d, 0x72, 0x97, 0x18, +0x81, 0x59, 0xfa, 0x9c, 0xe8, 0x82, 0xb8, 0x24, 0x01, 0x1d, 0x82, 0x4c, 0xe0, 0x0c, 0xe1, 0x91, +0xbd, 0x48, 0x97, 0xd5, 0xa1, 0x30, 0x4f, 0x28, 0xe9, 0x6a, 0x8b, 0xb3, 0x91, 0xf2, 0xcc, 0x8b, +0xc6, 0xfa, 0xf3, 0x05, 0xc4, 0x9f, 0x3c, 0x4d, 0x67, 0xac, 0xa5, 0x61, 0xdb, 0x4f, 0xde, 0xf0, +0x8d, 0xaa, 0x52, 0xdf, 0x47, 0x6e, 0x0e, 0x58, 0xe1, 0xeb, 0xaa, 0x50, 0x62, 0x43, 0x59, 0x31, +0xe9, 0xa0, 0x48, 0xb3, 0x11, 0xb2, 0xac, 0xfb, 0x0e, 0x16, 0xfd, 0x8e, 0x6e, 0xd2, 0x96, 0x95, +0x5f, 0x39, 0x74, 0x55, 0x22, 0x10, 0xde, 0x70, 0x5d, 0xef, 0x69, 0x07, 0xb8, 0xa4, 0x24, 0xdd, +0x60, 0x3f, 0x8e, 0xd8, 0x18, 0x71, 0x2f, 0xd8, 0x35, 0xf6, 0x7b, 0x48, 0x1e, 0x15, 0x5d, 0xc1, +0xad, 0x85, 0xd5, 0x7a, 0xc3, 0x02, 0x76, 0xc6, 0xa9, 0xb4, 0xd8, 0x7a, 0xf1, 0x49, 0xdb, 0x76, +0x3a, 0x65, 0x38, 0xa7, 0x14, 0x7c, 0x31, 0x5b, 0x66, 0x18, 0xdd, 0x80, 0xea, 0xc7, 0x9a, 0x96, +0xc0, 0xf9, 0x74, 0x45, 0x52, 0xe0, 0x15, 0xd1, 0x1b, 0xc8, 0x5c, 0xb9, 0x2a, 0xab, 0xe7, 0x7a, +0x52, 0xb6, 0xcd, 0x76, 0xef, 0x48, 0x5b, 0x36, 0x5a, 0x35, 0x40, 0xb3, 0x10, 0x7b, 0xb0, 0x9b, +0x3f, 0x08, 0xd5, 0x74, 0xec, 0x48, 0x5b, 0x36, 0xf0, 0xa1, 0x48, 0x33, 0x63, 0xe7, 0x98, 0x13, +0x7c, 0x58, 0xa4, 0xdd, 0xbc, 0x64, 0x4a, 0xa8, 0x29, 0x42, 0x97, 0xdb, 0x87, 0x45, 0x27, 0x58, +0xe0, 0x2e, 0x09, 0x10, 0xbf, 0xf1, 0x90, 0x0d, 0xf7, 0x9b, 0x43, 0xad, 0x8c, 0x3a, 0xd0, 0x6b, +0xbc, 0xa6, 0x17, 0x97, 0xf7, 0x40, 0xd7, 0x74, 0xae, 0x47, 0xbc, 0xe7, 0xb3, 0xac, 0x09, 0x4f, +0xe4, 0xab, 0x4b, 0xb1, 0xa4, 0x47, 0x28, 0x5b, 0xe6, 0xae, 0x49, 0xb0, 0xaf, 0x69, 0x44, 0xab, +0x2a, 0x42, 0x97, 0x5b, 0xc7, 0x25, 0x37, 0x60, 0xe6, 0x2c, 0x8a, 0xd0, 0xa6, 0xe1, 0x88, 0x89, +0x39, 0x3a, 0x93, 0x55, 0x60, 0x10, 0x7f, 0x40, 0x70, 0x21, 0xe2, 0x82, 0xe9, 0x47, 0x5a, 0xb6, +0xa7, 0x15, 0x50, 0x3b, 0x4d, 0xd9, 0xa3, 0x92, 0x42, 0xb8, 0xd4, 0x75, 0x28, 0xbf, 0x16, 0x56, +0x9a, 0x29, 0xab, 0xe1, 0x73, 0xec, 0xf9, 0x48, 0x6d, 0x24, 0xe3, 0x01, 0x74, 0x20, 0xc7, 0x6e, +0x7e, 0x78, 0xb4, 0xe7, 0xa7, 0xac, 0x89, 0x0f, 0x13, 0x50, 0x20, 0x1d, 0xfe, 0x1e, 0x67, 0x3c, +0xbe, 0x98, 0x34, 0xa2, 0x6d, 0xcd, 0x7e, 0xc4, 0xf2, 0x4e, 0x19, 0x9a, 0x81, 0x81, 0xb7, 0x24, +0x83, 0x5d, 0x22, 0x9c, 0x0d, 0x44, 0x23, 0xef, 0x0c, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0xa2, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x7c, 0x17, 0xb6, 0x4b, 0x44, 0xea, 0x0b, 0x01, 0xd8, 0x67, 0x3d, 0xef, 0xb3, 0xc9, 0x12, +0xb0, 0x24, 0x7c, 0x8d, 0xbb, 0xae, 0xd9, 0x75, 0x2c, 0x08, 0xfb, 0x86, 0xb3, 0xe1, 0x71, 0x46, +0xaa, 0x27, 0x4a, 0x21, 0x66, 0xbe, 0x3e, 0x2c, 0xef, 0x3a, 0x7c, 0xc3, 0x55, 0xe7, 0xba, 0x6a, +0xd6, 0xa9, 0xb5, 0x27, 0xe3, 0x78, 0xde, 0x7c, 0x9c, 0xef, 0x20, 0x56, 0x5c, 0x99, 0x3f, 0xb1, +0x87, 0xbb, 0x90, 0x0b, 0x8f, 0x4f, 0x89, 0x4d, 0x83, 0x92, 0xbc, 0xa1, 0xc5, 0x4c, 0x95, 0x54, +0xd5, 0xd0, 0x1f, 0x50, 0xa9, 0xb1, 0x82, 0x51, 0xc7, 0x1e, 0xf6, 0x81, 0x17, 0x34, 0x8e, 0xd6, +0xdb, 0xe0, 0x6a, 0x38, 0xa5, 0x26, 0x05, 0x92, 0x32, 0x6e, 0x1e, 0x55, 0x58, 0xe9, 0x6c, 0xc1, +0xd8, 0xca, 0x28, 0xda, 0x24, 0x4e, 0x99, 0x58, 0x08, 0x64, 0x15, 0x50, 0x66, 0xe8, 0x6c, 0x41, +0x9b, 0x2a, 0xf8, 0x02, 0x0c, 0x94, 0xbe, 0x6e, 0x6f, 0x60, 0x5a, 0x47, 0xf4, 0xa8, 0x65, 0x42, +0xc9, 0x08, 0xc3, 0x12, 0xfe, 0xf6, 0x62, 0x2d, 0xd0, 0xc3, 0xc1, 0xa3, 0x46, 0x08, 0x31, 0x34, +0xa5, 0xad, 0xb9, 0xa2, 0xa1, 0xfc, 0x72, 0x44, 0xe4, 0xe8, 0x7e, 0x31, 0x6d, 0xad, 0xcc, 0x73, +0x31, 0xdb, 0x1d, 0x57, 0x68, 0xe9, 0x6c, 0x41, 0x19, 0xea, 0x58, 0x32, 0x67, 0xe0, 0x68, 0x43, +0x17, 0xea, 0x58, 0xb2, 0xb6, 0x00, 0x78, 0xcb, 0x4f, 0x80, 0x87, 0x89, 0xc0, 0x7a, 0x33, 0xa5, +0x61, 0x89, 0x8b, 0x8b, 0x46, 0xba, 0xd3, 0x75, 0x6c, 0x62, 0xd9, 0x06, 0x14, 0x73, 0xdd, 0x7e, +0x67, 0x59, 0x1b, 0x66, 0xe4, 0x83, 0xac, 0xd0, 0xa2, 0xc5, 0x2d, 0xd9, 0xa1, 0x3a, 0xda, 0xe8, +0xfb, 0xd8, 0xb3, 0x9f, 0xae, 0x7f, 0xb1, 0x64, 0xf4, 0x70, 0xba, 0x97, 0xcc, 0x84, 0xb0, 0x65, +0xb1, 0x39, 0x83, 0x47, 0x34, 0x65, 0x26, 0x22, 0xa9, 0x7f, 0xa8, 0x1c, 0x66, 0xdf, 0x61, 0x3c, +0x1e, 0xe3, 0x20, 0x52, 0xde, 0xc8, 0x48, 0x51, 0x0a, 0xd3, 0x3c, 0xd1, 0x1d, 0x23, 0x97, 0x39, +0xc4, 0x19, 0x63, 0xc2, 0xb6, 0x64, 0x4b, 0xca, 0x91, 0x85, 0x2f, 0x59, 0x31, 0xae, 0x69, 0x30, +0x52, 0x2f, 0xfd, 0xa3, 0x74, 0x7c, 0xd2, 0x64, 0x6a, 0x3c, 0x5b, 0x37, 0x6c, 0x18, 0x2c, 0x83, +0x69, 0xd1, 0xb7, 0x86, 0x14, 0xf5, 0x0e, 0x06, 0x5b, 0x64, 0x05, 0x5d, 0x5f, 0x04, 0xd7, 0x20, +0x3a, 0x4b, 0x39, 0xbc, 0xa5, 0xb2, 0x57, 0x3a, 0xee, 0xdb, 0x77, 0xc2, 0xb0, 0x04, 0xf6, 0x8a, +0xf4, 0xc5, 0xb5, 0x95, 0xd6, 0xf9, 0x94, 0xc5, 0xa4, 0x36, 0x2d, 0x49, 0xd9, 0x85, 0xab, 0xd1, +0xa2, 0x91, 0x10, 0x29, 0x69, 0x85, 0xec, 0xa3, 0xb9, 0xbf, 0xb6, 0x14, 0xa3, 0x19, 0xa4, 0x4d, +0x60, 0x48, 0xb2, 0x01, 0x15, 0x6b, 0xb3, 0x8e, 0x7f, 0xa8, 0x17, 0x65, 0xe3, 0xac, 0xe9, 0x00, +0xad, 0xa0, 0xab, 0x1e, 0x37, 0xef, 0x66, 0xbc, 0x09, 0xf6, 0x72, 0xba, 0x9f, 0x06, 0x95, 0xca, +0x25, 0x2a, 0x0c, 0x59, 0x61, 0x92, 0x0a, 0xa0, 0xfa, 0xbf, 0x96, 0x14, 0x7f, 0x59, 0xa4, 0x5d, +0xd8, 0xce, 0x1e, 0x50, 0x0d, 0x44, 0x23, 0xef, 0xa9, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, 0x14, 0x27, 0x05, 0x12, +0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, 0xea, 0xf5, 0x6e, 0x46, +0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, 0xb0, 0x84, 0xb6, 0x6a, +0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, 0xf5, 0xa9, 0x6c, 0xb1, +0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, 0x92, 0x3c, 0x72, 0x54, +0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, 0x15, 0x34, 0x6e, 0xd6, +0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, 0x1b, 0xe9, 0x4c, 0xc1, +0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, 0xdd, 0xa9, 0x6b, 0x41, +0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, 0x74, 0xeb, 0x48, 0x42, +0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, 0xd6, 0xb9, 0x4e, 0x34, +0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, 0xad, 0xa0, 0xe8, 0x73, +0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, 0xa0, 0xe5, 0x66, 0x43, +0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, 0x87, 0xb1, 0x33, 0xa5, +0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, 0x85, 0xd5, 0xbe, 0x7e, +0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, 0x9d, 0x8e, 0xb9, 0xe8, +0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, 0xbc, 0x79, 0xb4, 0x65, +0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, 0x63, 0x29, 0x65, 0x3c, +0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, 0x1c, 0xc8, 0x5c, 0x39, +0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, 0x73, 0x3a, 0x41, 0x30, +0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, 0xda, 0xf5, 0xe0, 0x83, +0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, 0x5b, 0x6f, 0x29, 0x20, +0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0xf6, 0x8a, +0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, 0xf8, 0xdc, 0x7f, 0xd1, +0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, 0xf7, 0xef, 0x88, 0x4d, +0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, 0x63, 0xed, 0xea, 0x00, +0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, 0x76, 0x0d, 0x7a, 0xca, +0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, 0xc1, 0x52, 0x9f, 0x5d, +0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, 0xdb, 0x0a, 0x1c, 0x19, +0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, 0xb3, 0x83, 0x37, 0x2b, +0xd5, 0x5d, 0xe1, 0x73, 0x0d, 0x44, 0x23, 0xef, 0xa0, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, 0x14, 0x27, 0x05, 0x12, +0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, 0xea, 0xf5, 0x6e, 0x46, +0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, 0xb0, 0x84, 0xb6, 0x6a, +0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, 0xf5, 0xa9, 0x6c, 0xb1, +0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, 0x92, 0x3c, 0x72, 0x54, +0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, 0x15, 0x34, 0x6e, 0xd6, +0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, 0x1b, 0xe9, 0x4c, 0xc1, +0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, 0xdd, 0xa9, 0x6b, 0x41, +0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, 0x74, 0xeb, 0x48, 0x42, +0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, 0xd6, 0xb9, 0x4e, 0x34, +0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, 0xad, 0xa0, 0xe8, 0x73, +0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, 0xa0, 0xe5, 0x66, 0x43, +0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, 0x87, 0xb1, 0x33, 0xa5, +0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, 0x85, 0xd5, 0xbe, 0x7e, +0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, 0x9d, 0x8e, 0xb9, 0xe8, +0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, 0xbc, 0x79, 0xb4, 0x65, +0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, 0x63, 0x29, 0x65, 0x3c, +0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, 0x1c, 0xc8, 0x5c, 0x39, +0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, 0x73, 0x3a, 0x41, 0x30, +0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, 0xda, 0xf5, 0xe0, 0x83, +0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, 0x5b, 0x6f, 0x29, 0x20, +0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0xf6, 0x8a, +0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, 0xf8, 0xdc, 0x7f, 0xd1, +0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, 0xf7, 0xef, 0x88, 0x4d, +0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, 0x63, 0xed, 0xea, 0x00, +0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, 0x76, 0x0d, 0x7a, 0xca, +0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, 0xc1, 0x52, 0x9f, 0x5d, +0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, 0xdb, 0x0a, 0x1c, 0x19, +0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, 0xb3, 0x83, 0x37, 0x2b, +0xd5, 0x5d, 0xe1, 0x73, 0x0d, 0x44, 0x23, 0xef, 0xf7, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, 0x14, 0x27, 0x05, 0x12, +0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, 0xea, 0xf5, 0x6e, 0x46, +0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, 0xb0, 0x84, 0xb6, 0x6a, +0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, 0xf5, 0xa9, 0x6c, 0xb1, +0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, 0x92, 0x3c, 0x72, 0x54, +0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, 0x15, 0x34, 0x6e, 0xd6, +0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, 0x1b, 0xe9, 0x4c, 0xc1, +0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, 0xdd, 0xa9, 0x6b, 0x41, +0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, 0x74, 0xeb, 0x48, 0x42, +0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, 0xd6, 0xb9, 0x4e, 0x34, +0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, 0xad, 0xa0, 0xe8, 0x73, +0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, 0xa0, 0xe5, 0x66, 0x43, +0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, 0x87, 0xb1, 0x33, 0xa5, +0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, 0x85, 0xd5, 0xbe, 0x7e, +0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, 0x9d, 0x8e, 0xb9, 0xe8, +0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, 0xbc, 0x79, 0xb4, 0x65, +0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, 0x63, 0x29, 0x65, 0x3c, +0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, 0x1c, 0xc8, 0x5c, 0x39, +0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, 0x73, 0x3a, 0x41, 0x30, +0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, 0xda, 0xf5, 0xe0, 0x83, +0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, 0x5b, 0x6f, 0x29, 0x20, +0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0xf6, 0x8a, +0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, 0xf8, 0xdc, 0x7f, 0xd1, +0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, 0xf7, 0xef, 0x88, 0x4d, +0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, 0x63, 0xed, 0xea, 0x00, +0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, 0x76, 0x0d, 0x7a, 0xca, +0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, 0xc1, 0x52, 0x9f, 0x5d, +0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, 0xdb, 0x0a, 0x1c, 0x19, +0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, 0xb3, 0x83, 0x37, 0x2b, +0xd5, 0x5d, 0xe1, 0x73, 0x0d, 0x44, 0x23, 0xef, 0xde, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, +0x1c, 0xe4, 0x13, 0xcc, 0x9f, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, +0xec, 0x49, 0x77, 0xb6, 0x28, 0x44, 0xf6, 0x0b, 0xc5, 0xf5, 0x70, 0x3d, 0x14, 0x27, 0x05, 0x12, +0x41, 0xb3, 0x91, 0x8d, 0x3b, 0xbb, 0xd3, 0x75, 0xac, 0x18, 0xfe, 0x86, 0xea, 0xf5, 0x6e, 0x46, +0x93, 0xa1, 0xb7, 0x21, 0x02, 0x9c, 0x42, 0x2c, 0x9f, 0x27, 0x7a, 0xc3, 0xb0, 0x84, 0xb6, 0x6a, +0xf7, 0xc8, 0xbb, 0x27, 0xd2, 0xe0, 0xe4, 0x7c, 0x7d, 0xab, 0x18, 0x56, 0xf5, 0xa9, 0x6c, 0xb1, +0x22, 0xdb, 0x8e, 0x0b, 0x03, 0x1a, 0x83, 0x4d, 0x60, 0x4a, 0x00, 0xa1, 0x92, 0x3c, 0x72, 0x54, +0xa3, 0xc0, 0x1a, 0x50, 0xe4, 0x28, 0x8c, 0x51, 0x4f, 0x13, 0xdc, 0x81, 0x15, 0x34, 0x6e, 0xd6, +0x1b, 0xb4, 0x4e, 0x38, 0x61, 0x2e, 0x0b, 0x92, 0xff, 0xc3, 0x14, 0x55, 0x1b, 0xe9, 0x4c, 0xc1, +0x0a, 0x9e, 0x7c, 0xda, 0x2f, 0x4e, 0x79, 0x58, 0x66, 0x90, 0x1e, 0x50, 0xdd, 0xa9, 0x6b, 0x41, +0xd4, 0x5a, 0x00, 0x02, 0x86, 0x91, 0xc2, 0x6e, 0xee, 0x02, 0x7a, 0x47, 0x74, 0xeb, 0x48, 0x42, +0x49, 0xc7, 0x97, 0x12, 0xbb, 0x98, 0x44, 0x2d, 0x4c, 0x9a, 0xc0, 0xa3, 0xd6, 0xb9, 0x4e, 0x34, +0xe2, 0x85, 0xc1, 0xa2, 0xc6, 0xe8, 0x2e, 0x44, 0xe4, 0x54, 0x5d, 0x31, 0xad, 0xa0, 0xe8, 0x73, +0x2b, 0xc3, 0x1a, 0x57, 0xe8, 0xec, 0x6a, 0x41, 0x0e, 0x47, 0x60, 0x32, 0xa0, 0xe5, 0x66, 0x43, +0x4d, 0x16, 0x63, 0xb2, 0x30, 0xf8, 0x76, 0xcb, 0xa5, 0x01, 0xe3, 0x89, 0x87, 0xb1, 0x33, 0xa5, +0x4a, 0xbc, 0x93, 0x8b, 0x3a, 0xda, 0xb7, 0x75, 0xf0, 0x00, 0xf9, 0x06, 0x85, 0xd5, 0xbe, 0x7e, +0xa9, 0xc6, 0x3b, 0x66, 0xe4, 0x6d, 0x8a, 0xd0, 0x9c, 0x73, 0x2e, 0xd9, 0x9d, 0x8e, 0xb9, 0xe8, +0xc0, 0x59, 0xb1, 0x9f, 0xbf, 0x7f, 0xb1, 0x64, 0xf0, 0x16, 0x9d, 0x97, 0xbc, 0x79, 0xb4, 0x65, +0x68, 0x0c, 0x79, 0x47, 0xe2, 0x71, 0x1e, 0x22, 0x37, 0x5f, 0xa6, 0x1c, 0x63, 0x29, 0x65, 0x3c, +0xc8, 0xd6, 0x22, 0x52, 0xe2, 0x28, 0x8c, 0x51, 0x54, 0xdf, 0x14, 0xd1, 0x1c, 0xc8, 0x5c, 0x39, +0x4b, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0x76, 0xca, 0x19, 0x75, 0x2d, 0x59, 0x73, 0x3a, 0x41, 0x30, +0x50, 0x9b, 0xc0, 0xa3, 0xa2, 0x4a, 0xb6, 0x64, 0xf4, 0x4c, 0x59, 0x37, 0xda, 0xf5, 0xe0, 0x83, +0x68, 0x07, 0xfa, 0x86, 0xd5, 0xc3, 0xfa, 0x06, 0x43, 0x64, 0x25, 0x5d, 0x5b, 0x6f, 0x29, 0x20, +0xac, 0xd3, 0x6e, 0xbc, 0x33, 0xc7, 0x55, 0x3a, 0x6c, 0xcb, 0x77, 0xc2, 0xb6, 0x04, 0xf6, 0x8a, +0xf9, 0xc5, 0x95, 0x95, 0x49, 0xed, 0x7c, 0xc5, 0xa0, 0xb4, 0x0d, 0x49, 0xf8, 0xdc, 0x7f, 0xd1, +0xa2, 0x33, 0x4c, 0x29, 0xdb, 0x76, 0x1f, 0xa3, 0xfa, 0xbf, 0x96, 0x14, 0xf7, 0xef, 0x88, 0x4d, +0x60, 0x12, 0xfc, 0x01, 0x09, 0x14, 0xfe, 0x8e, 0x86, 0x3f, 0x40, 0x65, 0x63, 0xed, 0xea, 0x00, +0xad, 0x5b, 0xb2, 0x1e, 0x00, 0xdf, 0x61, 0xbc, 0x14, 0xf6, 0x72, 0xba, 0x76, 0x0d, 0x7a, 0xca, +0xdf, 0xb5, 0x2c, 0x59, 0xcc, 0x91, 0x30, 0xa0, 0xee, 0x0d, 0x9e, 0x14, 0xc1, 0x52, 0x9f, 0x5d, +0x0e, 0xd9, 0x23, 0x50, 0xe1, 0x28, 0x8c, 0xd1, 0x0d, 0xbc, 0x11, 0xc9, 0xdb, 0x0a, 0x1c, 0x19, +0xcf, 0x3a, 0xe0, 0x5c, 0x73, 0xa1, 0x21, 0x20, 0x7b, 0x28, 0x4b, 0xac, 0xb3, 0x83, 0x37, 0x2b, +0xd5, 0x5d, 0xe1, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x08, 0x00, 0x00, +0x26, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, +0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, +0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, +0xd0, 0xfe, 0x3f, 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, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x40, 0x17, 0x00, 0x00, 0x26, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0xfd, 0xe3, 0x1f, 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, 0xca, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x26, 0x04, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, +0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, +0x46, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, +0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 0x00, +0xd0, 0xfe, 0x3f, 0x00, 0xd0, 0xfe, 0x3f, 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, 0xca, 0x00, 0x00, 0x60, 0xcc, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 0x00, 0x40, 0x15, 0x00, 0x00, +0xc0, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, +0x66, 0x04, 0x00, 0x00, 0x86, 0x04, 0x00, 0x00, 0xa6, 0x04, 0x00, 0x00, 0xc6, 0x04, 0x00, 0x00, +0xe6, 0x04, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, 0x46, 0x05, 0x00, 0x00, +0x66, 0x05, 0x00, 0x00, 0x86, 0x05, 0x00, 0x00, 0xa6, 0x05, 0x00, 0x00, 0xc6, 0x05, 0x00, 0x00, +0xe6, 0x05, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00, +0x66, 0x06, 0x00, 0x00, 0x86, 0x06, 0x00, 0x00, 0xa6, 0x06, 0x00, 0x00, 0xc6, 0x06, 0x00, 0x00, +0xe6, 0x06, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, +0x66, 0x07, 0x00, 0x00, 0x86, 0x07, 0x00, 0x00, 0xa6, 0x07, 0x00, 0x00, 0xc6, 0x07, 0x00, 0x00, +0xe6, 0x07, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x9f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xbf, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xef, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x76, 0x01, 0x00, 0xa0, 0x02, 0x00, 0x00, +0x10, 0x03, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, +0xb0, 0x06, 0x00, 0x00, 0x90, 0x0e, 0x00, 0x00, 0xb0, 0x07, 0x00, 0x00, 0xa0, 0x46, 0x00, 0x00, +0xc0, 0x5d, 0x00, 0x00, 0x20, 0x53, 0x00, 0x00, 0x50, 0x5a, 0x00, 0x00, 0x20, 0x53, 0x00, 0x00, +0x60, 0x31, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, +0x90, 0x02, 0x00, 0x00, 0xf0, 0x6b, 0x01, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x01, 0x00, 0x80, 0x00, +0x01, 0x00, 0x80, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x7f, 0x00, +0x01, 0x00, 0x80, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x19, 0x00, +0x4e, 0x02, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, +0xea, 0x65, 0x00, 0x00, 0xea, 0x65, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x59, 0xdb, 0x10, 0x00, 0xa6, 0x24, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0x1d, 0x00, +0xde, 0xe6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0x1d, 0x00, 0xde, 0xe6, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0x1d, 0x00, 0xde, 0xe6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, +0xe6, 0xc1, 0x08, 0x00, 0xc9, 0x2f, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x69, 0x0a, 0x00, +0x38, 0xfd, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x7d, 0x0c, 0x00, 0x4b, 0xea, 0x4d, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0xa4, 0x0e, 0x00, 0xcf, 0x4c, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, +0x29, 0xea, 0x4b, 0x00, 0x3c, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xea, 0x4b, 0x00, +0x3c, 0x94, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, +0xcd, 0xcc, 0xcc, 0x00, 0x33, 0x33, 0x33, 0x00, 0xcd, 0xcc, 0xcc, 0x00, 0xcd, 0xcc, 0xcc, 0x00, +0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, +0xc0, 0x15, 0x00, 0x00, 0x50, 0x1a, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xb0, 0x26, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x60, 0x96, 0x06, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0xc0, 0x14, 0x00, 0x00, 0xe0, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x20, 0x15, 0x00, 0x00, +0x00, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 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, 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, 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, +0x60, 0x96, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x60, 0x17, 0x00, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0xa0, 0x8f, 0x3e, 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, 0x60, 0xa0, 0x06, 0x00, +0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x17, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa0, 0x8f, 0x3e, 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, 0x60, 0xaa, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x17, 0x00, 0x00, +0xa0, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa0, 0x8f, 0x3e, 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, 0x60, 0xb4, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x17, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, 0xa0, 0x8f, 0x3e, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, +0xa8, 0x27, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0x60, 0x28, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x98, 0x0a, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, +0xfc, 0x28, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x0b, 0x00, 0x00, 0xec, 0x12, 0x00, 0x00, +0xb4, 0x29, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xca, 0x00, 0x00, 0x60, 0xcc, 0x05, 0x00, 0x14, 0x1e, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, +0x5c, 0x32, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0x96, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0xd0, 0x33, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0x96, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xd4, 0x21, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0x6c, 0x34, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0xa0, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xc4, 0x23, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0x08, 0x35, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0xaa, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xb4, 0x25, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, +0xa4, 0x35, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x60, 0xb4, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x78, 0xd2, 0x61, 0x28, 0x96, 0x43, 0x23, 0xc8, +0xc9, 0xbd, 0x98, 0xed, 0xf9, 0x7d, 0xc4, 0x15, 0x62, 0x69, 0xbe, 0x7a, 0x43, 0x5a, 0x36, 0xce, +0xc6, 0x3b, 0x55, 0x8e, 0x49, 0xe5, 0xf0, 0x2f, 0x55, 0x63, 0xb9, 0xfc, 0x84, 0xba, 0xe6, 0xa6, +0x9a, 0x45, 0xac, 0x03, 0x08, 0x7c, 0x47, 0xd6, 0xc2, 0x39, 0x56, 0x8e, 0xc9, 0xa5, 0x50, 0xdf, +0x3d, 0x77, 0x33, 0x3f, 0xe2, 0x09, 0x1e, 0x3a, 0x90, 0xde, 0xe7, 0x65, 0xf5, 0x93, 0xdb, 0x1c, + +}; +#define DSSTDFX_SIZE sizeof(dsstdfx) diff --git a/Cerbios Bios/older versions/externals.h b/Cerbios Bios/older versions/externals.h new file mode 100644 index 0000000..6383013 --- /dev/null +++ b/Cerbios Bios/older versions/externals.h @@ -0,0 +1,1526 @@ +// Thanks and credit to everlame, Team Evox, and Woodoo. +// +// This file contains declarations for accessing the internal NT API. +// Some calls have changed from NT, so be careful! +// +// For the most part, all NT calls use ANSI instead of Unicode strings now. +// +// It is not known which flags work. You will have to experiment. + +#ifndef __XBOX_INTERNAL_H__ +#define __XBOX_INTERNAL_H__ + +#include + +// Do extern "C" for C++ +#if defined(__cplusplus) && !defined(XBOXINTERNAL_NO_EXTERN_C) +extern "C" { +#endif // __cplusplus + + +// Don't do __declspec(dllimport) for things like emulators +#if defined(NTSYSAPI) && defined(DONT_IMPORT_INTERNAL) +#undef NTSYSAPI +#endif +#ifdef DONT_IMPORT_INTERNAL +#define NTSYSAPI +#endif + +// The normal headers don't have this...? +#define FASTCALL __fastcall + +// The usual NTSTATUS +typedef LONG NTSTATUS; + +// The usual NT_SUCCESS +#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) + +// Just for documentation +#define EXPORTNUM(x) + + +// Needed for object structures and related things +typedef CONST SHORT CSHORT; + + +// String types +typedef CHAR *PSZ; +typedef CONST CHAR *PCSZ; + +// ANSI_STRING +// Differences from NT: None. +typedef struct _STRING { + USHORT Length; + USHORT MaximumLength; + PCHAR Buffer; +} STRING; +typedef STRING *PSTRING; + +typedef STRING ANSI_STRING; +typedef PSTRING PANSI_STRING; + + +// IO Status Block type (UNVERIFIED) +// Differences from NT: None. +typedef struct _IO_STATUS_BLOCK { + union { + NTSTATUS Status; + PVOID Pointer; + }; + + ULONG_PTR Information; +} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; + +// APC routine +typedef +VOID +(NTAPI *PIO_APC_ROUTINE) ( + IN PVOID ApcContext, + IN PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG Reserved + ); + + +// Header for dispatcher objects +// Differences from NT: None. +typedef struct _DISPATCHER_HEADER { + UCHAR Type; + UCHAR Absolute; + UCHAR Size; + UCHAR Inserted; + LONG SignalState; + LIST_ENTRY WaitListHead; +} DISPATCHER_HEADER; + + +// Object types +#define NotificationTimerObject 8 +#define SynchronizationTimerObject 9 +#define DpcObject 19 + + +// Object Attributes type +// Differences from NT: There are no Length, SecurityDescriptor, or +// SecurityQualityOfService fields. Also, ObjectName is ANSI, not +// Unicode. +typedef struct _OBJECT_ATTRIBUTES { + HANDLE RootDirectory; + PANSI_STRING ObjectName; + ULONG Attributes; +} OBJECT_ATTRIBUTES; +typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES; + +// Flags for OBJECT_ATTRIBUTES::Attributes +#define OBJ_INHERIT 0x00000002L +#define OBJ_PERMANENT 0x00000010L +#define OBJ_EXCLUSIVE 0x00000020L +#define OBJ_CASE_INSENSITIVE 0x00000040L +#define OBJ_OPENIF 0x00000080L +#define OBJ_OPENLINK 0x00000100L +#define OBJ_KERNEL_HANDLE 0x00000200L +#define OBJ_VALID_ATTRIBUTES 0x000003F2L + +// Initializes an OBJECT_ATTRIBUTES. +// Works as if it were this function: +// VOID +// InitializeObjectAttributes( +// OUT POBJECT_ATTRIBUTES p, +// IN PANSI_STRING n, +// IN ULONG a, +// IN HANDLE r +// ) +// Differences from NT: SECURITY_DESCRIPTOR support is gone. +#define InitializeObjectAttributes( p, n, a, r ) { \ + (p)->RootDirectory = r; \ + (p)->Attributes = a; \ + (p)->ObjectName = n; \ + } + + +// CreateDisposition values for NtCreateFile() +#define FILE_SUPERSEDE 0x00000000 +#define FILE_OPEN 0x00000001 +#define FILE_CREATE 0x00000002 +#define FILE_OPEN_IF 0x00000003 +#define FILE_OVERWRITE 0x00000004 +#define FILE_OVERWRITE_IF 0x00000005 +#define FILE_MAXIMUM_DISPOSITION 0x00000005 + +// CreateOption values for NtCreateFile() +// FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT is what CreateFile +// uses for most things when translating to NtCreateFile. +#define FILE_DIRECTORY_FILE 0x00000001 +#define FILE_WRITE_THROUGH 0x00000002 +#define FILE_SEQUENTIAL_ONLY 0x00000004 +#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 +#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 +#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 +#define FILE_NON_DIRECTORY_FILE 0x00000040 +#define FILE_CREATE_TREE_CONNECTION 0x00000080 +#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 +#define FILE_NO_EA_KNOWLEDGE 0x00000200 +#define FILE_OPEN_FOR_RECOVERY 0x00000400 +#define FILE_RANDOM_ACCESS 0x00000800 +#define FILE_DELETE_ON_CLOSE 0x00001000 +#define FILE_OPEN_BY_FILE_ID 0x00002000 +#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 +#define FILE_NO_COMPRESSION 0x00008000 +#define FILE_RESERVE_OPFILTER 0x00100000 +#define FILE_OPEN_REPARSE_POINT 0x00200000 +#define FILE_OPEN_NO_RECALL 0x00400000 +#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 +#define FILE_COPY_STRUCTURED_STORAGE 0x00000041 +#define FILE_STRUCTURED_STORAGE 0x00000441 +#define FILE_VALID_OPTION_FLAGS 0x00ffffff +#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 +#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 +#define FILE_VALID_SET_FLAGS 0x00000036 + + +// NtQueryVolumeInformation / NtSetVolumeInformation stuff +// Type of information to retrieve; FileFsSizeInformation and +// FileFsDeviceInformation are the only ones confirmed to work. +typedef enum _FSINFOCLASS { + FileFsVolumeInformation = 1, + FileFsLabelInformation, + FileFsSizeInformation, + FileFsDeviceInformation, + FileFsAttributeInformation, + FileFsControlInformation, + FileFsFullSizeInformation, + FileFsObjectInformation +} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; + +// Structure of FileFsSizeInformation +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +#ifndef DEVICE_TYPE +#define DEVICE_TYPE ULONG +#endif +// Structure of FileFsDeviceInformation +typedef struct _FILE_FS_DEVICE_INFORMATION { + DEVICE_TYPE DeviceType; + ULONG Characteristics; +} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; + +// DEVICE_TYPEs (I took a guess as to which the XBOX might have.) +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 + +// Characteristics +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 + + + +// Physical address +// Differences from NT: 32 bit address instead of 64. +typedef ULONG PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS; + + +// NtCreateFile/NtOpenFile stuff +#define FILE_SUPERSEDED 0x00000000 +#define FILE_OPENED 0x00000001 +#define FILE_CREATED 0x00000002 +#define FILE_OVERWRITTEN 0x00000003 +#define FILE_EXISTS 0x00000004 +#define FILE_DOES_NOT_EXIST 0x00000005 + +// NtReadFile/NtWriteFile stuff +#define FILE_WRITE_TO_END_OF_FILE 0xffffffff +#define FILE_USE_FILE_POINTER_POSITION 0xfffffffe + + + +// DeviceIoControl stuff + +// Device types +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_SCSI FILE_DEVICE_CONTROLLER +#define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_DVD 0x00000033 + +// Access types +#define FILE_ANY_ACCESS 0 +#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe +#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe + +// Method types +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 + +// The all-important CTL_CODE +#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ +) + +// +// LBA48 Partition Table +// + +#define IOCTL_CMD_LBA48_ACCESS 0xcafebabe + +typedef struct _PARTITION_ENTRY { + UCHAR Name[16]; + ULONG Flags; + ULONG Start; + ULONG Size; + USHORT StartH; + USHORT SizeH; +} PARTITION_ENTRY, *PPARTITION_ENTRY; + +typedef struct _PARTITION_TABLE { + UCHAR Magic[16]; + UCHAR Reserved1[0x20]; + PARTITION_ENTRY Partitions[14]; + UCHAR Reserved2[0x90]; +} PARTITION_TABLE, *PPARTITION_TABLE; + +typedef struct _LBA48_PATCH { + ULONG Magic[2]; + ULONG PatchCodeVersion; + ULONG LowCodeBase; + ULONG HighCodeBase; + ULONG PatchSegSize; + PPARTITION_TABLE PartitionTable; +} LBA48_PATCH, *PLBA48_PATCH; + + +// IDE/SCSI codes +// IOCTL_SCSI_PASS_THROUGH_DIRECT is the only one known to be used. +// Differences from NT: None. +#define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_GET_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_FREE_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0409, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_IDE_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_CDROM_RAW_READ CTL_CODE(FILE_DEVICE_CD_ROM, 0x000F, METHOD_OUT_DIRECT, FILE_READ_ACCESS) +// Special XBOX code? +#define IOCTL_CDROM_AUTHENTICATE_DISK CTL_CODE(FILE_DEVICE_CD_ROM, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS) + +typedef enum _TRACK_MODE_TYPE { + YellowMode2, + XAForm2, + CDDA +} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE; +typedef struct __RAW_READ_INFO { + LARGE_INTEGER DiskOffset; + ULONG SectorCount; + TRACK_MODE_TYPE TrackMode; +} RAW_READ_INFO, *PRAW_READ_INFO; + +// Structure for IOCTL_SCSI_PASS_THROUGH_DIRECT +// Differences from NT: None, believe it or not. +typedef struct _SCSI_PASS_THROUGH_DIRECT { + /*000*/ USHORT Length; + /*002*/ UCHAR ScsiStatus; + /*003*/ UCHAR PathId; + /*004*/ UCHAR TargetId; + /*005*/ UCHAR Lun; + /*006*/ UCHAR CdbLength; + /*007*/ UCHAR SenseInfoLength; + /*008*/ UCHAR DataIn; + /*00C*/ ULONG DataTransferLength; + /*010*/ ULONG TimeOutValue; + /*014*/ PVOID DataBuffer; + /*018*/ ULONG SenseInfoOffset; + /*01C*/ UCHAR Cdb[16]; +}SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; + +// DataIn fields for IOCTL_SCSI_PASS_THROUGH_DIRECT +#define SCSI_IOCTL_DATA_OUT 0 +#define SCSI_IOCTL_DATA_IN 1 +#define SCSI_IOCTL_DATA_UNSPECIFIED 2 + +// Kernel object type (unsure about the structure...) +typedef struct _OBJECT_TYPE +{ + // Same prototype as ExAllocatePoolWithTag, because that's the usual one + PVOID + (NTAPI *AllocationFunction)( + SIZE_T NumberOfBytes, + ULONG Tag + ); + + // Same prototype as ExFreePool, because that's the usual one + VOID + (NTAPI *FreeFunction)( + IN PVOID P + ); + + // The prototypes of these are unknown + void *CloseFunction; + void *DeleteFunction; + void *ParseFunction; + + // Unknown DWORD... Size of this object type maybe? + void *DefaultObjectMaybe; + + // 4 letter tag for this object type + CHAR Tag[4]; +} OBJECT_TYPE; +typedef OBJECT_TYPE *POBJECT_TYPE; + +// Object types +extern POBJECT_TYPE IoFileObjectType; +extern POBJECT_TYPE ExEventObjectType; +extern POBJECT_TYPE ExSemaphoreObjectType; +extern POBJECT_TYPE IoCompletionObjectType; +extern POBJECT_TYPE IoDeviceObjectType; + + +// *_OBJECT and related structures (mostly opaque since I'm lazy) +typedef struct _DRIVER_OBJECT { + CSHORT Type; + CSHORT Size; + struct _DEVICE_OBJECT *DeviceObject; + // ... +} DRIVER_OBJECT; +typedef DRIVER_OBJECT *PDRIVER_OBJECT; + +typedef struct _DEVICE_OBJECT { + CSHORT Type; + USHORT Size; + LONG ReferenceCount; + PDRIVER_OBJECT DriverObject; + // ... +} DEVICE_OBJECT; +typedef DEVICE_OBJECT *PDEVICE_OBJECT; + +typedef struct _FILE_OBJECT { + CSHORT Type; + CSHORT Size; + PDEVICE_OBJECT DeviceObject; + // ... +} FILE_OBJECT; +typedef FILE_OBJECT *PFILE_OBJECT; + + +// Thread information structures + +// IRQL +typedef UCHAR KIRQL, *PKIRQL; +#define PASSIVE_LEVEL 0 // Passive release level +#define LOW_LEVEL 0 // Lowest interrupt level +#define APC_LEVEL 1 // APC interrupt level +#define DISPATCH_LEVEL 2 // Dispatcher level + +// Thread entry point +// NOTE: This is not a standard call! You can't call this function from C code! +// You push registers like stdcall, but ebp + 4 must point to the first argument before the call! +// +// Differences from NT: 2 parameters instead of 1; strange calling convention +typedef +VOID +(NTAPI *PKSTART_ROUTINE) ( + IN PVOID StartContext1, + IN PVOID StartContext2 + ); + +// Structure of a critical section +// Same as the XBOX's RTL_CRITICAL_SECTION, but with the more explicit header +typedef struct _KCRITICAL_SECTION +{ + // 000 Dispatcher header + DISPATCHER_HEADER Header; + // 010 Lock count of the critical section + LONG LockCount; + // 014 Recursion count of the critical section + LONG RecursionCount; + // 018 Thread ID of the thread that currently owns this critical section + ULONG OwningThread; +} KCRITICAL_SECTION, *PKCRITICAL_SECTION; + +// Structure of a thread object +typedef struct _KTHREAD +{ + // 000 Dispatcher header + DISPATCHER_HEADER Header; + // 010 Unknown + BYTE unknown[0x18]; + // 028 Pointer to TLS data + PVOID TlsData; + // ??? just padding - real size is unknown + BYTE unknown2[0x100]; +} KTHREAD, *PKTHREAD; + +// Structure of the data at FS +typedef struct _FS_STRUCTURE +{ + // 000 Current exception handler information + PVOID *ExceptionFrame; + // 004 Pointer to current TLS data top + PVOID TlsDataTop; + // 008 + BYTE unknown2[0x1C]; + // 024 Current IRQL of the OS + KIRQL CurrentIrql; + // 028 Thread structure of the current thread + PKTHREAD ThreadObject; + // ??? just padding - real size is unknown + BYTE unknown3[0x100]; +} FS_STRUCTURE, *PFS_STRUCTURE; + +// DPC routine +typedef +VOID +(*PKDEFERRED_ROUTINE) ( + IN struct _KDPC *Dpc, + IN PVOID DeferredContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2 + ); + +// DPC information +// It's not known which of these fields are used on XBOX. +typedef struct _KDPC { + CSHORT Type; + UCHAR Number; + UCHAR Importance; + LIST_ENTRY DpcListEntry; + PKDEFERRED_ROUTINE DeferredRoutine; + PVOID DeferredContext; + PVOID SystemArgument1; + PVOID SystemArgument2; + PULONG_PTR Lock; +} KDPC, *PKDPC; + + +// Timers +typedef enum _TIMER_TYPE { + NotificationTimer, + SynchronizationTimer + } TIMER_TYPE; + +typedef struct _KTIMER { + DISPATCHER_HEADER Header; + ULARGE_INTEGER DueTime; + LIST_ENTRY TimerListEntry; + struct _KDPC *Dpc; + LONG Period; +} KTIMER, *PKTIMER; + + + +// XBE stuff +// Not used in any exported kernel calls, but still useful. + + +// XBE header information +typedef struct _XBE_HEADER { + // 000 "XBEH" + CHAR Magic[4]; + // 004 RSA digital signature of the entire header area + UCHAR HeaderSignature[256]; + // 104 Base address of XBE image (must be 0x00010000?) + PVOID BaseAddress; + // 108 Size of all headers combined - other headers must be within this + ULONG HeaderSize; + // 10C Size of entire image + ULONG ImageSize; + // 110 Size of this header (always 0x178?) + ULONG XbeHeaderSize; + // 114 Image timestamp - unknown format + ULONG Timestamp; + // 118 Pointer to certificate data (must be within HeaderSize) + struct _XBE_CERTIFICATE *Certificate; + // 11C Number of sections + DWORD NumSections; + // 120 Pointer to section headers (must be within HeaderSize) + struct _XBE_SECTION *Sections; + // 124 Initialization flags + ULONG InitFlags; + // 128 Entry point (XOR'd; see xboxhacker.net) + PVOID EntryPoint; + // 12C Pointer to TLS directory + struct _XBE_TLS_DIRECTORY *TlsDirectory; + // 130 Stack commit size + ULONG StackCommit; + // 134 Heap reserve size + ULONG HeapReserve; + // 138 Heap commit size + ULONG HeapCommit; + // 13C PE base address (?) + PVOID PeBaseAddress; + // 140 PE image size (?) + ULONG PeImageSize; + // 144 PE checksum (?) + ULONG PeChecksum; + // 148 PE timestamp (?) + ULONG PeTimestamp; + // 14C PC path and filename to EXE file from which XBE is derived + PCSZ PcExePath; + // 150 PC filename (last part of PcExePath) from which XBE is derived + PCSZ PcExeFilename; + // 154 PC filename (Unicode version of PcExeFilename) + PWSTR PcExeFilenameUnicode; + // 158 Pointer to kernel thunk table (XOR'd; EFB1F152 debug) + ULONG_PTR *KernelThunkTable; + // 15C Non-kernel import table (debug only) + PVOID DebugImportTable; + // 160 Number of library headers + ULONG NumLibraries; + // 164 Pointer to library headers + struct _XBE_LIBRARY *Libraries; + // 168 Pointer to kernel library header + struct _XBE_LIBRARY *KernelLibrary; + // 16C Pointer to XAPI library + struct _XBE_LIBRARY *XapiLibrary; + // 170 Pointer to logo bitmap (NULL = use default of Microsoft) + PVOID LogoBitmap; + // 174 Size of logo bitmap + ULONG LogoBitmapSize; + // 178 +} XBE_HEADER, *PXBE_HEADER; + +// Certificate structure +typedef struct _XBE_CERTIFICATE { + // 000 Size of certificate + ULONG Size; + // 004 Certificate timestamp (unknown format) + ULONG Timestamp; + // 008 Title ID + ULONG TitleId; + // 00C Name of the game (Unicode) + WCHAR TitleName[40]; + // 05C Alternate title ID's (0-terminated) + ULONG AlternateTitleIds[16]; + // 09C Allowed media types - 1 bit match between XBE and media = boots + ULONG MediaTypes; + // 0A0 Allowed game regions - 1 bit match between this and XBOX = boots + ULONG GameRegion; + // 0A4 Allowed game ratings - 1 bit match between this and XBOX = boots + ULONG GameRating; + // 0A8 Disk number (?) + ULONG DiskNumber; + // 0AC Version (?) + ULONG Version; + // 0B0 LAN key for this game + UCHAR LanKey[16]; + // 0C0 Signature key for this game + UCHAR SignatureKey[16]; + // 0D0 Signature keys for the alternate title ID's + UCHAR AlternateSignatureKeys[16][16]; + // 1D0 +} XBE_CERTIFICATE, *PXBE_CERTIFICATE; + +// Section headers +typedef struct _XBE_SECTION { + // 000 Flags + ULONG Flags; + // 004 Virtual address (where this section loads in RAM) + PVOID VirtualAddress; + // 008 Virtual size (size of section in RAM; after FileSize it's 00'd) + ULONG VirtualSize; + // 00C File address (where in the file from which this section comes) + ULONG FileAddress; + // 010 File size (size of the section in the XBE file) + ULONG FileSize; + // 014 Pointer to section name + PCSZ SectionName; + // 018 Section reference count - when >= 1, section is loaded + LONG SectionReferenceCount; + // 01C Pointer to head shared page reference count + WORD *HeadReferenceCount; + // 020 Pointer to tail shared page reference count + WORD *TailReferenceCount; + // 024 SHA hash. Hash DWORD containing FileSize, then hash section. + DWORD ShaHash[5]; + // 038 +} XBE_SECTION, *PXBE_SECTION; + +// TLS directory information needed later +// Library version data needed later + +// Initialization flags +#define XBE_INIT_MOUNT_UTILITY 0x00000001 +#define XBE_INIT_FORMAT_UTILITY 0x00000002 +#define XBE_INIT_64M_RAM_ONLY 0x00000004 +#define XBE_INIT_DONT_SETUP_HDD 0x00000008 + +// Region codes +#define XBE_REGION_US_CANADA 0x00000001 +#define XBE_REGION_JAPAN 0x00000002 +#define XBE_REGION_ELSEWHERE 0x00000004 +#define XBE_REGION_DEBUG 0x80000000 + +// Media types +#define XBE_MEDIA_HDD 0x00000001 +#define XBE_MEDIA_XBOX_DVD 0x00000002 +#define XBE_MEDIA_ANY_CD_OR_DVD 0x00000004 +#define XBE_MEDIA_CD 0x00000008 +#define XBE_MEDIA_1LAYER_DVDROM 0x00000010 +#define XBE_MEDIA_2LAYER_DVDROM 0x00000020 +#define XBE_MEDIA_1LAYER_DVDR 0x00000040 +#define XBE_MEDIA_2LAYER_DVDR 0x00000080 +#define XBE_MEDIA_USB 0x00000100 +#define XBE_MEDIA_ALLOW_UNLOCKED_HDD 0x40000000 + +// Section flags +#define XBE_SEC_WRITABLE 0x00000001 +#define XBE_SEC_PRELOAD 0x00000002 +#define XBE_SEC_EXECUTABLE 0x00000004 +#define XBE_SEC_INSERTED_FILE 0x00000008 +#define XBE_SEC_RO_HEAD_PAGE 0x00000010 +#define XBE_SEC_RO_TAIL_PAGE 0x00000020 + + +// x86 page size +#define PAGE_SIZE 0x1000 + + +// Native NT API calls on the XBOX + + +// PAGE_ALIGN: +// Returns an address rounded down to the nearest page boundary. +// +// Differences from NT: None. +#define PAGE_ALIGN(Va) ((PVOID)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) + + +// RtlInitAnsiString: +// Fills an ANSI_STRING structure to use the specified string. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(289) +VOID +NTAPI +RtlInitAnsiString( + OUT PANSI_STRING DestinationString, + IN PCSZ SourceString + ); + + +// NtCreateFile: +// Creates or opens a file or device object. +// +// Differences from NT: The EaBuffer and EaLength options are gone. +// OBJECT_ATTRIBUTES uses ANSI_STRING, so only ANSI filenames work. +NTSYSAPI +EXPORTNUM(190) +NTSTATUS +NTAPI +NtCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions + ); + +// NtOpenFile: +// Opens a file or device object. Same as calling: +// NtCreateFile(FileHandle, DesiredAccess, ObjectAttributes, +// IoStatusBlock, NULL, 0, ShareAccess, OPEN_EXISTING, OpenOptions); +// +// Differences from NT: See NtCreateFile. +NTSYSAPI +EXPORTNUM(202) +NTSTATUS +NTAPI +NtOpenFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG ShareAccess, + IN ULONG OpenOptions + ); + +// NtReadFile: +// Reads a file. +// +// Differences from NT: There is no Key parameter. + +NTSYSAPI +EXPORTNUM(219) +NTSTATUS +NTAPI +NtReadFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset + ); + +//NTSYSAPI +//NTSTATUS +//NTAPI +//NtReadFile( +// IN HANDLE FileHandle, +// IN HANDLE Event OPTIONAL, +// IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, +// IN PVOID ApcContext OPTIONAL, +// OUT PIO_STATUS_BLOCK IoStatusBlock, +// OUT PVOID Buffer, +// IN ULONG Length, +// IN PLARGE_INTEGER ByteOffset OPTIONAL, +// IN PULONG Key OPTIONAL +// ); + +// NtWriteFile: +// Writes a file. +// +// Differences from NT: There is no Key parameter. +NTSYSAPI +EXPORTNUM(236) +NTSTATUS +NTAPI +NtWriteFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset + ); + +typedef enum _FILE_INFORMATION_CLASS { + + FileDirectoryInformation = 1, + FileFullDirectoryInformation, // 2 + FileBothDirectoryInformation, // 3 + FileBasicInformation, // 4 wdm + FileStandardInformation, // 5 wdm + FileInternalInformation, // 6 + FileEaInformation, // 7 + FileAccessInformation, // 8 + FileNameInformation, // 9 + FileRenameInformation, // 10 + FileLinkInformation, // 11 + FileNamesInformation, // 12 + FileDispositionInformation, // 13 + FilePositionInformation, // 14 wdm + FileFullEaInformation, // 15 + FileModeInformation, // 16 + FileAlignmentInformation, // 17 + FileAllInformation, // 18 + FileAllocationInformation, // 19 + FileEndOfFileInformation, // 20 wdm + FileAlternateNameInformation, // 21 + FileStreamInformation, // 22 + FilePipeInformation, // 23 + FilePipeLocalInformation, // 24 + FilePipeRemoteInformation, // 25 + FileMailslotQueryInformation, // 26 + FileMailslotSetInformation, // 27 + FileCompressionInformation, // 28 + FileObjectIdInformation, // 29 + FileCompletionInformation, // 30 + FileMoveClusterInformation, // 31 + FileQuotaInformation, // 32 + FileReparsePointInformation, // 33 + FileNetworkOpenInformation, // 34 + FileAttributeTagInformation, // 35 + FileTrackingInformation, // 36 + FileIdBothDirectoryInformation, // 37 + FileIdFullDirectoryInformation, // 38 + FileValidDataLengthInformation, // 39 + FileShortNameInformation, // 40 + FileMaximumInformation + +} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; + +typedef struct _FILE_NETWORK_OPEN_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG FileAttributes; +} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION; + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + +// NtQueryVolumeInformation: +// Queries information about a file system. This is not documented by +// Microsoft even under NT. +// +// Differences from NT: None known. +NTSYSAPI +EXPORTNUM(218) +NTSTATUS +NTAPI +NtQueryVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID VolumeInformation, + IN ULONG VolumeInformationLength, + IN FS_INFORMATION_CLASS VolumeInformationClass + ); + +// NtDeviceIoControl: +// Does an IOCTL on a device. +// +// Differences from NT: None known. +NTSYSAPI +EXPORTNUM(196) +NTSTATUS +NTAPI +NtDeviceIoControlFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength + ); + +// NtClose: +// Closes a file or other handle. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(187) +NTSTATUS +NTAPI +NtClose( + IN HANDLE Handle + ); + +// NtAllocateVirtualMemory: +// Allocates virtual memory. +// +// Differences from NT: There is no ProcessHandle parameter. +NTSYSAPI +EXPORTNUM(184) +NTSTATUS +NTAPI +NtAllocateVirtualMemory( + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG AllocationSize, + IN ULONG AllocationType, + IN ULONG Protect + ); + +// NtFreeVirtualMemory: +// Frees virtual memory. +// +// Differences from NT: There is no ProcessHandle parameter. +NTSYSAPI +EXPORTNUM(199) +NTSTATUS +NTAPI +NtFreeVirtualMemory( + IN OUT PVOID *BaseAddress, + IN OUT PULONG FreeSize, + IN ULONG FreeType + ); + + +// Kernel-level routines + + +// KeBugCheck: +// Bug checks the kernel. +// Same as KeBugCheckEx(BugCheckCode, 0, 0, 0, 0); +// +// Differences from NT: None, other than the reaction. +NTSYSAPI +EXPORTNUM(95) +VOID +NTAPI +KeBugCheck( + IN ULONG BugCheckCode + ); + +// KeBugCheckEx: +// Bug checks the kernel. +// +// Differences from NT: None, other than the reaction. +NTSYSAPI +EXPORTNUM(96) +VOID +NTAPI +KeBugCheckEx( + IN ULONG BugCheckCode, + IN ULONG_PTR BugCheckParameter1, + IN ULONG_PTR BugCheckParameter2, + IN ULONG_PTR BugCheckParameter3, + IN ULONG_PTR BugCheckParameter4 + ); + +// KeInitializeDpc: +// Initializes a DPC structure. +// +// Differences from NT: This function sets less fields than the NT version. +NTSYSAPI +EXPORTNUM(107) +VOID +NTAPI +KeInitializeDpc( + IN PKDPC Dpc, + IN PKDEFERRED_ROUTINE DeferredRoutine, + IN PVOID DeferredContext + ); + +// KeInitializeTimerEx: +// Initializes a timer. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(113) +VOID +KeInitializeTimerEx( + IN OUT PKTIMER Timer, + IN TIMER_TYPE Type + ); + +// KeRaiseIrql: +// Raises IRQL to some value. +// +// Differences from NT: None. +#define KeRaiseIrql KfRaiseIrql +NTSYSAPI +EXPORTNUM(190) +VOID +__fastcall +KfRaiseIrql( + IN KIRQL NewIrql, + OUT PKIRQL OldIrql + ); + +// KeRaiseIrqlToDpcLevel: +// Raises IRQL to DISPATCH_LEVEL. Like KeRaiseIrql except returns old level directly. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(129) +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel( + VOID + ); + +// KeLowerIrql: +// Lowers IRQL. +#define KeLowerIrql KfLowerIrql +NTSYSAPI +EXPORTNUM(161) +VOID +__fastcall +KfLowerIrql( + IN KIRQL NewIrql + ); + + +// MmMapIoSpace: +// Maps a physical address area into the virtual address space. +// DO NOT USE MEMORY MAPPED WITH THIS AS A BUFFER TO OTHER CALLS. For +// example, don't WriteFile or NtWriteFile these buffers. Copy them first. +// +// Differences from NT: PhysicalAddress is 32 bit, not 64. ProtectionType +// specifies the page protections, but it's a Win32 PAGE_ macro instead +// of the normal NT enumeration. PAGE_READWRITE is probably what you +// want... +NTSYSAPI +EXPORTNUM(177) +PVOID +NTAPI +MmMapIoSpace( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberOfBytes, + IN ULONG ProtectionType + ); + +// MmGetPhysicalAddress: +// Translates a virtual address into a physical address. +// +// Differences from NT: PhysicalAddress is 32 bit, not 64. +NTSYSAPI +EXPORTNUM(173) +PHYSICAL_ADDRESS +NTAPI +MmGetPhysicalAddress( + IN PVOID BaseAddress + ); + +// MmUnmapIoSpace: +// Unmaps a virtual address mapping made by MmMapIoSpace. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(183) +PVOID +NTAPI +MmUnmapIoSpace( + IN PVOID BaseAddress, + IN ULONG NumberOfBytes + ); + +// MmAllocateContiguousMemory: +// Allocates a range of physically contiguous, cache-aligned memory from the +// non-paged pool (= main pool on XBOX). +// +// Differences from NT: HighestAcceptableAddress was deleted, opting instead +// to not care about the highest address. +NTSYSAPI +EXPORTNUM(165) +PVOID +NTAPI +MmAllocateContiguousMemory( + IN ULONG NumberOfBytes + ); + +// MmFreeContiguousMemory: +// Frees memory allocated with MmAllocateContiguousMemory. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(171) +VOID +NTAPI +MmFreeContiguousMemory( + IN PVOID BaseAddress + ); + + +// DbgPrint +// Displays a message on the debugger. +// +// Differences from NT: Only how this information is displayed changed. +NTSYSAPI +EXPORTNUM(8) +ULONG +__cdecl +DbgPrint( + IN PCSZ Format, + ... + ); + + +// ExAllocatePoolWithTag: +// Allocates memory from the memory pool. The Tag parameter is a 4-letter +// character constant to which to associate the allocation. +// +// Differences from NT: There is no PoolType field, as the XBOX only has 1 +// pool, the non-paged pool. +NTSYSAPI +EXPORTNUM(15) +PVOID +NTAPI +ExAllocatePoolWithTag( + IN SIZE_T NumberOfBytes, + IN ULONG Tag + ); + +// ExFreePool: +// Frees memory allocated by ExAllocatePool* functions. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(17) +VOID +NTAPI +ExFreePool( + IN PVOID P + ); + + +// IoCreateSymbolicLink: +// Creates a symbolic link in the object namespace. +// NtCreateSymbolicLinkObject is much harder to use than this simple +// function, so just use this one. +// +// Differences from NT: Uses ANSI_STRING instead of UNICODE_STRING. +NTSYSAPI +EXPORTNUM(67) +NTSTATUS +NTAPI +IoCreateSymbolicLink( + IN PANSI_STRING SymbolicLinkName, + IN PANSI_STRING DeviceName + ); + +// IoDeleteSymbolicLink: +// Creates a symbolic link in the object namespace. Deleting symbolic links +// through the Nt* functions is a pain, so use this instead. +// +// Differences from NT: Uses ANSI_STRING instead of UNICODE_STRING. +NTSYSAPI +EXPORTNUM(69) +NTSTATUS +NTAPI +IoDeleteSymbolicLink( + IN PANSI_STRING SymbolicLinkName + ); + + +// ObReferenceObjectByHandle: +// Turns a handle into a kernel object pointer. The ObjectType parameter +// specifies what type of object it is. This function also increments the +// object's reference count. +// +// Differences from NT: There are no DesiredAccess, AccessMode, or +// HandleInformation parameters. +NTSYSAPI +EXPORTNUM(246) +NTSTATUS +NTAPI +ObReferenceObjectByHandle( + IN HANDLE Handle, + IN POBJECT_TYPE ObjectType OPTIONAL, + OUT PVOID *Object + ); + +// ObfReferenceObject/ObReferenceObject: +// Increments the object's reference count. +// +// Differences from NT: None. +#define ObReferenceObject(Object) ObfReferenceObject(Object) +NTSYSAPI +EXPORTNUM(251) +VOID +FASTCALL +ObfReferenceObject( + IN PVOID Object + ); + +// ObfDereferenceObject/ObDereferenceObject: +// Decrements the object's reference count, deleting it if it is now unused. +// +// Differences from NT: None. +#define ObDereferenceObject(a) ObfDereferenceObject(a) +NTSYSAPI +EXPORTNUM(250) +VOID +FASTCALL +ObfDereferenceObject( + IN PVOID Object + ); + + +// PsTerminateSystemThread: +// Exits the current system thread. Must be called from a system thread. +// +// Differences from NT: None. +NTSYSAPI +EXPORTNUM(258) +__declspec(noreturn) +NTSTATUS +PsTerminateSystemThread( + NTSTATUS ExitCode + ); + + + +// Kernel routines only in the XBOX + +// IoSynchronousDeviceIoControlRequest: +// NICE. Makes kernel driver stuff sooooo much easier. This does a +// blocking IOCTL on the specified device. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(84) +NTSTATUS +NTAPI +IoSynchronousDeviceIoControlRequest( + IN ULONG IoControlCode, + IN PDEVICE_OBJECT DeviceObject, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + OUT PDWORD unknown_use_zero OPTIONAL, + IN BOOLEAN InternalDeviceIoControl + ); + +// ExQueryNonVolatileSettings +// Queries saved information, such as the region code. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(24) +NTSTATUS +NTAPI +ExQueryNonVolatileSetting( + IN ULONG ValueIndex, + OUT PULONG Type, + OUT PVOID Value, + IN ULONG ValueLength, + OUT PULONG ResultLength OPTIONAL + ); + +// ExSaveNonVolatileSettings +// Writes saved information, such as the region code. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(29) +NTSTATUS +NTAPI +ExSaveNonVolatileSetting( + IN ULONG ValueIndex, + IN PULONG Type OPTIONAL, + IN PVOID Value, + IN ULONG ValueLength + ); + +// HalEnableSecureTrayEject: +// Notifies the SMBUS that ejecting the DVD-ROM should not reset the system. +// Note that this function can't really be called directly... +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(365) +VOID +NTAPI +HalEnableSecureTrayEject( + VOID + ); + +// XeLoadSection: +// Adds one to the reference count of the specified section and loads if the +// count is now above zero. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(327) +NTSTATUS +NTAPI +XeLoadSection( + IN OUT PXBE_SECTION section + ); + +// XeUnloadSection: +// Subtracts one from the reference count of the specified section and loads +// if the count is now below zero. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(328) +NTSTATUS +NTAPI +XeUnloadSection( + IN OUT PXBE_SECTION section + ); + +// RtlRip: +// Traps to the debugger with a certain message, then crashes. +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(352) +VOID +NTAPI +RtlRip( + IN PCSZ Part1, + IN PCSZ Part2, + IN PCSZ Part3 + ); + +// PsCreateSystemThread: +// Creates a system thread. Same as: +// PsCreateSystemThreadEx(ThreadHandle, NULL, 0x3000, 0, ThreadId, StartContext1, +// StartContext2, FALSE, DebugStack, PspSystemThreadStartup); +// +// New to the XBOX. (It is too different from NT to be considered the same) +NTSYSAPI +EXPORTNUM(254) +NTSTATUS +NTAPI +PsCreateSystemThread( + OUT PHANDLE ThreadHandle, + OUT PULONG ThreadId OPTIONAL, + IN PVOID StartContext1, + IN PVOID StartContext2, + IN BOOLEAN DebugStack + ); + +// PsCreateSystemThreadEx: +// Creates a system thread. +// ThreadHandle: Receives the thread handle +// ObjectAttributes: Unsure how this works (everything I've seen uses NULL) +// KernelStackSize: Size of the allocation for both stack and TLS data +// TlsDataSize: Size within KernelStackSize to use as TLS data +// ThreadId: Receives the thread ID number +// StartContext1: Parameter 1 to StartRoutine +// StartContext2: Parameter 2 to StartRoutine +// CreateSuspended: TRUE to create the thread as a suspended thread +// DebugStack: TRUE to allocate the stack from Debug Kit memory +// StartRoutine: Called when the thread is created +// +// New to the XBOX. +NTSYSAPI +EXPORTNUM(255) +NTSTATUS +NTAPI +PsCreateSystemThreadEx( + OUT PHANDLE ThreadHandle, + IN PVOID ObjectAttributes OPTIONAL, + IN ULONG KernelStackSize, + IN ULONG TlsDataSize, + OUT PULONG ThreadId OPTIONAL, + IN PVOID StartContext1, + IN PVOID StartContext2, + IN BOOLEAN CreateSuspended, + IN BOOLEAN DebugStack, + IN PKSTART_ROUTINE StartRoutine + ); + + + +// Error codes +#define STATUS_SUCCESS 0x00000000 +#define STATUS_UNSUCCESSFUL 0xC0000001 +#define STATUS_UNRECOGNIZED_MEDIA 0xC0000014 +// The SCSI input buffer was too large (not necessarily an error!) +#define STATUS_DATA_OVERRUN 0xC000003C +#define STATUS_INVALID_IMAGE_FORMAT 0xC000007B +#define STATUS_INSUFFICIENT_RESOURCES 0xC000009A +#define STATUS_TOO_MANY_SECRETS 0xC0000156 +#define STATUS_REGION_MISMATCH 0xC0050001 + +// End extern "C" for C++ +#if defined(__cplusplus) && !defined(XBOXINTERNAL_NO_EXTERN_C) +}; +#endif // __cplusplus + +#include + +// Thanks and credit go to Team Evox +typedef struct +{ + DWORD Data_00; // Check Block Start + DWORD Data_04; + DWORD Data_08; + DWORD Data_0c; + DWORD Data_10; // Check Block End + + DWORD V1_IP; // 0x14 + DWORD V1_Subnetmask; // 0x18 + DWORD V1_Defaultgateway; // 0x1c + DWORD V1_DNS1; // 0x20 + DWORD V1_DNS2; // 0x24 + + DWORD Data_28; // Check Block Start + DWORD Data_2c; + DWORD Data_30; + DWORD Data_34; + DWORD Data_38; // Check Block End + + DWORD V2_Tag; // V2 Tag "XBV2" + + DWORD Flag; // 0x40 + DWORD Data_44; + + DWORD V2_IP; // 0x48 + DWORD V2_Subnetmask; // 0x4c + DWORD V2_Defaultgateway; // 0x50 + DWORD V2_DNS1; // 0x54 + DWORD V2_DNS2; // 0x58 + + DWORD Data_xx[0x200-0x5c]; + +} TXNetConfigParams,*PTXNetConfigParams; + +// +// Time conversion routines +// + +typedef struct _TIME_FIELDS { + SHORT Year; // range [1601...] + SHORT Month; // range [1..12] + SHORT Day; // range [1..31] + SHORT Hour; // range [0..23] + SHORT Minute; // range [0..59] + SHORT Second; // range [0..59] + SHORT Milliseconds;// range [0..999] + SHORT Weekday; // range [0..6] == [Sunday..Saturday] +} TIME_FIELDS; +typedef TIME_FIELDS *PTIME_FIELDS; + + +#ifdef __cplusplus +extern "C" +{ +#endif + // Thanks and credit go to Woodoo + extern VOID WINAPI HalInitiateShutdown(VOID); + extern VOID WINAPI HalWriteSMBusValue(BYTE, BYTE, BOOL, BYTE); + extern VOID WINAPI HalReadSMCTrayState(DWORD* state, DWORD* count); + + // Thanks and credit go to Team Evox + extern VOID WINAPI HalReturnToFirmware(DWORD); + + extern INT WINAPI XNetLoadConfigParams(LPBYTE); + extern INT WINAPI XNetSaveConfigParams(LPBYTE); + + extern INT WINAPI XWriteTitleInfoNoReboot(LPVOID,LPVOID,DWORD,DWORD,LPVOID); + + extern DWORD* LaunchDataPage; + + extern unsigned int WINAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event OPTIONAL, PIO_APC_ROUTINE ApcRoutine OPTIONAL, PVOID ApcContext OPTIONAL, PIO_STATUS_BLOCK IoStatusBlock, ULONG FsControlCode, PVOID InputBuffer OPTIONAL, ULONG InputBufferLength, PVOID OutputBuffer OPTIONAL, ULONG OutputBufferLength); + extern void WINAPI KeQuerySystemTime (PLARGE_INTEGER CurrentTime); + extern NTSTATUS NTAPI NtSetSystemTime (PLARGE_INTEGER SystemTime, PLARGE_INTEGER PreviousTime OPTIONAL); + extern NTSYSAPI BOOLEAN NTAPI RtlTimeFieldsToTime(TIME_FIELDS* TimeFields, PLARGE_INTEGER Time); + +#ifdef __cplusplus +} +#endif + + +#endif // __XBOX_INTERNAL_H__ diff --git a/Cerbios Bios/older versions/hvl_replay.c b/Cerbios Bios/older versions/hvl_replay.c new file mode 100644 index 0000000..45bb8cc --- /dev/null +++ b/Cerbios Bios/older versions/hvl_replay.c @@ -0,0 +1,1997 @@ +/* +** Changes for the 1.4 release are commented. You can do +** a search for "1.4" and merge them into your own replay +** code. +** +** Changes for 1.5 are marked also. +** +** ... as are those for 1.6 +** +** ... and for 1.8 +*/ + + +#include +#include +#include +#include + +#include "hvl_replay.h" + +int32 stereopan_left[] = { 128, 96, 64, 32, 0 }; +int32 stereopan_right[] = { 128, 160, 193, 225, 255 }; + +/* +** Waves +*/ +#define WHITENOISELEN (0x280*3) + +#define WO_LOWPASSES 0 +#define WO_TRIANGLE_04 (WO_LOWPASSES+((0xfc+0xfc+0x80*0x1f+0x80+3*0x280)*31)) +#define WO_TRIANGLE_08 (WO_TRIANGLE_04+0x04) +#define WO_TRIANGLE_10 (WO_TRIANGLE_08+0x08) +#define WO_TRIANGLE_20 (WO_TRIANGLE_10+0x10) +#define WO_TRIANGLE_40 (WO_TRIANGLE_20+0x20) +#define WO_TRIANGLE_80 (WO_TRIANGLE_40+0x40) +#define WO_SAWTOOTH_04 (WO_TRIANGLE_80+0x80) +#define WO_SAWTOOTH_08 (WO_SAWTOOTH_04+0x04) +#define WO_SAWTOOTH_10 (WO_SAWTOOTH_08+0x08) +#define WO_SAWTOOTH_20 (WO_SAWTOOTH_10+0x10) +#define WO_SAWTOOTH_40 (WO_SAWTOOTH_20+0x20) +#define WO_SAWTOOTH_80 (WO_SAWTOOTH_40+0x40) +#define WO_SQUARES (WO_SAWTOOTH_80+0x80) +#define WO_WHITENOISE (WO_SQUARES+(0x80*0x20)) +#define WO_HIGHPASSES (WO_WHITENOISE+WHITENOISELEN) +#define WAVES_SIZE (WO_HIGHPASSES+((0xfc+0xfc+0x80*0x1f+0x80+3*0x280)*31)) + +int8 waves[WAVES_SIZE]; +int16 waves2[WAVES_SIZE]; + +int16 vib_tab[] = +{ + 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255, + 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24, + 0,-24,-49,-74,-97,-120,-141,-161,-180,-197,-212,-224,-235,-244,-250,-253,-255, + -253,-250,-244,-235,-224,-212,-197,-180,-161,-141,-120,-97,-74,-49,-24 +}; + +uint16 period_tab[] = +{ + 0x0000, 0x0D60, 0x0CA0, 0x0BE8, 0x0B40, 0x0A98, 0x0A00, 0x0970, + 0x08E8, 0x0868, 0x07F0, 0x0780, 0x0714, 0x06B0, 0x0650, 0x05F4, + 0x05A0, 0x054C, 0x0500, 0x04B8, 0x0474, 0x0434, 0x03F8, 0x03C0, + 0x038A, 0x0358, 0x0328, 0x02FA, 0x02D0, 0x02A6, 0x0280, 0x025C, + 0x023A, 0x021A, 0x01FC, 0x01E0, 0x01C5, 0x01AC, 0x0194, 0x017D, + 0x0168, 0x0153, 0x0140, 0x012E, 0x011D, 0x010D, 0x00FE, 0x00F0, + 0x00E2, 0x00D6, 0x00CA, 0x00BE, 0x00B4, 0x00AA, 0x00A0, 0x0097, + 0x008F, 0x0087, 0x007F, 0x0078, 0x0071 +}; + +uint32 panning_left[256], panning_right[256]; + +void hvl_GenPanningTables( void ) +{ + uint32 i; + float64 aa, ab; + + // Sine based panning table + aa = (3.14159265f*2.0f)/4.0f; // Quarter of the way through the sinewave == top peak + ab = 0.0f; // Start of the climb from zero + + for( i=0; i<256; i++ ) + { + panning_left[i] = (uint32)(sin(aa)*255.0f); + panning_right[i] = (uint32)(sin(ab)*255.0f); + + aa += (3.14159265*2.0f/4.0f)/256.0f; + ab += (3.14159265*2.0f/4.0f)/256.0f; + } + panning_left[255] = 0; + panning_right[0] = 0; +} + +void hvl_GenSawtooth( int8 *buf, uint32 len ) +{ + uint32 i; + int32 val, add; + + add = 256 / (len-1); + val = -128; + + for( i=0; i> 2; + d1 = 128/d5; + d4 = -(d2 >> 1); + val = 0; + + for( i=0; i 127.f ) + x = 127.f; + else if( x < -128.f ) + x = -128.f; + return x; +} + +void hvl_GenFilterWaves( int8 *buf, int8 *lowbuf, int8 *highbuf ) +{ + static const uint16 lentab[45] = { 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, + 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, + 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, + (0x280*3)-1 }; + + float64 freq; + uint32 temp; + + for( temp=0, freq=8.f; temp<31; temp++, freq+=3.f ) + { + uint32 wv; + int8 *a0 = buf; + + for( wv=0; wv<6+6+0x20+1; wv++ ) + { + float64 fre, high, mid, low; + uint32 i; + + mid = 0.f; + low = 0.f; + fre = freq * 1.25f / 100.0f; + + for( i=0; i<=lentab[wv]; i++ ) + { + high = a0[i] - mid - low; + high = clip( high ); + mid += high * fre; + mid = clip( mid ); + low += mid * fre; + low = clip( low ); + } + + for( i=0; i<=lentab[wv]; i++ ) + { + high = a0[i] - mid - low; + high = clip( high ); + mid += high * fre; + mid = clip( mid ); + low += mid * fre; + low = clip( low ); + *lowbuf++ = (int8)low; + *highbuf++ = (int8)high; + } + + a0 += lentab[wv]+1; + } + } +} + +void hvl_GenWhiteNoise( int8 *buf, uint32 len ) +{ + uint32 ays; + + ays = 0x41595321; + + do { + uint16 ax, bx; + int8 s; + + s = ays; + + if( ays & 0x100 ) + { + s = 0x80; + + if( (int32)(ays & 0xffff) >= 0 ) + s = 0x7f; + } + + *buf++ = s; + len--; + + ays = (ays >> 5) | (ays << 27); + ays = (ays & 0xffffff00) | ((ays & 0xff) ^ 0x9a); + bx = ays; + ays = (ays << 2) | (ays >> 30); + ax = ays; + bx += ax; + ax ^= bx; + ays = (ays & 0xffff0000) | ax; + ays = (ays >> 3) | (ays << 29); + } while( len ); +} + +void hvl_reset_some_stuff( struct hvl_tune *ht ) +{ + uint32 i; + + for( i=0; iht_Voices[i].vc_Delta=1; + ht->ht_Voices[i].vc_OverrideTranspose=1000; // 1.5 + ht->ht_Voices[i].vc_SamplePos=ht->ht_Voices[i].vc_Track=ht->ht_Voices[i].vc_Transpose=ht->ht_Voices[i].vc_NextTrack = ht->ht_Voices[i].vc_NextTranspose = 0; + ht->ht_Voices[i].vc_ADSRVolume=ht->ht_Voices[i].vc_InstrPeriod=ht->ht_Voices[i].vc_TrackPeriod=ht->ht_Voices[i].vc_VibratoPeriod=ht->ht_Voices[i].vc_NoteMaxVolume=ht->ht_Voices[i].vc_PerfSubVolume=ht->ht_Voices[i].vc_TrackMasterVolume=0; + ht->ht_Voices[i].vc_NewWaveform=ht->ht_Voices[i].vc_Waveform=ht->ht_Voices[i].vc_PlantSquare=ht->ht_Voices[i].vc_PlantPeriod=ht->ht_Voices[i].vc_IgnoreSquare=0; + ht->ht_Voices[i].vc_TrackOn=ht->ht_Voices[i].vc_FixedNote=ht->ht_Voices[i].vc_VolumeSlideUp=ht->ht_Voices[i].vc_VolumeSlideDown=ht->ht_Voices[i].vc_HardCut=ht->ht_Voices[i].vc_HardCutRelease=ht->ht_Voices[i].vc_HardCutReleaseF=0; + ht->ht_Voices[i].vc_PeriodSlideSpeed=ht->ht_Voices[i].vc_PeriodSlidePeriod=ht->ht_Voices[i].vc_PeriodSlideLimit=ht->ht_Voices[i].vc_PeriodSlideOn=ht->ht_Voices[i].vc_PeriodSlideWithLimit=0; + ht->ht_Voices[i].vc_PeriodPerfSlideSpeed=ht->ht_Voices[i].vc_PeriodPerfSlidePeriod=ht->ht_Voices[i].vc_PeriodPerfSlideOn=ht->ht_Voices[i].vc_VibratoDelay=ht->ht_Voices[i].vc_VibratoCurrent=ht->ht_Voices[i].vc_VibratoDepth=ht->ht_Voices[i].vc_VibratoSpeed=0; + ht->ht_Voices[i].vc_SquareOn=ht->ht_Voices[i].vc_SquareInit=ht->ht_Voices[i].vc_SquareLowerLimit=ht->ht_Voices[i].vc_SquareUpperLimit=ht->ht_Voices[i].vc_SquarePos=ht->ht_Voices[i].vc_SquareSign=ht->ht_Voices[i].vc_SquareSlidingIn=ht->ht_Voices[i].vc_SquareReverse=0; + ht->ht_Voices[i].vc_FilterOn=ht->ht_Voices[i].vc_FilterInit=ht->ht_Voices[i].vc_FilterLowerLimit=ht->ht_Voices[i].vc_FilterUpperLimit=ht->ht_Voices[i].vc_FilterPos=ht->ht_Voices[i].vc_FilterSign=ht->ht_Voices[i].vc_FilterSpeed=ht->ht_Voices[i].vc_FilterSlidingIn=ht->ht_Voices[i].vc_IgnoreFilter=0; + ht->ht_Voices[i].vc_PerfCurrent=ht->ht_Voices[i].vc_PerfSpeed=ht->ht_Voices[i].vc_WaveLength=ht->ht_Voices[i].vc_NoteDelayOn=ht->ht_Voices[i].vc_NoteCutOn=0; + ht->ht_Voices[i].vc_AudioPeriod=ht->ht_Voices[i].vc_AudioVolume=ht->ht_Voices[i].vc_VoiceVolume=ht->ht_Voices[i].vc_VoicePeriod=ht->ht_Voices[i].vc_VoiceNum=ht->ht_Voices[i].vc_WNRandom=0; + ht->ht_Voices[i].vc_SquareWait=ht->ht_Voices[i].vc_FilterWait=ht->ht_Voices[i].vc_PerfWait=ht->ht_Voices[i].vc_NoteDelayWait=ht->ht_Voices[i].vc_NoteCutWait=0; + ht->ht_Voices[i].vc_PerfList=0; + ht->ht_Voices[i].vc_RingSamplePos=ht->ht_Voices[i].vc_RingDelta=ht->ht_Voices[i].vc_RingPlantPeriod=ht->ht_Voices[i].vc_RingAudioPeriod=ht->ht_Voices[i].vc_RingNewWaveform=ht->ht_Voices[i].vc_RingWaveform=ht->ht_Voices[i].vc_RingFixedPeriod=ht->ht_Voices[i].vc_RingBasePeriod=0; + + ht->ht_Voices[i].vc_RingMixSource = NULL; + ht->ht_Voices[i].vc_RingAudioSource = NULL; + + memset(&ht->ht_Voices[i].vc_SquareTempBuffer,0,0x80); + memset(&ht->ht_Voices[i].vc_ADSR,0,sizeof(struct hvl_envelope)); + memset(&ht->ht_Voices[i].vc_VoiceBuffer,0,0x281); + memset(&ht->ht_Voices[i].vc_RingVoiceBuffer,0,0x281); + } + + for( i=0; iht_Voices[i].vc_WNRandom = 0x280; + ht->ht_Voices[i].vc_VoiceNum = i; + ht->ht_Voices[i].vc_TrackMasterVolume = 0x40; + ht->ht_Voices[i].vc_TrackOn = 1; + ht->ht_Voices[i].vc_MixSource = ht->ht_Voices[i].vc_VoiceBuffer; + } +} + +BOOL hvl_InitSubsong( struct hvl_tune *ht, uint32 nr ) +{ + uint32 PosNr, i; + + if( nr > ht->ht_SubsongNr ) + return FALSE; + + ht->ht_SongNum = nr; + + PosNr = 0; + if( nr ) PosNr = ht->ht_Subsongs[nr-1]; + + ht->ht_PosNr = PosNr; + ht->ht_PosJump = 0; + ht->ht_PatternBreak = 0; + ht->ht_NoteNr = 0; + ht->ht_PosJumpNote = 0; + ht->ht_Tempo = 6; + ht->ht_StepWaitFrames = 0; + ht->ht_GetNewPosition = 1; + ht->ht_SongEndReached = 0; + ht->ht_PlayingTime = 0; + + for( i=0; iht_Voices[i+0].vc_Pan = ht->ht_defpanleft; + ht->ht_Voices[i+0].vc_SetPan = ht->ht_defpanleft; // 1.4 + ht->ht_Voices[i+0].vc_PanMultLeft = panning_left[ht->ht_defpanleft]; + ht->ht_Voices[i+0].vc_PanMultRight = panning_right[ht->ht_defpanleft]; + ht->ht_Voices[i+1].vc_Pan = ht->ht_defpanright; + ht->ht_Voices[i+1].vc_SetPan = ht->ht_defpanright; // 1.4 + ht->ht_Voices[i+1].vc_PanMultLeft = panning_left[ht->ht_defpanright]; + ht->ht_Voices[i+1].vc_PanMultRight = panning_right[ht->ht_defpanright]; + ht->ht_Voices[i+2].vc_Pan = ht->ht_defpanright; + ht->ht_Voices[i+2].vc_SetPan = ht->ht_defpanright; // 1.4 + ht->ht_Voices[i+2].vc_PanMultLeft = panning_left[ht->ht_defpanright]; + ht->ht_Voices[i+2].vc_PanMultRight = panning_right[ht->ht_defpanright]; + ht->ht_Voices[i+3].vc_Pan = ht->ht_defpanleft; + ht->ht_Voices[i+3].vc_SetPan = ht->ht_defpanleft; // 1.4 + ht->ht_Voices[i+3].vc_PanMultLeft = panning_left[ht->ht_defpanleft]; + ht->ht_Voices[i+3].vc_PanMultRight = panning_right[ht->ht_defpanleft]; + } + + hvl_reset_some_stuff( ht ); + + return TRUE; +} + +void hvl_InitReplayer( void ) +{ + hvl_GenPanningTables(); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_04], 0x04 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_08], 0x08 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_10], 0x10 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_20], 0x20 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_40], 0x40 ); + hvl_GenSawtooth( &waves[WO_SAWTOOTH_80], 0x80 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_04], 0x04 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_08], 0x08 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_10], 0x10 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_20], 0x20 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_40], 0x40 ); + hvl_GenTriangle( &waves[WO_TRIANGLE_80], 0x80 ); + hvl_GenSquare( &waves[WO_SQUARES] ); + hvl_GenWhiteNoise( &waves[WO_WHITENOISE], WHITENOISELEN ); + hvl_GenFilterWaves( &waves[WO_TRIANGLE_04], &waves[WO_LOWPASSES], &waves[WO_HIGHPASSES] ); +} + +struct hvl_tune *hvl_load_ahx( uint8 *buf, uint32 buflen, uint32 defstereo, uint32 freq ) +{ + uint8 *bptr; + TEXT *nptr; + uint32 i, j, k, l, posn, insn, ssn, hs, trkn, trkl; + struct hvl_tune *ht; + struct hvl_plsentry *ple; + int32 defgain[] = { 71, 72, 76, 85, 100 }; + + posn = ((buf[6]&0x0f)<<8)|buf[7]; + insn = buf[12]; + ssn = buf[13]; + trkl = buf[10]; + trkn = buf[11]; + + hs = sizeof( struct hvl_tune ); + hs += sizeof( struct hvl_position ) * posn; + hs += sizeof( struct hvl_instrument ) * (insn+1); + hs += sizeof( uint16 ) * ssn; + + // Calculate the size of all instrument PList buffers + bptr = &buf[14]; + bptr += ssn*2; // Skip past the subsong list + bptr += posn*4*2; // Skip past the positions + bptr += trkn*trkl*3; + if((buf[6]&0x80)==0) bptr += trkl*3; + + // *NOW* we can finally calculate PList space + for( i=1; i<=insn; i++ ) + { + hs += bptr[21] * sizeof( struct hvl_plsentry ); + bptr += 22 + bptr[21]*4; + } + + ht = malloc( hs ); + if( !ht ) + { + printf( "Out of memory!\n" ); + return NULL; + } + + ht->ht_Frequency = freq; + ht->ht_FreqF = (float64)freq; + + ht->ht_Positions = (struct hvl_position *)(&ht[1]); + ht->ht_Instruments = (struct hvl_instrument *)(&ht->ht_Positions[posn]); + ht->ht_Subsongs = (uint16 *)(&ht->ht_Instruments[(insn+1)]); + ple = (struct hvl_plsentry *)(&ht->ht_Subsongs[ssn]); + + ht->ht_WaveformTab[0] = &waves[WO_TRIANGLE_04]; + ht->ht_WaveformTab[1] = &waves[WO_SAWTOOTH_04]; + ht->ht_WaveformTab[3] = &waves[WO_WHITENOISE]; + + ht->ht_Channels = 4; + ht->ht_PositionNr = posn; + ht->ht_Restart = (buf[8]<<8)|buf[9]; + ht->ht_SpeedMultiplier = ((buf[6]>>5)&3)+1; + ht->ht_TrackLength = trkl; + ht->ht_TrackNr = trkn; + ht->ht_InstrumentNr = insn; + ht->ht_SubsongNr = ssn; + ht->ht_defstereo = defstereo; + ht->ht_defpanleft = stereopan_left[ht->ht_defstereo]; + ht->ht_defpanright = stereopan_right[ht->ht_defstereo]; + ht->ht_mixgain = (defgain[ht->ht_defstereo]*256)/100; + + if( ht->ht_Restart >= ht->ht_PositionNr ) + ht->ht_Restart = ht->ht_PositionNr-1; + + // Do some validation + if( ( ht->ht_PositionNr > 1000 ) || + ( ht->ht_TrackLength > 64 ) || + ( ht->ht_InstrumentNr > 64 ) ) + { + printf( "%d,%d,%d\n", ht->ht_PositionNr, + ht->ht_TrackLength, + ht->ht_InstrumentNr ); + free( ht ); + printf( "Invalid file.\n" ); + return NULL; + } + + strncpy( ht->ht_Name, (TEXT *)&buf[(buf[4]<<8)|buf[5]], 128 ); + nptr = (TEXT *)&buf[((buf[4]<<8)|buf[5])+strlen( ht->ht_Name )+1]; + + bptr = &buf[14]; + + // Subsongs + for( i=0; iht_SubsongNr; i++ ) + { + ht->ht_Subsongs[i] = (bptr[0]<<8)|bptr[1]; + if( ht->ht_Subsongs[i] >= ht->ht_PositionNr ) + ht->ht_Subsongs[i] = 0; + bptr += 2; + } + + // Position list + for( i=0; iht_PositionNr; i++ ) + { + for( j=0; j<4; j++ ) + { + ht->ht_Positions[i].pos_Track[j] = *bptr++; + ht->ht_Positions[i].pos_Transpose[j] = *(int8 *)bptr++; + } + } + + // Tracks + for( i=0; i<=ht->ht_TrackNr; i++ ) + { + if( ( ( buf[6]&0x80 ) == 0x80 ) && ( i == 0 ) ) + { + for( j=0; jht_TrackLength; j++ ) + { + ht->ht_Tracks[i][j].stp_Note = 0; + ht->ht_Tracks[i][j].stp_Instrument = 0; + ht->ht_Tracks[i][j].stp_FX = 0; + ht->ht_Tracks[i][j].stp_FXParam = 0; + ht->ht_Tracks[i][j].stp_FXb = 0; + ht->ht_Tracks[i][j].stp_FXbParam = 0; + } + continue; + } + + for( j=0; jht_TrackLength; j++ ) + { + ht->ht_Tracks[i][j].stp_Note = (bptr[0]>>2)&0x3f; + ht->ht_Tracks[i][j].stp_Instrument = ((bptr[0]&0x3)<<4) | (bptr[1]>>4); + ht->ht_Tracks[i][j].stp_FX = bptr[1]&0xf; + ht->ht_Tracks[i][j].stp_FXParam = bptr[2]; + ht->ht_Tracks[i][j].stp_FXb = 0; + ht->ht_Tracks[i][j].stp_FXbParam = 0; + bptr += 3; + } + } + + // Instruments + for( i=1; i<=ht->ht_InstrumentNr; i++ ) + { + if( nptr < (TEXT *)(buf+buflen) ) + { + strncpy( ht->ht_Instruments[i].ins_Name, nptr, 128 ); + nptr += strlen( nptr )+1; + } else { + ht->ht_Instruments[i].ins_Name[0] = 0; + } + + ht->ht_Instruments[i].ins_Volume = bptr[0]; + ht->ht_Instruments[i].ins_FilterSpeed = ((bptr[1]>>3)&0x1f)|((bptr[12]>>2)&0x20); + ht->ht_Instruments[i].ins_WaveLength = bptr[1]&0x07; + + ht->ht_Instruments[i].ins_Envelope.aFrames = bptr[2]; + ht->ht_Instruments[i].ins_Envelope.aVolume = bptr[3]; + ht->ht_Instruments[i].ins_Envelope.dFrames = bptr[4]; + ht->ht_Instruments[i].ins_Envelope.dVolume = bptr[5]; + ht->ht_Instruments[i].ins_Envelope.sFrames = bptr[6]; + ht->ht_Instruments[i].ins_Envelope.rFrames = bptr[7]; + ht->ht_Instruments[i].ins_Envelope.rVolume = bptr[8]; + + ht->ht_Instruments[i].ins_FilterLowerLimit = bptr[12]&0x7f; + ht->ht_Instruments[i].ins_VibratoDelay = bptr[13]; + ht->ht_Instruments[i].ins_HardCutReleaseFrames = (bptr[14]>>4)&0x07; + ht->ht_Instruments[i].ins_HardCutRelease = bptr[14]&0x80?1:0; + ht->ht_Instruments[i].ins_VibratoDepth = bptr[14]&0x0f; + ht->ht_Instruments[i].ins_VibratoSpeed = bptr[15]; + ht->ht_Instruments[i].ins_SquareLowerLimit = bptr[16]; + ht->ht_Instruments[i].ins_SquareUpperLimit = bptr[17]; + ht->ht_Instruments[i].ins_SquareSpeed = bptr[18]; + ht->ht_Instruments[i].ins_FilterUpperLimit = bptr[19]&0x3f; + ht->ht_Instruments[i].ins_PList.pls_Speed = bptr[20]; + ht->ht_Instruments[i].ins_PList.pls_Length = bptr[21]; + + ht->ht_Instruments[i].ins_PList.pls_Entries = ple; + ple += bptr[21]; + + bptr += 22; + for( j=0; jht_Instruments[i].ins_PList.pls_Length; j++ ) + { + k = (bptr[0]>>5)&7; + if( k == 6 ) k = 12; + if( k == 7 ) k = 15; + l = (bptr[0]>>2)&7; + if( l == 6 ) l = 12; + if( l == 7 ) l = 15; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FX[1] = k; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FX[0] = l; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Waveform = ((bptr[0]<<1)&6) | (bptr[1]>>7); + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Fixed = (bptr[1]>>6)&1; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Note = bptr[1]&0x3f; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[0] = bptr[2]; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[1] = bptr[3]; + + // 1.6: Strip "toggle filter" commands if the module is + // version 0 (pre-filters). This is what AHX also does. + if( ( buf[3] == 0 ) && ( l == 4 ) && ( (bptr[2]&0xf0) != 0 ) ) + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[0] &= 0x0f; + if( ( buf[3] == 0 ) && ( k == 4 ) && ( (bptr[3]&0xf0) != 0 ) ) + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[1] &= 0x0f; // 1.8 + + bptr += 4; + } + } + + hvl_InitSubsong( ht, 0 ); + return ht; +} + +struct hvl_tune *hvl_LoadTune( uint8 *buf, uint32 buflen, uint32 freq, uint32 defstereo ) +{ + struct hvl_tune *ht; + uint8 *bptr; + TEXT *nptr; + uint32 i, j, posn, insn, ssn, chnn, hs, trkl, trkn; + struct hvl_plsentry *ple; + + if( ( buf[0] == 'T' ) && + ( buf[1] == 'H' ) && + ( buf[2] == 'X' ) && + ( buf[3] < 3 ) ) + return hvl_load_ahx( buf, buflen, defstereo, freq ); + + if( ( buf[0] != 'H' ) || + ( buf[1] != 'V' ) || + ( buf[2] != 'L' ) || + ( buf[3] > 1 ) ) + { + printf( "Invalid file.\n" ); + return NULL; + } + + posn = ((buf[6]&0x0f)<<8)|buf[7]; + insn = buf[12]; + ssn = buf[13]; + chnn = (buf[8]>>2)+4; + trkl = buf[10]; + trkn = buf[11]; + + hs = sizeof( struct hvl_tune ); + hs += sizeof( struct hvl_position ) * posn; + hs += sizeof( struct hvl_instrument ) * (insn+1); + hs += sizeof( uint16 ) * ssn; + + // Calculate the size of all instrument PList buffers + bptr = &buf[16]; + bptr += ssn*2; // Skip past the subsong list + bptr += posn*chnn*2; // Skip past the positions + + // Skip past the tracks + // 1.4: Fixed two really stupid bugs that cancelled each other + // out if the module had a blank first track (which is how + // come they were missed. + for( i=((buf[6]&0x80)==0x80)?1:0; i<=trkn; i++ ) + for( j=0; jht_Version = buf[3]; // 1.5 + ht->ht_Frequency = freq; + ht->ht_FreqF = (float64)freq; + + ht->ht_Positions = (struct hvl_position *)(&ht[1]); + ht->ht_Instruments = (struct hvl_instrument *)(&ht->ht_Positions[posn]); + ht->ht_Subsongs = (uint16 *)(&ht->ht_Instruments[(insn+1)]); + ple = (struct hvl_plsentry *)(&ht->ht_Subsongs[ssn]); + + ht->ht_WaveformTab[0] = &waves[WO_TRIANGLE_04]; + ht->ht_WaveformTab[1] = &waves[WO_SAWTOOTH_04]; + ht->ht_WaveformTab[3] = &waves[WO_WHITENOISE]; + + ht->ht_PositionNr = posn; + ht->ht_Channels = (buf[8]>>2)+4; + ht->ht_Restart = ((buf[8]&3)<<8)|buf[9]; + ht->ht_SpeedMultiplier = ((buf[6]>>5)&3)+1; + ht->ht_TrackLength = buf[10]; + ht->ht_TrackNr = buf[11]; + ht->ht_InstrumentNr = insn; + ht->ht_SubsongNr = ssn; + ht->ht_mixgain = (buf[14]<<8)/100; + ht->ht_defstereo = buf[15]; + ht->ht_defpanleft = stereopan_left[ht->ht_defstereo]; + ht->ht_defpanright = stereopan_right[ht->ht_defstereo]; + + if( ht->ht_Restart >= ht->ht_PositionNr ) + ht->ht_Restart = ht->ht_PositionNr-1; + + // Do some validation + if( ( ht->ht_PositionNr > 1000 ) || + ( ht->ht_TrackLength > 64 ) || + ( ht->ht_InstrumentNr > 64 ) ) + { + printf( "%d,%d,%d\n", ht->ht_PositionNr, + ht->ht_TrackLength, + ht->ht_InstrumentNr ); + free( ht ); + printf( "Invalid file.\n" ); + return NULL; + } + + strncpy( ht->ht_Name, (TEXT *)&buf[(buf[4]<<8)|buf[5]], 128 ); + nptr = (TEXT *)&buf[((buf[4]<<8)|buf[5])+strlen( ht->ht_Name )+1]; + + bptr = &buf[16]; + + // Subsongs + for( i=0; iht_SubsongNr; i++ ) + { + ht->ht_Subsongs[i] = (bptr[0]<<8)|bptr[1]; + bptr += 2; + } + + // Position list + for( i=0; iht_PositionNr; i++ ) + { + for( j=0; jht_Channels; j++ ) + { + ht->ht_Positions[i].pos_Track[j] = *bptr++; + ht->ht_Positions[i].pos_Transpose[j] = *(int8 *)bptr++; + } + } + + // Tracks + for( i=0; i<=ht->ht_TrackNr; i++ ) + { + if( ( ( buf[6]&0x80 ) == 0x80 ) && ( i == 0 ) ) + { + for( j=0; jht_TrackLength; j++ ) + { + ht->ht_Tracks[i][j].stp_Note = 0; + ht->ht_Tracks[i][j].stp_Instrument = 0; + ht->ht_Tracks[i][j].stp_FX = 0; + ht->ht_Tracks[i][j].stp_FXParam = 0; + ht->ht_Tracks[i][j].stp_FXb = 0; + ht->ht_Tracks[i][j].stp_FXbParam = 0; + } + continue; + } + + for( j=0; jht_TrackLength; j++ ) + { + if( bptr[0] == 0x3f ) + { + ht->ht_Tracks[i][j].stp_Note = 0; + ht->ht_Tracks[i][j].stp_Instrument = 0; + ht->ht_Tracks[i][j].stp_FX = 0; + ht->ht_Tracks[i][j].stp_FXParam = 0; + ht->ht_Tracks[i][j].stp_FXb = 0; + ht->ht_Tracks[i][j].stp_FXbParam = 0; + bptr++; + continue; + } + + ht->ht_Tracks[i][j].stp_Note = bptr[0]; + ht->ht_Tracks[i][j].stp_Instrument = bptr[1]; + ht->ht_Tracks[i][j].stp_FX = bptr[2]>>4; + ht->ht_Tracks[i][j].stp_FXParam = bptr[3]; + ht->ht_Tracks[i][j].stp_FXb = bptr[2]&0xf; + ht->ht_Tracks[i][j].stp_FXbParam = bptr[4]; + bptr += 5; + } + } + + + // Instruments + for( i=1; i<=ht->ht_InstrumentNr; i++ ) + { + if( nptr < (TEXT *)(buf+buflen) ) + { + strncpy( ht->ht_Instruments[i].ins_Name, nptr, 128 ); + nptr += strlen( nptr )+1; + } else { + ht->ht_Instruments[i].ins_Name[0] = 0; + } + + ht->ht_Instruments[i].ins_Volume = bptr[0]; + ht->ht_Instruments[i].ins_FilterSpeed = ((bptr[1]>>3)&0x1f)|((bptr[12]>>2)&0x20); + ht->ht_Instruments[i].ins_WaveLength = bptr[1]&0x07; + + ht->ht_Instruments[i].ins_Envelope.aFrames = bptr[2]; + ht->ht_Instruments[i].ins_Envelope.aVolume = bptr[3]; + ht->ht_Instruments[i].ins_Envelope.dFrames = bptr[4]; + ht->ht_Instruments[i].ins_Envelope.dVolume = bptr[5]; + ht->ht_Instruments[i].ins_Envelope.sFrames = bptr[6]; + ht->ht_Instruments[i].ins_Envelope.rFrames = bptr[7]; + ht->ht_Instruments[i].ins_Envelope.rVolume = bptr[8]; + + ht->ht_Instruments[i].ins_FilterLowerLimit = bptr[12]&0x7f; + ht->ht_Instruments[i].ins_VibratoDelay = bptr[13]; + ht->ht_Instruments[i].ins_HardCutReleaseFrames = (bptr[14]>>4)&0x07; + ht->ht_Instruments[i].ins_HardCutRelease = bptr[14]&0x80?1:0; + ht->ht_Instruments[i].ins_VibratoDepth = bptr[14]&0x0f; + ht->ht_Instruments[i].ins_VibratoSpeed = bptr[15]; + ht->ht_Instruments[i].ins_SquareLowerLimit = bptr[16]; + ht->ht_Instruments[i].ins_SquareUpperLimit = bptr[17]; + ht->ht_Instruments[i].ins_SquareSpeed = bptr[18]; + ht->ht_Instruments[i].ins_FilterUpperLimit = bptr[19]&0x3f; + ht->ht_Instruments[i].ins_PList.pls_Speed = bptr[20]; + ht->ht_Instruments[i].ins_PList.pls_Length = bptr[21]; + + ht->ht_Instruments[i].ins_PList.pls_Entries = ple; + ple += bptr[21]; + + bptr += 22; + for( j=0; jht_Instruments[i].ins_PList.pls_Length; j++ ) + { + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FX[0] = bptr[0]&0xf; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FX[1] = (bptr[1]>>3)&0xf; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Waveform = bptr[1]&7; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Fixed = (bptr[2]>>6)&1; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_Note = bptr[2]&0x3f; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[0] = bptr[3]; + ht->ht_Instruments[i].ins_PList.pls_Entries[j].ple_FXParam[1] = bptr[4]; + bptr += 5; + } + } + + hvl_InitSubsong( ht, 0 ); + return ht; +} + +void hvl_FreeTune( struct hvl_tune *ht ) +{ + if( !ht ) return; + free( ht ); +} + +void hvl_process_stepfx_1( struct hvl_tune *ht, struct hvl_voice *voice, int32 FX, int32 FXParam ) +{ + switch( FX ) + { + case 0x0: // Position Jump HI + if( ((FXParam&0x0f) > 0) && ((FXParam&0x0f) <= 9) ) + ht->ht_PosJump = FXParam & 0xf; + break; + + case 0x5: // Volume Slide + Tone Portamento + case 0xa: // Volume Slide + voice->vc_VolumeSlideDown = FXParam & 0x0f; + voice->vc_VolumeSlideUp = FXParam >> 4; + break; + + case 0x7: // Panning + if( FXParam > 127 ) + FXParam -= 256; + voice->vc_Pan = (FXParam+128); + voice->vc_SetPan = (FXParam+128); // 1.4 + voice->vc_PanMultLeft = panning_left[voice->vc_Pan]; + voice->vc_PanMultRight = panning_right[voice->vc_Pan]; + break; + + case 0xb: // Position jump + ht->ht_PosJump = ht->ht_PosJump*100 + (FXParam & 0x0f) + (FXParam >> 4)*10; + ht->ht_PatternBreak = 1; + if( ht->ht_PosJump <= ht->ht_PosNr ) + ht->ht_SongEndReached = 1; + break; + + case 0xd: // Pattern break + ht->ht_PosJump = ht->ht_PosNr+1; + ht->ht_PosJumpNote = (FXParam & 0x0f) + (FXParam>>4)*10; + ht->ht_PatternBreak = 1; + if( ht->ht_PosJumpNote > ht->ht_TrackLength ) + ht->ht_PosJumpNote = 0; + break; + + case 0xe: // Extended commands + switch( FXParam >> 4 ) + { + case 0xc: // Note cut + if( (FXParam & 0x0f) < ht->ht_Tempo ) + { + voice->vc_NoteCutWait = FXParam & 0x0f; + if( voice->vc_NoteCutWait ) + { + voice->vc_NoteCutOn = 1; + voice->vc_HardCutRelease = 0; + } + } + break; + + // 1.6: 0xd case removed + } + break; + + case 0xf: // Speed + ht->ht_Tempo = FXParam; + if( FXParam == 0 ) + ht->ht_SongEndReached = 1; + break; + } +} + +void hvl_process_stepfx_2( struct hvl_tune *ht, struct hvl_voice *voice, int32 FX, int32 FXParam, int32 *Note ) +{ + switch( FX ) + { + case 0x9: // Set squarewave offset + voice->vc_SquarePos = FXParam >> (5 - voice->vc_WaveLength); +// voice->vc_PlantSquare = 1; + voice->vc_IgnoreSquare = 1; + break; + + case 0x5: // Tone portamento + volume slide + case 0x3: // Tone portamento + if( FXParam != 0 ) voice->vc_PeriodSlideSpeed = FXParam; + + if( *Note ) + { + int32 new, diff; + + new = period_tab[*Note]; + diff = period_tab[voice->vc_TrackPeriod]; + diff -= new; + new = diff + voice->vc_PeriodSlidePeriod; + + if( new ) + voice->vc_PeriodSlideLimit = -diff; + } + voice->vc_PeriodSlideOn = 1; + voice->vc_PeriodSlideWithLimit = 1; + *Note = 0; + break; + } +} + +void hvl_process_stepfx_3( struct hvl_tune *ht, struct hvl_voice *voice, int32 FX, int32 FXParam ) +{ + int32 i; + + switch( FX ) + { + case 0x01: // Portamento up (period slide down) + voice->vc_PeriodSlideSpeed = -FXParam; + voice->vc_PeriodSlideOn = 1; + voice->vc_PeriodSlideWithLimit = 0; + break; + case 0x02: // Portamento down + voice->vc_PeriodSlideSpeed = FXParam; + voice->vc_PeriodSlideOn = 1; + voice->vc_PeriodSlideWithLimit = 0; + break; + case 0x04: // Filter override + if( ( FXParam == 0 ) || ( FXParam == 0x40 ) ) break; + if( FXParam < 0x40 ) + { + voice->vc_IgnoreFilter = FXParam; + break; + } + if( FXParam > 0x7f ) break; + voice->vc_FilterPos = FXParam - 0x40; + break; + case 0x0c: // Volume + FXParam &= 0xff; + if( FXParam <= 0x40 ) + { + voice->vc_NoteMaxVolume = FXParam; + break; + } + + if( (FXParam -= 0x50) < 0 ) break; // 1.6 + + if( FXParam <= 0x40 ) + { + for( i=0; iht_Channels; i++ ) + ht->ht_Voices[i].vc_TrackMasterVolume = FXParam; + break; + } + + if( (FXParam -= 0xa0-0x50) < 0 ) break; // 1.6 + + if( FXParam <= 0x40 ) + voice->vc_TrackMasterVolume = FXParam; + break; + + case 0xe: // Extended commands; + switch( FXParam >> 4 ) + { + case 0x1: // Fineslide up + voice->vc_PeriodSlidePeriod -= (FXParam & 0x0f); // 1.8 + voice->vc_PlantPeriod = 1; + break; + + case 0x2: // Fineslide down + voice->vc_PeriodSlidePeriod += (FXParam & 0x0f); // 1.8 + voice->vc_PlantPeriod = 1; + break; + + case 0x4: // Vibrato control + voice->vc_VibratoDepth = FXParam & 0x0f; + break; + + case 0x0a: // Fine volume up + voice->vc_NoteMaxVolume += FXParam & 0x0f; + + if( voice->vc_NoteMaxVolume > 0x40 ) + voice->vc_NoteMaxVolume = 0x40; + break; + + case 0x0b: // Fine volume down + voice->vc_NoteMaxVolume -= FXParam & 0x0f; + + if( voice->vc_NoteMaxVolume < 0 ) + voice->vc_NoteMaxVolume = 0; + break; + + case 0x0f: // Misc flags (1.5) + if( ht->ht_Version < 1 ) break; + switch( FXParam & 0xf ) + { + case 1: + voice->vc_OverrideTranspose = voice->vc_Transpose; + break; + } + break; + } + break; + } +} + +void hvl_process_step( struct hvl_tune *ht, struct hvl_voice *voice ) +{ + int32 Note, Instr, donenotedel; + struct hvl_step *Step; + + if( voice->vc_TrackOn == 0 ) + return; + + voice->vc_VolumeSlideUp = voice->vc_VolumeSlideDown = 0; + + Step = &ht->ht_Tracks[ht->ht_Positions[ht->ht_PosNr].pos_Track[voice->vc_VoiceNum]][ht->ht_NoteNr]; + + Note = Step->stp_Note; + Instr = Step->stp_Instrument; + + // --------- 1.6: from here -------------- + + donenotedel = 0; + + // Do notedelay here + if( ((Step->stp_FX&0xf)==0xe) && ((Step->stp_FXParam&0xf0)==0xd0) ) + { + if( voice->vc_NoteDelayOn ) + { + voice->vc_NoteDelayOn = 0; + donenotedel = 1; + } else { + if( (Step->stp_FXParam&0x0f) < ht->ht_Tempo ) + { + voice->vc_NoteDelayWait = Step->stp_FXParam & 0x0f; + if( voice->vc_NoteDelayWait ) + { + voice->vc_NoteDelayOn = 1; + return; + } + } + } + } + + if( (donenotedel==0) && ((Step->stp_FXb&0xf)==0xe) && ((Step->stp_FXbParam&0xf0)==0xd0) ) + { + if( voice->vc_NoteDelayOn ) + { + voice->vc_NoteDelayOn = 0; + } else { + if( (Step->stp_FXbParam&0x0f) < ht->ht_Tempo ) + { + voice->vc_NoteDelayWait = Step->stp_FXbParam & 0x0f; + if( voice->vc_NoteDelayWait ) + { + voice->vc_NoteDelayOn = 1; + return; + } + } + } + } + + // --------- 1.6: to here -------------- + + if( Note ) voice->vc_OverrideTranspose = 1000; // 1.5 + + hvl_process_stepfx_1( ht, voice, Step->stp_FX&0xf, Step->stp_FXParam ); + hvl_process_stepfx_1( ht, voice, Step->stp_FXb&0xf, Step->stp_FXbParam ); + + if( ( Instr ) && ( Instr <= ht->ht_InstrumentNr ) ) + { + struct hvl_instrument *Ins; + int16 SquareLower, SquareUpper, d6, d3, d4; + + /* 1.4: Reset panning to last set position */ + voice->vc_Pan = voice->vc_SetPan; + voice->vc_PanMultLeft = panning_left[voice->vc_Pan]; + voice->vc_PanMultRight = panning_right[voice->vc_Pan]; + + voice->vc_PeriodSlideSpeed = voice->vc_PeriodSlidePeriod = voice->vc_PeriodSlideLimit = 0; + + voice->vc_PerfSubVolume = 0x40; + voice->vc_ADSRVolume = 0; + voice->vc_Instrument = Ins = &ht->ht_Instruments[Instr]; + voice->vc_SamplePos = 0; + + voice->vc_ADSR.aFrames = Ins->ins_Envelope.aFrames; + voice->vc_ADSR.aVolume = Ins->ins_Envelope.aVolume*256/voice->vc_ADSR.aFrames; + voice->vc_ADSR.dFrames = Ins->ins_Envelope.dFrames; + voice->vc_ADSR.dVolume = (Ins->ins_Envelope.dVolume-Ins->ins_Envelope.aVolume)*256/voice->vc_ADSR.dFrames; + voice->vc_ADSR.sFrames = Ins->ins_Envelope.sFrames; + voice->vc_ADSR.rFrames = Ins->ins_Envelope.rFrames; + voice->vc_ADSR.rVolume = (Ins->ins_Envelope.rVolume-Ins->ins_Envelope.dVolume)*256/voice->vc_ADSR.rFrames; + + voice->vc_WaveLength = Ins->ins_WaveLength; + voice->vc_NoteMaxVolume = Ins->ins_Volume; + + voice->vc_VibratoCurrent = 0; + voice->vc_VibratoDelay = Ins->ins_VibratoDelay; + voice->vc_VibratoDepth = Ins->ins_VibratoDepth; + voice->vc_VibratoSpeed = Ins->ins_VibratoSpeed; + voice->vc_VibratoPeriod = 0; + + voice->vc_HardCutRelease = Ins->ins_HardCutRelease; + voice->vc_HardCut = Ins->ins_HardCutReleaseFrames; + + voice->vc_IgnoreSquare = voice->vc_SquareSlidingIn = 0; + voice->vc_SquareWait = voice->vc_SquareOn = 0; + + SquareLower = Ins->ins_SquareLowerLimit >> (5 - voice->vc_WaveLength); + SquareUpper = Ins->ins_SquareUpperLimit >> (5 - voice->vc_WaveLength); + + if( SquareUpper < SquareLower ) + { + int16 t = SquareUpper; + SquareUpper = SquareLower; + SquareLower = t; + } + + voice->vc_SquareUpperLimit = SquareUpper; + voice->vc_SquareLowerLimit = SquareLower; + + voice->vc_IgnoreFilter = voice->vc_FilterWait = voice->vc_FilterOn = 0; + voice->vc_FilterSlidingIn = 0; + + d6 = Ins->ins_FilterSpeed; + d3 = Ins->ins_FilterLowerLimit; + d4 = Ins->ins_FilterUpperLimit; + + if( d3 & 0x80 ) d6 |= 0x20; + if( d4 & 0x80 ) d6 |= 0x40; + + voice->vc_FilterSpeed = d6; + d3 &= ~0x80; + d4 &= ~0x80; + + if( d3 > d4 ) + { + int16 t = d3; + d3 = d4; + d4 = t; + } + + voice->vc_FilterUpperLimit = d4; + voice->vc_FilterLowerLimit = d3; + voice->vc_FilterPos = 32; + + voice->vc_PerfWait = voice->vc_PerfCurrent = 0; + voice->vc_PerfSpeed = Ins->ins_PList.pls_Speed; + voice->vc_PerfList = &voice->vc_Instrument->ins_PList; + + voice->vc_RingMixSource = NULL; // No ring modulation + voice->vc_RingSamplePos = 0; + voice->vc_RingPlantPeriod = 0; + voice->vc_RingNewWaveform = 0; + } + + voice->vc_PeriodSlideOn = 0; + + hvl_process_stepfx_2( ht, voice, Step->stp_FX&0xf, Step->stp_FXParam, &Note ); + hvl_process_stepfx_2( ht, voice, Step->stp_FXb&0xf, Step->stp_FXbParam, &Note ); + + if( Note ) + { + voice->vc_TrackPeriod = Note; + voice->vc_PlantPeriod = 1; + } + + hvl_process_stepfx_3( ht, voice, Step->stp_FX&0xf, Step->stp_FXParam ); + hvl_process_stepfx_3( ht, voice, Step->stp_FXb&0xf, Step->stp_FXbParam ); +} + +void hvl_plist_command_parse( struct hvl_tune *ht, struct hvl_voice *voice, int32 FX, int32 FXParam ) +{ + switch( FX ) + { + case 0: + if( ( FXParam > 0 ) && ( FXParam < 0x40 ) ) + { + if( voice->vc_IgnoreFilter ) + { + voice->vc_FilterPos = voice->vc_IgnoreFilter; + voice->vc_IgnoreFilter = 0; + } else { + voice->vc_FilterPos = FXParam; + } + voice->vc_NewWaveform = 1; + } + break; + + case 1: + voice->vc_PeriodPerfSlideSpeed = FXParam; + voice->vc_PeriodPerfSlideOn = 1; + break; + + case 2: + voice->vc_PeriodPerfSlideSpeed = -FXParam; + voice->vc_PeriodPerfSlideOn = 1; + break; + + case 3: + if( voice->vc_IgnoreSquare == 0 ) + voice->vc_SquarePos = FXParam >> (5-voice->vc_WaveLength); + else + voice->vc_IgnoreSquare = 0; + break; + + case 4: + if( FXParam == 0 ) + { + voice->vc_SquareInit = (voice->vc_SquareOn ^= 1); + voice->vc_SquareSign = 1; + } else { + + if( FXParam & 0x0f ) + { + voice->vc_SquareInit = (voice->vc_SquareOn ^= 1); + voice->vc_SquareSign = 1; + if(( FXParam & 0x0f ) == 0x0f ) + voice->vc_SquareSign = -1; + } + + if( FXParam & 0xf0 ) + { + voice->vc_FilterInit = (voice->vc_FilterOn ^= 1); + voice->vc_FilterSign = 1; + if(( FXParam & 0xf0 ) == 0xf0 ) + voice->vc_FilterSign = -1; + } + } + break; + + case 5: + voice->vc_PerfCurrent = FXParam; + break; + + case 7: + // Ring modulate with triangle + if(( FXParam >= 1 ) && ( FXParam <= 0x3C )) + { + voice->vc_RingBasePeriod = FXParam; + voice->vc_RingFixedPeriod = 1; + } else if(( FXParam >= 0x81 ) && ( FXParam <= 0xBC )) { + voice->vc_RingBasePeriod = FXParam-0x80; + voice->vc_RingFixedPeriod = 0; + } else { + voice->vc_RingBasePeriod = 0; + voice->vc_RingFixedPeriod = 0; + voice->vc_RingNewWaveform = 0; + voice->vc_RingAudioSource = NULL; // turn it off + voice->vc_RingMixSource = NULL; + break; + } + voice->vc_RingWaveform = 0; + voice->vc_RingNewWaveform = 1; + voice->vc_RingPlantPeriod = 1; + break; + + case 8: // Ring modulate with sawtooth + if(( FXParam >= 1 ) && ( FXParam <= 0x3C )) + { + voice->vc_RingBasePeriod = FXParam; + voice->vc_RingFixedPeriod = 1; + } else if(( FXParam >= 0x81 ) && ( FXParam <= 0xBC )) { + voice->vc_RingBasePeriod = FXParam-0x80; + voice->vc_RingFixedPeriod = 0; + } else { + voice->vc_RingBasePeriod = 0; + voice->vc_RingFixedPeriod = 0; + voice->vc_RingNewWaveform = 0; + voice->vc_RingAudioSource = NULL; + voice->vc_RingMixSource = NULL; + break; + } + + voice->vc_RingWaveform = 1; + voice->vc_RingNewWaveform = 1; + voice->vc_RingPlantPeriod = 1; + break; + + /* New in HivelyTracker 1.4 */ + case 9: + if( FXParam > 127 ) + FXParam -= 256; + voice->vc_Pan = (FXParam+128); + voice->vc_PanMultLeft = panning_left[voice->vc_Pan]; + voice->vc_PanMultRight = panning_right[voice->vc_Pan]; + break; + + case 12: + if( FXParam <= 0x40 ) + { + voice->vc_NoteMaxVolume = FXParam; + break; + } + + if( (FXParam -= 0x50) < 0 ) break; + + if( FXParam <= 0x40 ) + { + voice->vc_PerfSubVolume = FXParam; + break; + } + + if( (FXParam -= 0xa0-0x50) < 0 ) break; + + if( FXParam <= 0x40 ) + voice->vc_TrackMasterVolume = FXParam; + break; + + case 15: + voice->vc_PerfSpeed = voice->vc_PerfWait = FXParam; + break; + } +} + +void hvl_process_frame( struct hvl_tune *ht, struct hvl_voice *voice ) +{ + static uint8 Offsets[] = {0x00,0x04,0x04+0x08,0x04+0x08+0x10,0x04+0x08+0x10+0x20,0x04+0x08+0x10+0x20+0x40}; + + if( voice->vc_TrackOn == 0 ) + return; + + if( voice->vc_NoteDelayOn ) + { + if( voice->vc_NoteDelayWait <= 0 ) + hvl_process_step( ht, voice ); + else + voice->vc_NoteDelayWait--; + } + + if( voice->vc_HardCut ) + { + int32 nextinst; + + if( ht->ht_NoteNr+1 < ht->ht_TrackLength ) + nextinst = ht->ht_Tracks[voice->vc_Track][ht->ht_NoteNr+1].stp_Instrument; + else + nextinst = ht->ht_Tracks[voice->vc_NextTrack][0].stp_Instrument; + + if( nextinst ) + { + int32 d1; + + d1 = ht->ht_Tempo - voice->vc_HardCut; + + if( d1 < 0 ) d1 = 0; + + if( !voice->vc_NoteCutOn ) + { + voice->vc_NoteCutOn = 1; + voice->vc_NoteCutWait = d1; + voice->vc_HardCutReleaseF = -(d1-ht->ht_Tempo); + } else { + voice->vc_HardCut = 0; + } + } + } + + if( voice->vc_NoteCutOn ) + { + if( voice->vc_NoteCutWait <= 0 ) + { + voice->vc_NoteCutOn = 0; + + if( voice->vc_HardCutRelease ) + { + voice->vc_ADSR.rVolume = -(voice->vc_ADSRVolume - (voice->vc_Instrument->ins_Envelope.rVolume << 8)) / voice->vc_HardCutReleaseF; + voice->vc_ADSR.rFrames = voice->vc_HardCutReleaseF; + voice->vc_ADSR.aFrames = voice->vc_ADSR.dFrames = voice->vc_ADSR.sFrames = 0; + } else { + voice->vc_NoteMaxVolume = 0; + } + } else { + voice->vc_NoteCutWait--; + } + } + + // ADSR envelope + if( voice->vc_ADSR.aFrames ) + { + voice->vc_ADSRVolume += voice->vc_ADSR.aVolume; + + if( --voice->vc_ADSR.aFrames <= 0 ) + voice->vc_ADSRVolume = voice->vc_Instrument->ins_Envelope.aVolume << 8; + + } else if( voice->vc_ADSR.dFrames ) { + + voice->vc_ADSRVolume += voice->vc_ADSR.dVolume; + + if( --voice->vc_ADSR.dFrames <= 0 ) + voice->vc_ADSRVolume = voice->vc_Instrument->ins_Envelope.dVolume << 8; + + } else if( voice->vc_ADSR.sFrames ) { + + voice->vc_ADSR.sFrames--; + + } else if( voice->vc_ADSR.rFrames ) { + + voice->vc_ADSRVolume += voice->vc_ADSR.rVolume; + + if( --voice->vc_ADSR.rFrames <= 0 ) + voice->vc_ADSRVolume = voice->vc_Instrument->ins_Envelope.rVolume << 8; + } + + // VolumeSlide + voice->vc_NoteMaxVolume = voice->vc_NoteMaxVolume + voice->vc_VolumeSlideUp - voice->vc_VolumeSlideDown; + + if( voice->vc_NoteMaxVolume < 0 ) + voice->vc_NoteMaxVolume = 0; + else if( voice->vc_NoteMaxVolume > 0x40 ) + voice->vc_NoteMaxVolume = 0x40; + + // Portamento + if( voice->vc_PeriodSlideOn ) + { + if( voice->vc_PeriodSlideWithLimit ) + { + int32 d0, d2; + + d0 = voice->vc_PeriodSlidePeriod - voice->vc_PeriodSlideLimit; + d2 = voice->vc_PeriodSlideSpeed; + + if( d0 > 0 ) + d2 = -d2; + + if( d0 ) + { + int32 d3; + + d3 = (d0 + d2) ^ d0; + + if( d3 >= 0 ) + d0 = voice->vc_PeriodSlidePeriod + d2; + else + d0 = voice->vc_PeriodSlideLimit; + + voice->vc_PeriodSlidePeriod = d0; + voice->vc_PlantPeriod = 1; + } + } else { + voice->vc_PeriodSlidePeriod += voice->vc_PeriodSlideSpeed; + voice->vc_PlantPeriod = 1; + } + } + + // Vibrato + if( voice->vc_VibratoDepth ) + { + if( voice->vc_VibratoDelay <= 0 ) + { + voice->vc_VibratoPeriod = (vib_tab[voice->vc_VibratoCurrent] * voice->vc_VibratoDepth) >> 7; + voice->vc_PlantPeriod = 1; + voice->vc_VibratoCurrent = (voice->vc_VibratoCurrent + voice->vc_VibratoSpeed) & 0x3f; + } else { + voice->vc_VibratoDelay--; + } + } + + // PList + if( voice->vc_PerfList != 0 ) + { + if( voice->vc_Instrument && voice->vc_PerfCurrent < voice->vc_Instrument->ins_PList.pls_Length ) + { + if( --voice->vc_PerfWait <= 0 ) + { + uint32 i; + int32 cur; + + cur = voice->vc_PerfCurrent++; + voice->vc_PerfWait = voice->vc_PerfSpeed; + + if( voice->vc_PerfList->pls_Entries[cur].ple_Waveform ) + { + voice->vc_Waveform = voice->vc_PerfList->pls_Entries[cur].ple_Waveform-1; + voice->vc_NewWaveform = 1; + voice->vc_PeriodPerfSlideSpeed = voice->vc_PeriodPerfSlidePeriod = 0; + } + + // Holdwave + voice->vc_PeriodPerfSlideOn = 0; + + for( i=0; i<2; i++ ) + hvl_plist_command_parse( ht, voice, voice->vc_PerfList->pls_Entries[cur].ple_FX[i]&0xff, voice->vc_PerfList->pls_Entries[cur].ple_FXParam[i]&0xff ); + + // GetNote + if( voice->vc_PerfList->pls_Entries[cur].ple_Note ) + { + voice->vc_InstrPeriod = voice->vc_PerfList->pls_Entries[cur].ple_Note; + voice->vc_PlantPeriod = 1; + voice->vc_FixedNote = voice->vc_PerfList->pls_Entries[cur].ple_Fixed; + } + } + } else { + if( voice->vc_PerfWait ) + voice->vc_PerfWait--; + else + voice->vc_PeriodPerfSlideSpeed = 0; + } + } + + // PerfPortamento + if( voice->vc_PeriodPerfSlideOn ) + { + voice->vc_PeriodPerfSlidePeriod -= voice->vc_PeriodPerfSlideSpeed; + + if( voice->vc_PeriodPerfSlidePeriod ) + voice->vc_PlantPeriod = 1; + } + + if( voice->vc_Waveform == 3-1 && voice->vc_SquareOn ) + { + if( --voice->vc_SquareWait <= 0 ) + { + int32 d1, d2, d3; + + d1 = voice->vc_SquareLowerLimit; + d2 = voice->vc_SquareUpperLimit; + d3 = voice->vc_SquarePos; + + if( voice->vc_SquareInit ) + { + voice->vc_SquareInit = 0; + + if( d3 <= d1 ) + { + voice->vc_SquareSlidingIn = 1; + voice->vc_SquareSign = 1; + } else if( d3 >= d2 ) { + voice->vc_SquareSlidingIn = 1; + voice->vc_SquareSign = -1; + } + } + + // NoSquareInit + if( d1 == d3 || d2 == d3 ) + { + if( voice->vc_SquareSlidingIn ) + voice->vc_SquareSlidingIn = 0; + else + voice->vc_SquareSign = -voice->vc_SquareSign; + } + + d3 += voice->vc_SquareSign; + voice->vc_SquarePos = d3; + voice->vc_PlantSquare = 1; + voice->vc_SquareWait = voice->vc_Instrument->ins_SquareSpeed; + } + } + + if( voice->vc_FilterOn && --voice->vc_FilterWait <= 0 ) + { + uint32 i, FMax; + int32 d1, d2, d3; + + d1 = voice->vc_FilterLowerLimit; + d2 = voice->vc_FilterUpperLimit; + d3 = voice->vc_FilterPos; + + if( voice->vc_FilterInit ) + { + voice->vc_FilterInit = 0; + if( d3 <= d1 ) + { + voice->vc_FilterSlidingIn = 1; + voice->vc_FilterSign = 1; + } else if( d3 >= d2 ) { + voice->vc_FilterSlidingIn = 1; + voice->vc_FilterSign = -1; + } + } + + // NoFilterInit + FMax = (voice->vc_FilterSpeed < 3) ? (5-voice->vc_FilterSpeed) : 1; + + for( i=0; ivc_FilterSlidingIn ) + voice->vc_FilterSlidingIn = 0; + else + voice->vc_FilterSign = -voice->vc_FilterSign; + } + d3 += voice->vc_FilterSign; + } + + if( d3 < 1 ) d3 = 1; + if( d3 > 63 ) d3 = 63; + voice->vc_FilterPos = d3; + voice->vc_NewWaveform = 1; + voice->vc_FilterWait = voice->vc_FilterSpeed - 3; + + if( voice->vc_FilterWait < 1 ) + voice->vc_FilterWait = 1; + } + + if( voice->vc_Waveform == 3-1 || voice->vc_PlantSquare ) + { + // CalcSquare + int32 i; + int32 Delta; + int8 *SquarePtr; + int32 X; + + SquarePtr = &waves[WO_SQUARES+(voice->vc_FilterPos-0x20)*(0xfc+0xfc+0x80*0x1f+0x80+0x280*3)]; + X = voice->vc_SquarePos << (5 - voice->vc_WaveLength); + + if( X > 0x20 ) + { + X = 0x40 - X; + voice->vc_SquareReverse = 1; + } + + // OkDownSquare + if( X > 0 ) + SquarePtr += (X-1) << 7; + + Delta = 32 >> voice->vc_WaveLength; + ht->ht_WaveformTab[2] = voice->vc_SquareTempBuffer; + + for( i=0; i<(1<vc_WaveLength)*4; i++ ) + { + voice->vc_SquareTempBuffer[i] = *SquarePtr; + SquarePtr += Delta; + } + + voice->vc_NewWaveform = 1; + voice->vc_Waveform = 3-1; + voice->vc_PlantSquare = 0; + } + + if( voice->vc_Waveform == 4-1 ) + voice->vc_NewWaveform = 1; + + if( voice->vc_RingNewWaveform ) + { + int8 *rasrc; + + if( voice->vc_RingWaveform > 1 ) voice->vc_RingWaveform = 1; + + rasrc = ht->ht_WaveformTab[voice->vc_RingWaveform]; + rasrc += Offsets[voice->vc_WaveLength]; + + voice->vc_RingAudioSource = rasrc; + } + + + if( voice->vc_NewWaveform ) + { + int8 *AudioSource; + + AudioSource = ht->ht_WaveformTab[voice->vc_Waveform]; + + if( voice->vc_Waveform != 3-1 ) + AudioSource += (voice->vc_FilterPos-0x20)*(0xfc+0xfc+0x80*0x1f+0x80+0x280*3); + + if( voice->vc_Waveform < 3-1) + { + // GetWLWaveformlor2 + AudioSource += Offsets[voice->vc_WaveLength]; + } + + if( voice->vc_Waveform == 4-1 ) + { + // AddRandomMoving + AudioSource += ( voice->vc_WNRandom & (2*0x280-1) ) & ~1; + // GoOnRandom + voice->vc_WNRandom += 2239384; + voice->vc_WNRandom = ((((voice->vc_WNRandom >> 8) | (voice->vc_WNRandom << 24)) + 782323) ^ 75) - 6735; + } + + voice->vc_AudioSource = AudioSource; + } + + // Ring modulation period calculation + if( voice->vc_RingAudioSource ) + { + voice->vc_RingAudioPeriod = voice->vc_RingBasePeriod; + + if( !(voice->vc_RingFixedPeriod) ) + { + if( voice->vc_OverrideTranspose != 1000 ) // 1.5 + voice->vc_RingAudioPeriod += voice->vc_OverrideTranspose + voice->vc_TrackPeriod - 1; + else + voice->vc_RingAudioPeriod += voice->vc_Transpose + voice->vc_TrackPeriod - 1; + } + + if( voice->vc_RingAudioPeriod > 5*12 ) + voice->vc_RingAudioPeriod = 5*12; + + if( voice->vc_RingAudioPeriod < 0 ) + voice->vc_RingAudioPeriod = 0; + + voice->vc_RingAudioPeriod = period_tab[voice->vc_RingAudioPeriod]; + + if( !(voice->vc_RingFixedPeriod) ) + voice->vc_RingAudioPeriod += voice->vc_PeriodSlidePeriod; + + voice->vc_RingAudioPeriod += voice->vc_PeriodPerfSlidePeriod + voice->vc_VibratoPeriod; + + if( voice->vc_RingAudioPeriod > 0x0d60 ) + voice->vc_RingAudioPeriod = 0x0d60; + + if( voice->vc_RingAudioPeriod < 0x0071 ) + voice->vc_RingAudioPeriod = 0x0071; + } + + // Normal period calculation + voice->vc_AudioPeriod = voice->vc_InstrPeriod; + + if( !(voice->vc_FixedNote) ) + { + if( voice->vc_OverrideTranspose != 1000 ) // 1.5 + voice->vc_AudioPeriod += voice->vc_OverrideTranspose + voice->vc_TrackPeriod - 1; + else + voice->vc_AudioPeriod += voice->vc_Transpose + voice->vc_TrackPeriod - 1; + } + + if( voice->vc_AudioPeriod > 5*12 ) + voice->vc_AudioPeriod = 5*12; + + if( voice->vc_AudioPeriod < 0 ) + voice->vc_AudioPeriod = 0; + + voice->vc_AudioPeriod = period_tab[voice->vc_AudioPeriod]; + + if( !(voice->vc_FixedNote) ) + voice->vc_AudioPeriod += voice->vc_PeriodSlidePeriod; + + voice->vc_AudioPeriod += voice->vc_PeriodPerfSlidePeriod + voice->vc_VibratoPeriod; + + if( voice->vc_AudioPeriod > 0x0d60 ) + voice->vc_AudioPeriod = 0x0d60; + + if( voice->vc_AudioPeriod < 0x0071 ) + voice->vc_AudioPeriod = 0x0071; + + voice->vc_AudioVolume = (((((((voice->vc_ADSRVolume >> 8) * voice->vc_NoteMaxVolume) >> 6) * voice->vc_PerfSubVolume) >> 6) * voice->vc_TrackMasterVolume) >> 6); +} + +void hvl_set_audio( struct hvl_voice *voice, float64 freqf ) +{ + if( voice->vc_TrackOn == 0 ) + { + voice->vc_VoiceVolume = 0; + return; + } + + voice->vc_VoiceVolume = voice->vc_AudioVolume; + + if( voice->vc_PlantPeriod ) + { + float64 freq2; + uint32 delta; + + voice->vc_PlantPeriod = 0; + voice->vc_VoicePeriod = voice->vc_AudioPeriod; + + freq2 = Period2Freq( voice->vc_AudioPeriod ); + delta = (uint32)(freq2 / freqf); + + if( delta > (0x280<<16) ) delta -= (0x280<<16); + if( delta == 0 ) delta = 1; + voice->vc_Delta = delta; + } + + if( voice->vc_NewWaveform ) + { + int8 *src; + + src = voice->vc_AudioSource; + + if( voice->vc_Waveform == 4-1 ) + { + memcpy( &voice->vc_VoiceBuffer[0], src, 0x280 ); + } else { + uint32 i, WaveLoops; + + WaveLoops = (1 << (5 - voice->vc_WaveLength)) * 5; + + for( i=0; ivc_VoiceBuffer[i*4*(1<vc_WaveLength)], src, 4*(1<vc_WaveLength) ); + } + + voice->vc_VoiceBuffer[0x280] = voice->vc_VoiceBuffer[0]; + voice->vc_MixSource = voice->vc_VoiceBuffer; + } + + /* Ring Modulation */ + if( voice->vc_RingPlantPeriod ) + { + float64 freq2; + uint32 delta; + + voice->vc_RingPlantPeriod = 0; + freq2 = Period2Freq( voice->vc_RingAudioPeriod ); + delta = (uint32)(freq2 / freqf); + + if( delta > (0x280<<16) ) delta -= (0x280<<16); + if( delta == 0 ) delta = 1; + voice->vc_RingDelta = delta; + } + + if( voice->vc_RingNewWaveform ) + { + int8 *src; + uint32 i, WaveLoops; + + src = voice->vc_RingAudioSource; + + WaveLoops = (1 << (5 - voice->vc_WaveLength)) * 5; + + for( i=0; ivc_RingVoiceBuffer[i*4*(1<vc_WaveLength)], src, 4*(1<vc_WaveLength) ); + + voice->vc_RingVoiceBuffer[0x280] = voice->vc_RingVoiceBuffer[0]; + voice->vc_RingMixSource = voice->vc_RingVoiceBuffer; + } +} + +void hvl_play_irq( struct hvl_tune *ht ) +{ + uint32 i; + + if( ht->ht_StepWaitFrames <= 0 ) + { + if( ht->ht_GetNewPosition ) + { + int32 nextpos = (ht->ht_PosNr+1==ht->ht_PositionNr)?0:(ht->ht_PosNr+1); + + for( i=0; iht_Channels; i++ ) + { + ht->ht_Voices[i].vc_Track = ht->ht_Positions[ht->ht_PosNr].pos_Track[i]; + ht->ht_Voices[i].vc_Transpose = ht->ht_Positions[ht->ht_PosNr].pos_Transpose[i]; + ht->ht_Voices[i].vc_NextTrack = ht->ht_Positions[nextpos].pos_Track[i]; + ht->ht_Voices[i].vc_NextTranspose = ht->ht_Positions[nextpos].pos_Transpose[i]; + } + ht->ht_GetNewPosition = 0; + } + + for( i=0; iht_Channels; i++ ) + hvl_process_step( ht, &ht->ht_Voices[i] ); + + ht->ht_StepWaitFrames = ht->ht_Tempo; + } + + for( i=0; iht_Channels; i++ ) + hvl_process_frame( ht, &ht->ht_Voices[i] ); + + ht->ht_PlayingTime++; + if( ht->ht_Tempo > 0 && --ht->ht_StepWaitFrames <= 0 ) + { + if( !ht->ht_PatternBreak ) + { + ht->ht_NoteNr++; + if( ht->ht_NoteNr >= ht->ht_TrackLength ) + { + ht->ht_PosJump = ht->ht_PosNr+1; + ht->ht_PosJumpNote = 0; + ht->ht_PatternBreak = 1; + } + } + + if( ht->ht_PatternBreak ) + { + ht->ht_PatternBreak = 0; + ht->ht_PosNr = ht->ht_PosJump; + ht->ht_NoteNr = ht->ht_PosJumpNote; + if( ht->ht_PosNr == ht->ht_PositionNr ) + { + ht->ht_SongEndReached = 1; + ht->ht_PosNr = ht->ht_Restart; + } + ht->ht_PosJumpNote = 0; + ht->ht_PosJump = 0; + + ht->ht_GetNewPosition = 1; + } + } + + for( i=0; iht_Channels; i++ ) + hvl_set_audio( &ht->ht_Voices[i], ht->ht_Frequency ); +} + +void hvl_mixchunk( struct hvl_tune *ht, uint32 samples, int8 *buf1, int8 *buf2, int32 bufmod ) +{ + int8 *src[MAX_CHANNELS]; + int8 *rsrc[MAX_CHANNELS]; + uint32 delta[MAX_CHANNELS]; + uint32 rdelta[MAX_CHANNELS]; + int32 vol[MAX_CHANNELS]; + uint32 pos[MAX_CHANNELS]; + uint32 rpos[MAX_CHANNELS]; + uint32 cnt; + int32 panl[MAX_CHANNELS]; + int32 panr[MAX_CHANNELS]; +// uint32 vu[MAX_CHANNELS]; + int32 a=0, b=0, j; + uint32 i, chans, loops; + + chans = ht->ht_Channels; + for( i=0; iht_Voices[i].vc_Delta; + vol[i] = ht->ht_Voices[i].vc_VoiceVolume; + pos[i] = ht->ht_Voices[i].vc_SamplePos; + src[i] = ht->ht_Voices[i].vc_MixSource; + panl[i] = ht->ht_Voices[i].vc_PanMultLeft; + panr[i] = ht->ht_Voices[i].vc_PanMultRight; + + /* Ring Modulation */ + rdelta[i]= ht->ht_Voices[i].vc_RingDelta; + rpos[i] = ht->ht_Voices[i].vc_RingSamplePos; + rsrc[i] = ht->ht_Voices[i].vc_RingMixSource; + +// vu[i] = 0; + } + + do + { + loops = samples; + for( i=0; i= (0x280 << 16)) pos[i] -= 0x280<<16; + cnt = ((0x280<<16) - pos[i] - 1) / delta[i] + 1; + if( cnt < loops ) loops = cnt; + + if( rsrc[i] ) + { + if( rpos[i] >= (0x280<<16)) rpos[i] -= 0x280<<16; + cnt = ((0x280<<16) - rpos[i] - 1) / rdelta[i] + 1; + if( cnt < loops ) loops = cnt; + } + + } + + samples -= loops; + + // Inner loop + do + { + a=0; + b=0; + for( i=0; i>16]*rsrc[i][rpos[i]>>16])>>7)*vol[i]; + rpos[i] += rdelta[i]; + } else { + j = src[i][pos[i]>>16]*vol[i]; + } + +// if( abs( j ) > vu[i] ) vu[i] = abs( j ); + + a += (j * panl[i]) >> 7; + b += (j * panr[i]) >> 7; + pos[i] += delta[i]; + } + + a = (a*ht->ht_mixgain)>>8; + b = (b*ht->ht_mixgain)>>8; + + *(int16 *)buf1 = a; + *(int16 *)buf2 = b; + + loops--; + + buf1 += bufmod; + buf2 += bufmod; + } while( loops > 0 ); + } while( samples > 0 ); + + for( i=0; iht_Voices[i].vc_SamplePos = pos[i]; + ht->ht_Voices[i].vc_RingSamplePos = rpos[i]; +// ht->ht_Voices[i].vc_VUMeter = vu[i]; + } +} + +void hvl_DecodeFrame( struct hvl_tune *ht, int8 *buf1, int8 *buf2, int32 bufmod ) +{ + uint32 samples, loops; + + samples = ht->ht_Frequency/50/ht->ht_SpeedMultiplier; + loops = ht->ht_SpeedMultiplier; + + do + { + hvl_play_irq( ht ); + hvl_mixchunk( ht, samples, buf1, buf2, bufmod ); + buf1 += samples * bufmod; + buf2 += samples * bufmod; + loops--; + } while( loops ); +} diff --git a/Cerbios Bios/older versions/hvl_replay.h b/Cerbios Bios/older versions/hvl_replay.h new file mode 100644 index 0000000..cafec06 --- /dev/null +++ b/Cerbios Bios/older versions/hvl_replay.h @@ -0,0 +1,230 @@ + +typedef char int8; +typedef unsigned char uint8; +typedef short int16; +typedef unsigned short uint16; +typedef int int32; +typedef unsigned int uint32; +typedef double float64; +typedef char TEXT; +typedef int BOOL; + +#define TRUE 1 +#define FALSE 0 + +// Woohoo! +#define MAX_CHANNELS 16 + +#define Period2Freq(period) ((3546897.f * 65536.f) / (period)) + +struct hvl_envelope +{ + int16 aFrames, aVolume; + int16 dFrames, dVolume; + int16 sFrames; + int16 rFrames, rVolume; + int16 pad; +}; + +struct hvl_plsentry +{ + uint8 ple_Note; + uint8 ple_Waveform; + int16 ple_Fixed; + int8 ple_FX[2]; + int8 ple_FXParam[2]; +}; + +struct hvl_plist +{ + int16 pls_Speed; + int16 pls_Length; + struct hvl_plsentry *pls_Entries; +}; + +struct hvl_instrument +{ + TEXT ins_Name[128]; + uint8 ins_Volume; + uint8 ins_WaveLength; + uint8 ins_FilterLowerLimit; + uint8 ins_FilterUpperLimit; + uint8 ins_FilterSpeed; + uint8 ins_SquareLowerLimit; + uint8 ins_SquareUpperLimit; + uint8 ins_SquareSpeed; + uint8 ins_VibratoDelay; + uint8 ins_VibratoSpeed; + uint8 ins_VibratoDepth; + uint8 ins_HardCutRelease; + uint8 ins_HardCutReleaseFrames; + struct hvl_envelope ins_Envelope; + struct hvl_plist ins_PList; +}; + +struct hvl_position +{ + uint8 pos_Track[MAX_CHANNELS]; + int8 pos_Transpose[MAX_CHANNELS]; +}; + +struct hvl_step +{ + uint8 stp_Note; + uint8 stp_Instrument; + uint8 stp_FX; + uint8 stp_FXParam; + uint8 stp_FXb; + uint8 stp_FXbParam; +}; + +struct hvl_voice +{ + int16 vc_Track; + int16 vc_NextTrack; + int16 vc_Transpose; + int16 vc_NextTranspose; + int16 vc_OverrideTranspose; // 1.5 + int32 vc_ADSRVolume; + struct hvl_envelope vc_ADSR; + struct hvl_instrument *vc_Instrument; + uint32 vc_SamplePos; + uint32 vc_Delta; + uint16 vc_InstrPeriod; + uint16 vc_TrackPeriod; + uint16 vc_VibratoPeriod; + uint16 vc_WaveLength; + int16 vc_NoteMaxVolume; + uint16 vc_PerfSubVolume; + uint8 vc_NewWaveform; + uint8 vc_Waveform; + uint8 vc_PlantPeriod; + uint8 vc_VoiceVolume; + uint8 vc_PlantSquare; + uint8 vc_IgnoreSquare; + uint8 vc_FixedNote; + int16 vc_VolumeSlideUp; + int16 vc_VolumeSlideDown; + int16 vc_HardCut; + uint8 vc_HardCutRelease; + int16 vc_HardCutReleaseF; + uint8 vc_PeriodSlideOn; + int16 vc_PeriodSlideSpeed; + int16 vc_PeriodSlidePeriod; + int16 vc_PeriodSlideLimit; + int16 vc_PeriodSlideWithLimit; + int16 vc_PeriodPerfSlideSpeed; + int16 vc_PeriodPerfSlidePeriod; + uint8 vc_PeriodPerfSlideOn; + int16 vc_VibratoDelay; + int16 vc_VibratoSpeed; + int16 vc_VibratoCurrent; + int16 vc_VibratoDepth; + int16 vc_SquareOn; + int16 vc_SquareInit; + int16 vc_SquareWait; + int16 vc_SquareLowerLimit; + int16 vc_SquareUpperLimit; + int16 vc_SquarePos; + int16 vc_SquareSign; + int16 vc_SquareSlidingIn; + int16 vc_SquareReverse; + uint8 vc_FilterOn; + uint8 vc_FilterInit; + int16 vc_FilterWait; + int16 vc_FilterSpeed; + int16 vc_FilterUpperLimit; + int16 vc_FilterLowerLimit; + int16 vc_FilterPos; + int16 vc_FilterSign; + int16 vc_FilterSlidingIn; + int16 vc_IgnoreFilter; + int16 vc_PerfCurrent; + int16 vc_PerfSpeed; + int16 vc_PerfWait; + struct hvl_plist *vc_PerfList; + int8 *vc_AudioPointer; + int8 *vc_AudioSource; + uint8 vc_NoteDelayOn; + uint8 vc_NoteCutOn; + int16 vc_NoteDelayWait; + int16 vc_NoteCutWait; + int16 vc_AudioPeriod; + int16 vc_AudioVolume; + int32 vc_WNRandom; + int8 *vc_MixSource; + int8 vc_SquareTempBuffer[0x80]; + int8 vc_VoiceBuffer[0x282*4]; + uint8 vc_VoiceNum; + uint8 vc_TrackMasterVolume; + uint8 vc_TrackOn; + int16 vc_VoicePeriod; + uint32 vc_Pan; + uint32 vc_SetPan; // New for 1.4 + uint32 vc_PanMultLeft; + uint32 vc_PanMultRight; + uint32 vc_RingSamplePos; + uint32 vc_RingDelta; + int8 *vc_RingMixSource; + uint8 vc_RingPlantPeriod; + int16 vc_RingInstrPeriod; + int16 vc_RingBasePeriod; + int16 vc_RingAudioPeriod; + int8 *vc_RingAudioSource; + uint8 vc_RingNewWaveform; + uint8 vc_RingWaveform; + uint8 vc_RingFixedPeriod; + int8 vc_RingVoiceBuffer[0x282*4]; +}; + +struct hvl_tune +{ + TEXT ht_Name[128]; + uint16 ht_SongNum; + uint32 ht_Frequency; + float64 ht_FreqF; + int8 *ht_WaveformTab[MAX_CHANNELS]; + uint16 ht_Restart; + uint16 ht_PositionNr; + uint8 ht_SpeedMultiplier; + uint8 ht_TrackLength; + uint8 ht_TrackNr; + uint8 ht_InstrumentNr; + uint8 ht_SubsongNr; + uint16 ht_PosJump; + uint32 ht_PlayingTime; + int16 ht_Tempo; + int16 ht_PosNr; + int16 ht_StepWaitFrames; + int16 ht_NoteNr; + uint16 ht_PosJumpNote; + uint8 ht_GetNewPosition; + uint8 ht_PatternBreak; + uint8 ht_SongEndReached; + uint8 ht_Stereo; + uint16 *ht_Subsongs; + uint16 ht_Channels; + struct hvl_position *ht_Positions; + struct hvl_step ht_Tracks[256][64]; + struct hvl_instrument *ht_Instruments; + struct hvl_voice ht_Voices[MAX_CHANNELS]; + int32 ht_defstereo; + int32 ht_defpanleft; + int32 ht_defpanright; + int32 ht_mixgain; + uint8 ht_Version; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +void hvl_DecodeFrame( struct hvl_tune *ht, int8 *buf1, int8 *buf2, int32 bufmod ); +void hvl_InitReplayer( void ); +BOOL hvl_InitSubsong( struct hvl_tune *ht, uint32 nr ); +struct hvl_tune *hvl_LoadTune( uint8 *buf, uint32 buflen, uint32 freq, uint32 defstereo ); +void hvl_FreeTune( struct hvl_tune *ht ); + +#ifdef __cplusplus +} +#endif diff --git a/Cerbios Bios/older versions/main.cpp b/Cerbios Bios/older versions/main.cpp new file mode 100644 index 0000000..e53b3ff --- /dev/null +++ b/Cerbios Bios/older versions/main.cpp @@ -0,0 +1,477 @@ +#include +#include +#include + +#include +#include + +#include "externals.h" +#include "utility.h" +#include "animation.h" +#include "hvl_replay.h" +#include "nyansong.h" +#include "dsstdfx.h" +#include "dsstdfx_bin.h" + +//----------------------------------------------------------------------------- +// Global variables +//----------------------------------------------------------------------------- + +float bob, weave; + +unsigned short colors[256] = { 0 }; + +ULONG g_Frame = 0; +#define FINALFRAME 1150 +BOOL g_ExitNow = FALSE; +BOOL g_SoundEnabled = FALSE; +BOOL g_PlayOnce = TRUE; + +struct hvl_tune *ht = NULL; + +LPDIRECTSOUND8 g_pDSound; +LPDIRECTSOUNDBUFFER8 g_pDSBuffer; +WAVEFORMATEX g_wfx; +DSBUFFERDESC g_dsbd; +HANDLE hFillAudioBufferEvent; + +#define AUDIOFRAMESIZE ((44100*2*2)/50) +#define AUDIOFRAMES 10 +#define AUDIOBUFFERSIZE (AUDIOFRAMESIZE*AUDIOFRAMES) +DSBPOSITIONNOTIFY g_dspn[AUDIOFRAMES]; + +int nextaudiobuf = 0; + +ULONG g_ButtonsLast = 0; +ULONG g_ButtonsHeld = 0; +ULONG g_ButtonsPressed = 0; +ULONG g_ButtonsReleased = 0; +HANDLE g_Controller[4]; + +LPDIRECT3D8 g_pD3D = NULL; // Used to create the D3DDevice +LPDIRECT3DDEVICE8 g_pd3dDevice = NULL; // Our rendering device + +D3DMATERIAL8 g_mtrl; + +D3DXMATRIX g_matView; +D3DXMATRIX g_matProj; +D3DXMATRIX g_matWorld; + +//----------------------------------------------------------------------------- +// Name: XBUtil_DebugPrint() +// Desc: For printing to the debugger with formatting. +//----------------------------------------------------------------------------- +VOID XBUtil_DebugPrint( const CHAR* buf, ... ) +{ + CHAR strBuffer[1024]; + + va_list arglist; + va_start( arglist, buf ); + _vsnprintf( strBuffer, sizeof(strBuffer), buf, arglist ); + va_end( arglist ); + + strBuffer[sizeof(strBuffer)-1] = '\0'; + OutputDebugStringA( strBuffer ); +} + +VOID XBUtil_Reboot(VOID) +{ + HalReturnToFirmware(2); +} + +typedef struct { + DWORD dwWidth; + DWORD dwHeight; + BOOL fProgressive; + BOOL fWideScreen; + DWORD dwFreq; +} DISPLAY_MODE; + +// Display modes in order of our preference +DISPLAY_MODE g_aDisplayModes[] = +{ +// Width Height Progressive Widescreen + +// HDTV Progressive Modes + { 1280, 720, TRUE, TRUE, 60 }, // 1280x720 progressive 16x9 + +// EDTV Progressive Modes + { 720, 480, TRUE, TRUE, 60 }, // 720x480 progressive 16x9 + { 640, 480, TRUE, TRUE, 60 }, // 640x480 progressive 16x9 + { 720, 480, TRUE, FALSE, 60 }, // 720x480 progressive 4x3 + { 640, 480, TRUE, FALSE, 60 }, // 640x480 progressive 4x3 + +// HDTV Interlaced Modes +// { 1920, 1080, FALSE, TRUE, 60 }, // 1920x1080 interlaced 16x9 + +// SDTV PAL-50 Interlaced Modes + { 720, 480, FALSE, TRUE, 50 }, // 720x480 interlaced 16x9 50Hz + { 640, 480, FALSE, TRUE, 50 }, // 640x480 interlaced 16x9 50Hz + { 720, 480, FALSE, FALSE, 50 }, // 720x480 interlaced 4x3 50Hz + { 640, 480, FALSE, FALSE, 50 }, // 640x480 interlaced 4x3 50Hz + +// SDTV NTSC / PAL-60 Interlaced Modes + { 720, 480, FALSE, TRUE, 60 }, // 720x480 interlaced 16x9 + { 640, 480, FALSE, TRUE, 60 }, // 640x480 interlaced 16x9 + { 720, 480, FALSE, FALSE, 60 }, // 720x480 interlaced 4x3 + { 640, 480, FALSE, FALSE, 60 }, // 640x480 interlaced 4x3 +}; +#define NUM_MODES ( sizeof( g_aDisplayModes ) / sizeof( g_aDisplayModes[0] ) ) + +/////////////////////////////////////////////////////////////////////////////// +BOOL SupportsMode( DISPLAY_MODE mode, DWORD dwVideoStandard, DWORD dwVideoFlags ) +{ + if( mode.dwFreq == 60 && !(dwVideoFlags & XC_VIDEO_FLAGS_PAL_60Hz) && (dwVideoStandard == XC_VIDEO_STANDARD_PAL_I)) + return FALSE; + + if( mode.dwFreq == 50 && (dwVideoStandard != XC_VIDEO_STANDARD_PAL_I)) + return FALSE; + + // Need to check for widescreen on 480 modes only - + // 720p and 1080i are by definition widescreen. + if( mode.dwHeight == 480 && mode.fWideScreen && !(dwVideoFlags & XC_VIDEO_FLAGS_WIDESCREEN ) ) + return FALSE; + + // Explicit check for 480p + if( mode.dwHeight == 480 && mode.fProgressive && !(dwVideoFlags & XC_VIDEO_FLAGS_HDTV_480p) ) + return FALSE; + + // Explicit check for 720p (only 720 mode) + if( mode.dwHeight == 720 && !(dwVideoFlags & XC_VIDEO_FLAGS_HDTV_720p) ) + return FALSE; + + // Explicit check for 1080i (only 1080 mode) + if( mode.dwHeight == 1080 && !(dwVideoFlags & XC_VIDEO_FLAGS_HDTV_1080i) ) + return FALSE; + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Name: SetupMatrices() +// Desc: Creates the world, view, and projection transform matrices. +//----------------------------------------------------------------------------- +VOID SetupMatrices(BOOL bWidescreen) +{ + float scale = 0.6f; + + // Set up our view matrix. + const D3DXVECTOR3 vEyePos( 0.0f, 0.0f, 10.0f ); + const D3DXVECTOR3 vLookAt( 0.0f, 0.0f, 0.0f ); + const D3DXVECTOR3 vUp ( 0.0f, 1.0f, 0.0f ); + D3DXMatrixLookAtLH( &g_matView, &vEyePos, &vLookAt, &vUp ); + + // For the projection matrix. + D3DXMatrixOrthoLH( &g_matProj, bWidescreen ? (106.0f*scale) : (80.0f*scale), (48.0f*scale), 1.0f, 100.0f ); + + D3DXMatrixIdentity( &g_matWorld ); +} + +//----------------------------------------------------------------------------- +// Name: InitD3D() +// Desc: Initializes Direct3D +//----------------------------------------------------------------------------- +HRESULT InitD3D() +{ + DWORD m_dwVideoFlags, m_dwVideoStandard; + DWORD m_dwCurrentMode = 0; + + // Create the D3D object. + if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) ) + return E_FAIL; + + // Find the best supported video mode. + m_dwVideoStandard = XGetVideoStandard(); + m_dwVideoFlags = XGetVideoFlags(); + for(m_dwCurrentMode = 0; m_dwCurrentMode < NUM_MODES-1; m_dwCurrentMode++) + { + if(SupportsMode( g_aDisplayModes[ m_dwCurrentMode ], m_dwVideoStandard, m_dwVideoFlags )) break; + } + + // Set up the structure used to create the D3DDevice. + D3DPRESENT_PARAMETERS d3dpp; + ZeroMemory( &d3dpp, sizeof(d3dpp) ); + d3dpp.BackBufferWidth = g_aDisplayModes[ m_dwCurrentMode ].dwWidth; + d3dpp.BackBufferHeight = g_aDisplayModes[ m_dwCurrentMode ].dwHeight; + d3dpp.Flags = g_aDisplayModes[ m_dwCurrentMode ].fProgressive ? D3DPRESENTFLAG_PROGRESSIVE : D3DPRESENTFLAG_INTERLACED; + d3dpp.Flags |= g_aDisplayModes[ m_dwCurrentMode ].fWideScreen ? D3DPRESENTFLAG_WIDESCREEN : 0; + d3dpp.FullScreen_RefreshRateInHz = g_aDisplayModes[ m_dwCurrentMode ].dwFreq; + d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; + d3dpp.BackBufferCount = 1; + d3dpp.EnableAutoDepthStencil = TRUE; + d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + d3dpp.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES_SUPERSAMPLE_GAUSSIAN; + + // Create the Direct3D device. + if( FAILED( g_pD3D->CreateDevice( 0, D3DDEVTYPE_HAL, NULL, + D3DCREATE_HARDWARE_VERTEXPROCESSING, + &d3dpp, &g_pd3dDevice ) ) ) + return E_FAIL; + + SetupMatrices(g_aDisplayModes[ m_dwCurrentMode ].fWideScreen); + + return S_OK; +} + +//----------------------------------------------------------------------------- +// Name: Render() +// Desc: Draws the scene +//----------------------------------------------------------------------------- +VOID Render() +{ + int x, y; + float vx, vy; + unsigned int /*fg,*/ bg, r, g, b, fade; + + // Clear the backbuffer and the zbuffer + g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, + D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); + + DirectSoundDoWork(); + + g_pd3dDevice->SetTransform( D3DTS_WORLD, &g_matWorld ); + g_pd3dDevice->SetTransform( D3DTS_VIEW, &g_matView ); + g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &g_matProj ); + + g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); + g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE ); + g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + + g_pd3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x08 ); + g_pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); + + g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff ); + g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE ); + + g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DISABLE ); + g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + g_pd3dDevice->SetVertexShader( D3DFVF_XYZ ); + + if(g_Frame < 50) { + fade = 0; + } else if(g_Frame < 80) { + fade = g_Frame - 50; + } else if(g_Frame > (FINALFRAME - 30)) { + fade = FINALFRAME - g_Frame; + } else { + fade = 30; + } + + for(y = 0; y < FRAME_HEIGHT; y++ ) { + vy = (FRAME_HEIGHT * 0.5f) - y + bob; + for(x = 0; x < FRAME_WIDTH; x++ ) { + vx = (FRAME_WIDTH * 0.5f) - x + weave; + + bg = colors[frames[((g_Frame/4)%12)][(y*FRAME_WIDTH)+x]]; + if(bg != 0x000) { + r = (bg & 0xF00) >> 8; + g = (bg & 0x0F0) >> 4; + b = (bg & 0x00F) >> 0; + + g_mtrl.Ambient.r = (r * fade) / (15.0f * 30.0f); + g_mtrl.Ambient.g = (g * fade) / (15.0f * 30.0f); + g_mtrl.Ambient.b = (b * fade) / (15.0f * 30.0f); + g_pd3dDevice->SetMaterial( &g_mtrl ); + + g_pd3dDevice->Begin( D3DPT_QUADLIST ); + g_pd3dDevice->SetVertexData4f( D3DVSDE_VERTEX, vx-1.0f, vy-1.0f, 0.0f, 1.0f ); + g_pd3dDevice->SetVertexData4f( D3DVSDE_VERTEX, vx+0.0f, vy-1.0f, 0.0f, 1.0f ); + g_pd3dDevice->SetVertexData4f( D3DVSDE_VERTEX, vx+0.0f, vy+0.0f, 0.0f, 1.0f ); + g_pd3dDevice->SetVertexData4f( D3DVSDE_VERTEX, vx-1.0f, vy+0.0f, 0.0f, 1.0f ); + g_pd3dDevice->End(); + } + } + } + + // Present the backbuffer contents to the display + g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); +} + +VOID XInputGetStateAll() +{ + XINPUT_STATE ControllerState[4]; + int i, j, c = -1; + ULONG ButtonsCurrent = 0; + + for (i = 0; i < 4; i++) + { + if (g_Controller[i]) + { + XInputGetState(g_Controller[i], &ControllerState[i]); + ButtonsCurrent |= (ControllerState[i].Gamepad.wButtons) & 0xff; + +#if 0 + if (ControllerState[i].Gamepad.sThumbLY < -28672) + ButtonsCurrent |= XINPUT_GAMEPAD_DPAD_UP; + if (ControllerState[i].Gamepad.sThumbLY > 28671) + ButtonsCurrent |= XINPUT_GAMEPAD_DPAD_DOWN; + if (ControllerState[i].Gamepad.sThumbLX < -28672) + ButtonsCurrent |= XINPUT_GAMEPAD_DPAD_LEFT; + if (ControllerState[i].Gamepad.sThumbLX > 28671) + ButtonsCurrent |= XINPUT_GAMEPAD_DPAD_RIGHT; +#endif + + for (j = 0; j < 8; j++) + { + if (ControllerState[i].Gamepad.bAnalogButtons[j] > 0x7f) + ButtonsCurrent |= (1 << (j + 8)); + } + } + } + + g_ButtonsHeld = ButtonsCurrent & g_ButtonsLast; + g_ButtonsReleased = g_ButtonsLast & ~ButtonsCurrent; + g_ButtonsPressed = ButtonsCurrent & ~g_ButtonsLast; + g_ButtonsLast = ButtonsCurrent; +} + +VOID ParseInput() +{ + XInputGetStateAll(); + + g_Frame++; + + bob = (sin(g_Frame / 30.0f) * 0.5f); + weave = (cos(g_Frame / 30.0f) * 0.5f); + + if((g_Frame < (FINALFRAME - 60)) && ((g_ButtonsLast & BUTTONS_BACK) || (!ht))) { + g_Frame = (FINALFRAME - 60); + } + + if(g_Frame >= FINALFRAME) { + g_ExitNow = TRUE; + } +} + +VOID HivelyCallback() +{ + LPVOID audiobuffer; + DWORD audiobytes; + + if( FAILED( g_pDSBuffer->Lock( (nextaudiobuf * AUDIOFRAMESIZE), AUDIOFRAMESIZE, &audiobuffer, &audiobytes, NULL, NULL, 0 ) ) ) { + g_pDSBuffer->Stop(); + return; + } + + if(ht && ht->ht_SongEndReached && g_PlayOnce) { + ht = NULL; + } + + if(!ht) { + ZeroMemory( audiobuffer, AUDIOFRAMESIZE ); + } else { + hvl_DecodeFrame( ht, ((char*)audiobuffer), ((char*)audiobuffer)+2, 4 ); + } + nextaudiobuf = (nextaudiobuf+1)%AUDIOFRAMES; + + g_pDSBuffer->Unlock( audiobuffer, audiobytes, NULL, NULL ); +} + +//----------------------------------------------------------------------------- +// Name: main() +// Desc: Entry point to the program. +//----------------------------------------------------------------------------- +VOID __cdecl main() +{ + // Initialize Direct3D + if( FAILED( InitD3D() ) ) + return; + + Render(); + + colors[','] = 0x005; /* Blue background */ + colors['.'] = 0xfff; /* White stars */ + colors['\''] = 0x000; /* Black border */ + colors['@'] = 0xffd; /* Tan poptart */ + colors['$'] = 0xd8a; /* Pink poptart */ + colors['-'] = 0xd08; /* Red poptart */ + colors['>'] = 0xf00; /* Red rainbow */ + colors['&'] = 0xfa0; /* Orange rainbow */ + colors['+'] = 0xff0; /* Yellow Rainbow */ + colors['#'] = 0x8f0; /* Green rainbow */ + colors['='] = 0x08f; /* Light blue rainbow */ + colors[';'] = 0x00d; /* Dark blue rainbow */ + colors['*'] = 0x555; /* Gray cat face */ + colors['%'] = 0xd8a; /* Pink cheeks */ + + XDEVICE_PREALLOC_TYPE deviceTypes[] = + { + {XDEVICE_TYPE_GAMEPAD, 4}, + }; + + XInitDevices( sizeof(deviceTypes) / sizeof(XDEVICE_PREALLOC_TYPE), deviceTypes ); + + Sleep(2000); + + g_Controller[0] = XInputOpen( XDEVICE_TYPE_GAMEPAD, XDEVICE_PORT0, XDEVICE_NO_SLOT, 0); + g_Controller[1] = XInputOpen( XDEVICE_TYPE_GAMEPAD, XDEVICE_PORT1, XDEVICE_NO_SLOT, 0); + g_Controller[2] = XInputOpen( XDEVICE_TYPE_GAMEPAD, XDEVICE_PORT2, XDEVICE_NO_SLOT, 0); + g_Controller[3] = XInputOpen( XDEVICE_TYPE_GAMEPAD, XDEVICE_PORT3, XDEVICE_NO_SLOT, 0); + + if( FAILED( DirectSoundCreate( NULL, &g_pDSound, NULL ) ) ) { + g_SoundEnabled = FALSE; + } else { + g_SoundEnabled = TRUE; + + DSEFFECTIMAGELOC EffectLoc; + EffectLoc.dwI3DL2ReverbIndex = GraphI3DL2_I3DL2Reverb; + EffectLoc.dwCrosstalkIndex = GraphXTalk_XTalk; + g_pDSound->DownloadEffectsImage( dsstdfx_bin, sizeof(dsstdfx_bin), &EffectLoc, NULL ); + + XAudioCreatePcmFormat( 2, 44100, 16, &g_wfx ); + + ZeroMemory( &g_dsbd, sizeof(DSBUFFERDESC) ); + g_dsbd.dwSize = sizeof(DSBUFFERDESC); + g_dsbd.dwBufferBytes = AUDIOBUFFERSIZE; + g_dsbd.lpwfxFormat = &g_wfx; + + if( FAILED( g_pDSound->CreateSoundBuffer( &g_dsbd, &g_pDSBuffer, NULL ) ) ) { + g_SoundEnabled = FALSE; + } else { + hFillAudioBufferEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); + + hvl_InitReplayer(); + ht = hvl_LoadTune( nyansong, sizeof(nyansong), 44100, 0 ); + if(!ht) + g_SoundEnabled = FALSE; + else { + int i; + for( i = 0; i < AUDIOFRAMES; i++) { + g_dspn[i].dwOffset = i * AUDIOFRAMESIZE; + g_dspn[i].hEventNotify = hFillAudioBufferEvent; + } + for( i = 0; i < AUDIOFRAMES/4; i++) { + HivelyCallback(); + } + g_pDSBuffer->SetNotificationPositions( AUDIOFRAMES, g_dspn ); + } + } + } + + // Enter render loop + while(!g_ExitNow) + { + while(g_SoundEnabled && (WaitForSingleObject( hFillAudioBufferEvent, 0 ) == WAIT_OBJECT_0)) { + HivelyCallback(); + } + if(g_SoundEnabled) { + if(g_Frame == 51) + g_pDSBuffer->Play(0, 0, DSBPLAY_LOOPING); + if((g_Frame > 50) && (g_Frame < 75)) + g_pDSBuffer->SetVolume( DSBVOLUME_MIN + (((DSBVOLUME_MAX - DSBVOLUME_MIN) / 26) * (g_Frame-50)) ); + if(g_Frame > (FINALFRAME - 25)) + g_pDSBuffer->SetVolume( DSBVOLUME_MAX - (((DSBVOLUME_MAX - DSBVOLUME_MIN) / 26) * (FINALFRAME - g_Frame)) ); + } + + ParseInput(); + Render(); + } + + g_pd3dDevice->PersistDisplay(); + + HalReturnToFirmware(2); +} diff --git a/Cerbios Bios/older versions/nyancat.hvl b/Cerbios Bios/older versions/nyancat.hvl new file mode 100644 index 0000000..23dd182 Binary files /dev/null and b/Cerbios Bios/older versions/nyancat.hvl differ diff --git a/Cerbios Bios/older versions/nyansong.h b/Cerbios Bios/older versions/nyansong.h new file mode 100644 index 0000000..e16c0c0 --- /dev/null +++ b/Cerbios Bios/older versions/nyansong.h @@ -0,0 +1,61 @@ +uint8 nyansong[] = { +0x48, 0x56, 0x4c, 0x00, 0x03, 0x7e, 0xa0, 0x06, 0x00, 0x00, 0x40, 0x05, 0x01, 0x00, 0xc8, 0x04, +0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x3f, 0x3f, 0x24, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1c, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x24, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x28, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x23, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x24, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x3f, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1c, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x24, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x23, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x24, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x29, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x28, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x29, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x26, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x21, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1b, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x1b, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x10, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x11, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1c, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x11, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, +0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x3f, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1a, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x17, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x13, 0x01, 0x00, 0x00, 0x00, 0x3f, +0x15, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x01, +0x00, 0x00, 0x00, 0x3f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x1a, 0x01, 0x00, 0x00, +0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +0x3f, 0x3f, 0x3f, 0x3f, 0x1e, 0x01, 0x01, 0x3b, 0x08, 0x2a, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, +0x01, 0x04, 0x01, 0x0f, 0x10, 0x3f, 0x01, 0x01, 0x01, 0x04, 0x03, 0x01, 0x01, 0x18, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x01, 0x6e, 0x79, +0x61, 0x6e, 0x63, 0x61, 0x74, 0x00, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x79, +0x6f, 0x75, 0x20, 0x61, 0x72, 0x65, 0x2e, 0x2e, 0x00 +}; +#define NYANSONG_SIZE sizeof(nyansong) diff --git a/Cerbios Bios/older versions/resource.h b/Cerbios Bios/older versions/resource.h new file mode 100644 index 0000000..d612a20 --- /dev/null +++ b/Cerbios Bios/older versions/resource.h @@ -0,0 +1,5 @@ +// Automatically generated by the bundler tool from c:\Program Files\Microsoft Xbox SDK\Samples\Xbox\Attach\resource.rdf + +#define resource_NUM_RESOURCES 1UL + +#define resource_JustTurnItOn_OFFSET 32UL diff --git a/Cerbios Bios/older versions/utility.h b/Cerbios Bios/older versions/utility.h new file mode 100644 index 0000000..8259c80 --- /dev/null +++ b/Cerbios Bios/older versions/utility.h @@ -0,0 +1,26 @@ +#define BUTTONS_DPAD_UP (1<<0) +#define BUTTONS_DPAD_DOWN (1<<1) +#define BUTTONS_DPAD_LEFT (1<<2) +#define BUTTONS_DPAD_RIGHT (1<<3) +#define BUTTONS_START (1<<4) +#define BUTTONS_BACK (1<<5) +#define BUTTONS_LEFT_THUMB (1<<6) +#define BUTTONS_RIGHT_THUMB (1<<7) +#define BUTTONS_A (1<<8) +#define BUTTONS_B (1<<9) +#define BUTTONS_X (1<<10) +#define BUTTONS_Y (1<<11) +#define BUTTONS_BLACK (1<<12) +#define BUTTONS_WHITE (1<<13) +#define BUTTONS_LEFT_TRIGGER (1<<14) +#define BUTTONS_RIGHT_TRIGGER (1<<15) + +extern BOOL g_ExitNow; + +extern VOID XBUtil_DebugPrint( const CHAR* buf, ... ); +extern VOID mappath(char * Device, char * Alias); + +extern VOID bg_decompress(D3DTexture **TextureOutput); + +extern VOID statusline_refresh(const CHAR* Text); + diff --git a/Cerbios Bios/older versions/winioctl.h b/Cerbios Bios/older versions/winioctl.h new file mode 100644 index 0000000..cef232d --- /dev/null +++ b/Cerbios Bios/older versions/winioctl.h @@ -0,0 +1,1154 @@ +/*++ BUILD Version: 0011 // Increment this if a change has global effects + +Copyright (c) 1990-2001 Microsoft Corporation + +Module Name: + + winioctl.h + +Abstract: + + This module defines the 32-Bit Windows Device I/O control codes. + +Revision History: + +--*/ + + +// +// Interface GUIDs +// +// need these GUIDs outside conditional includes so that user can +// #include in precompiled header +// #include in a single source file +// #include in that source file a second time to instantiate the GUIDs +// +#ifdef DEFINE_GUID +// +// Make sure FAR is defined... +// +#ifndef FAR +#ifdef _WIN32 +#define FAR +#else +#define FAR _far +#endif +#endif + +DEFINE_GUID(DiskClassGuid, 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(CdRomClassGuid, 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(PartitionClassGuid, 0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(TapeClassGuid, 0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(WriteOnceDiskClassGuid, 0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(VolumeClassGuid, 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(MediumChangerClassGuid, 0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(FloppyClassGuid, 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(CdChangerClassGuid, 0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(StoragePortClassGuid, 0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +#endif // DEFINE_GUID + +#ifndef _WINIOCTL_ +#define _WINIOCTL_ + + +#ifndef _DEVIOCTL_ +#define _DEVIOCTL_ + +// begin_ntddk begin_wdm begin_nthal begin_ntifs +// +// Define the various device type values. Note that values used by Microsoft +// Corporation are in the range 0-32767, and 32768-65535 are reserved for use +// by customers. +// + +#define DEVICE_TYPE DWORD + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_MEMORY_UNIT 0x0000003a +#define FILE_DEVICE_MEDIA_BOARD 0x0000003b + +// +// Macro definition for defining IOCTL and FSCTL function control codes. Note +// that function codes 0-2047 are reserved for Microsoft Corporation, and +// 2048-4095 are reserved for customers. +// + +#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ +) + +// +// Macro to extract device type out of the device io control code +// +#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((DWORD)(ctrlCode & 0xffff0000)) >> 16) + +// +// Define the method codes for how buffers are passed for I/O and FS controls +// + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 + +// +// Define the access check value for any access +// +// +// The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in +// ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these +// constants *MUST* always be in sync. +// +// +// FILE_SPECIAL_ACCESS is checked by the NT I/O system the same as FILE_ANY_ACCESS. +// The file systems, however, may add additional access checks for I/O and FS controls +// that use this value. +// + + +#define FILE_ANY_ACCESS 0 +#define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) +#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe +#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe + +// end_ntddk end_wdm end_nthal end_ntifs + +#endif // _DEVIOCTL_ + + +#ifndef _NTDDSTOR_H_ +#define _NTDDSTOR_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// +// IoControlCode values for storage devices +// + +#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE + +// +// The following device control codes are common for all class drivers. They +// should be used in place of the older IOCTL_DISK, IOCTL_CDROM and IOCTL_TAPE +// common codes +// + +#define IOCTL_STORAGE_CHECK_VERIFY CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_LOAD_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_LOAD_MEDIA2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_RESERVE CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_RELEASE CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_FIND_NEW_DEVICES CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_EJECTION_CONTROL CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_MCN_CONTROL CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_GET_MEDIA_TYPES CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_GET_DEVICE_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_PREDICT_FAILURE CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +// +// These ioctl codes are obsolete. They are defined here to avoid resuing them +// and to allow class drivers to respond to them more easily. +// + +#define OBSOLETE_IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +// +// IOCTL_STORAGE_GET_DEVICE_NUMBER +// +// input - none +// +// output - STORAGE_DEVICE_NUMBER structure +// The values in the STORAGE_DEVICE_NUMBER structure are guaranteed +// to remain unchanged until the system is rebooted. They are not +// guaranteed to be persistant across boots. +// + +typedef struct _STORAGE_DEVICE_NUMBER { + + // + // The FILE_DEVICE_XXX type for this device. + // + + DEVICE_TYPE DeviceType; + + // + // The number of this device + // + + DWORD DeviceNumber; + + // + // If the device is partitionable, the partition number of the device. + // Otherwise -1 + // + + DWORD PartitionNumber; +} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER; + +// +// Define the structures for scsi resets +// + +typedef struct _STORAGE_BUS_RESET_REQUEST { + BYTE PathId; +} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST; + +// +// IOCTL_STORAGE_MEDIA_REMOVAL disables the mechanism +// on a storage device that ejects media. This function +// may or may not be supported on storage devices that +// support removable media. +// +// TRUE means prevent media from being removed. +// FALSE means allow media removal. +// + +typedef struct _PREVENT_MEDIA_REMOVAL { + BOOLEAN PreventMediaRemoval; +} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL; + +// begin_ntminitape + + +typedef struct _TAPE_STATISTICS { + DWORD Version; + DWORD Flags; + LARGE_INTEGER RecoveredWrites; + LARGE_INTEGER UnrecoveredWrites; + LARGE_INTEGER RecoveredReads; + LARGE_INTEGER UnrecoveredReads; + BYTE CompressionRatioReads; + BYTE CompressionRatioWrites; +} TAPE_STATISTICS, *PTAPE_STATISTICS; + +#define RECOVERED_WRITES_VALID 0x00000001 +#define UNRECOVERED_WRITES_VALID 0x00000002 +#define RECOVERED_READS_VALID 0x00000004 +#define UNRECOVERED_READS_VALID 0x00000008 +#define WRITE_COMPRESSION_INFO_VALID 0x00000010 +#define READ_COMPRESSION_INFO_VALID 0x00000020 + +typedef struct _TAPE_GET_STATISTICS { + DWORD Operation; +} TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS; + +#define TAPE_RETURN_STATISTICS 0L +#define TAPE_RETURN_ENV_INFO 1L +#define TAPE_RESET_STATISTICS 2L + +// +// IOCTL_STORAGE_GET_MEDIA_TYPES_EX will return an array of DEVICE_MEDIA_INFO +// structures, one per supported type, embedded in the GET_MEDIA_TYPES struct. +// + +typedef enum _STORAGE_MEDIA_TYPE { + // + // Following are defined in ntdddisk.h in the MEDIA_TYPE enum + // + // Unknown, // Format is unknown + // F5_1Pt2_512, // 5.25", 1.2MB, 512 bytes/sector + // F3_1Pt44_512, // 3.5", 1.44MB, 512 bytes/sector + // F3_2Pt88_512, // 3.5", 2.88MB, 512 bytes/sector + // F3_20Pt8_512, // 3.5", 20.8MB, 512 bytes/sector + // F3_720_512, // 3.5", 720KB, 512 bytes/sector + // F5_360_512, // 5.25", 360KB, 512 bytes/sector + // F5_320_512, // 5.25", 320KB, 512 bytes/sector + // F5_320_1024, // 5.25", 320KB, 1024 bytes/sector + // F5_180_512, // 5.25", 180KB, 512 bytes/sector + // F5_160_512, // 5.25", 160KB, 512 bytes/sector + // RemovableMedia, // Removable media other than floppy + // FixedMedia, // Fixed hard disk media + // F3_120M_512, // 3.5", 120M Floppy + // F3_640_512, // 3.5" , 640KB, 512 bytes/sector + // F5_640_512, // 5.25", 640KB, 512 bytes/sector + // F5_720_512, // 5.25", 720KB, 512 bytes/sector + // F3_1Pt2_512, // 3.5" , 1.2Mb, 512 bytes/sector + // F3_1Pt23_1024, // 3.5" , 1.23Mb, 1024 bytes/sector + // F5_1Pt23_1024, // 5.25", 1.23MB, 1024 bytes/sector + // F3_128Mb_512, // 3.5" MO 128Mb 512 bytes/sector + // F3_230Mb_512, // 3.5" MO 230Mb 512 bytes/sector + // F8_256_128, // 8", 256KB, 128 bytes/sector + // + + DDS_4mm = 0x20, // Tape - DAT DDS1,2,... (all vendors) + MiniQic, // Tape - miniQIC Tape + Travan, // Tape - Travan TR-1,2,3,... + QIC, // Tape - QIC + MP_8mm, // Tape - 8mm Exabyte Metal Particle + AME_8mm, // Tape - 8mm Exabyte Advanced Metal Evap + AIT1_8mm, // Tape - 8mm Sony AIT1 + DLT, // Tape - DLT Compact IIIxt, IV + NCTP, // Tape - Philips NCTP + IBM_3480, // Tape - IBM 3480 + IBM_3490E, // Tape - IBM 3490E + IBM_Magstar_3590, // Tape - IBM Magstar 3590 + IBM_Magstar_MP, // Tape - IBM Magstar MP + STK_DATA_D3, // Tape - STK Data D3 + SONY_DTF, // Tape - Sony DTF + DV_6mm, // Tape - 6mm Digital Video + DMI, // Tape - Exabyte DMI and compatibles + SONY_D2, // Tape - Sony D2S and D2L + CLEANER_CARTRIDGE, // Cleaner - All Drive types that support Drive Cleaners + CD_ROM, // Opt_Disk - CD + CD_R, // Opt_Disk - CD-Recordable (Write Once) + CD_RW, // Opt_Disk - CD-Rewriteable + DVD_ROM, // Opt_Disk - DVD-ROM + DVD_R, // Opt_Disk - DVD-Recordable (Write Once) + DVD_RW, // Opt_Disk - DVD-Rewriteable + MO_3_RW, // Opt_Disk - 3.5" Rewriteable MO Disk + MO_5_WO, // Opt_Disk - MO 5.25" Write Once + MO_5_RW, // Opt_Disk - MO 5.25" Rewriteable (not LIMDOW) + MO_5_LIMDOW, // Opt_Disk - MO 5.25" Rewriteable (LIMDOW) + PC_5_WO, // Opt_Disk - Phase Change 5.25" Write Once Optical + PC_5_RW, // Opt_Disk - Phase Change 5.25" Rewriteable + PD_5_RW, // Opt_Disk - PhaseChange Dual Rewriteable + ABL_5_WO, // Opt_Disk - Ablative 5.25" Write Once Optical + PINNACLE_APEX_5_RW, // Opt_Disk - Pinnacle Apex 4.6GB Rewriteable Optical + SONY_12_WO, // Opt_Disk - Sony 12" Write Once + PHILIPS_12_WO, // Opt_Disk - Philips/LMS 12" Write Once + HITACHI_12_WO, // Opt_Disk - Hitachi 12" Write Once + CYGNET_12_WO, // Opt_Disk - Cygnet/ATG 12" Write Once + KODAK_14_WO, // Opt_Disk - Kodak 14" Write Once + MO_NFR_525, // Opt_Disk - Near Field Recording (Terastor) + NIKON_12_RW, // Opt_Disk - Nikon 12" Rewriteable + IOMEGA_ZIP, // Mag_Disk - Iomega Zip + IOMEGA_JAZ, // Mag_Disk - Iomega Jaz + SYQUEST_EZ135, // Mag_Disk - Syquest EZ135 + SYQUEST_EZFLYER, // Mag_Disk - Syquest EzFlyer + SYQUEST_SYJET, // Mag_Disk - Syquest SyJet + AVATAR_F2, // Mag_Disk - 2.5" Floppy + MP2_8mm, // Tape - 8mm Hitachi + DST_S, // Ampex DST Small Tapes + DST_M, // Ampex DST Medium Tapes + DST_L, // Ampex DST Large Tapes + VXATape_1, // Ecrix 8mm Tape + VXATape_2, // Ecrix 8mm Tape + STK_EAGLE, // STK Eagle + LTO_Ultrium, // IBM, HP, Seagate LTO Ultrium + LTO_Accelis // IBM, HP, Seagate LTO Accelis +} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE; + +#define MEDIA_ERASEABLE 0x00000001 +#define MEDIA_WRITE_ONCE 0x00000002 +#define MEDIA_READ_ONLY 0x00000004 +#define MEDIA_READ_WRITE 0x00000008 + +#define MEDIA_WRITE_PROTECTED 0x00000100 +#define MEDIA_CURRENTLY_MOUNTED 0x80000000 + +// +// Define the different storage bus types +// Bus types below 128 (0x80) are reserved for Microsoft use +// + +typedef enum _STORAGE_BUS_TYPE { + BusTypeUnknown = 0x00, + BusTypeScsi, + BusTypeAtapi, + BusTypeAta, + BusType1394, + BusTypeSsa, + BusTypeFibre, + BusTypeUsb, + BusTypeRAID, + BusTypeMaxReserved = 0x7F +} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE; + +typedef struct _DEVICE_MEDIA_INFO { + union { + struct { + LARGE_INTEGER Cylinders; + STORAGE_MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; + DWORD NumberMediaSides; + DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values. + } DiskInfo; + + struct { + LARGE_INTEGER Cylinders; + STORAGE_MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; + DWORD NumberMediaSides; + DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values. + } RemovableDiskInfo; + + struct { + STORAGE_MEDIA_TYPE MediaType; + DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values. + DWORD CurrentBlockSize; + STORAGE_BUS_TYPE BusType; + + // + // Bus specific information describing the medium supported. + // + + union { + struct { + BYTE MediumType; + BYTE DensityCode; + } ScsiInformation; + } BusSpecificData; + + } TapeInfo; + } DeviceSpecific; +} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO; + +typedef struct _GET_MEDIA_TYPES { + DWORD DeviceType; // FILE_DEVICE_XXX values + DWORD MediaInfoCount; + DEVICE_MEDIA_INFO MediaInfo[1]; +} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES; + + +// +// IOCTL_STORAGE_PREDICT_FAILURE +// +// input - none +// +// output - STORAGE_PREDICT_FAILURE structure +// PredictFailure returns zero if no failure predicted and non zero +// if a failure is predicted. +// +// VendorSpecific returns 512 bytes of vendor specific information +// if a failure is predicted +// +typedef struct _STORAGE_PREDICT_FAILURE +{ + DWORD PredictFailure; + BYTE VendorSpecific[512]; +} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE; + +// end_ntminitape + +#ifdef __cplusplus +} +#endif + +#endif // _NTDDSTOR_H_ + +// +// IoControlCode values for disk devices. +// + +#define IOCTL_DISK_BASE FILE_DEVICE_DISK +#define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE, 0x000d, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +#if(_WIN32_WINNT >= 0x0400) +#define IOCTL_DISK_CONTROLLER_NUMBER CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// +// IOCTL support for SMART drive fault prediction. +// + +#define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS) +#define SMART_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + + +#endif /* _WIN32_WINNT >= 0x0400 */ + +#if(_WIN32_WINNT >= 0x0500) +#define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +// +// Special IOCTLs needed to support PC-98 machines in Japan +// + +#define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE, 0x00f3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE, 0x00f8, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#endif /* _WIN32_WINNT >= 0x0500 */ + +// +// The following device control codes are common for all class drivers. The +// functions codes defined here must match all of the other class drivers. +// +// Warning: these codes will be replaced in the future by equivalent +// IOCTL_STORAGE codes +// + +#define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// +// Define the partition types returnable by known disk drivers. +// + +#define PARTITION_ENTRY_UNUSED 0x00 // Entry unused +#define PARTITION_FAT_12 0x01 // 12-bit FAT entries +#define PARTITION_XENIX_1 0x02 // Xenix +#define PARTITION_XENIX_2 0x03 // Xenix +#define PARTITION_FAT_16 0x04 // 16-bit FAT entries +#define PARTITION_EXTENDED 0x05 // Extended partition entry +#define PARTITION_HUGE 0x06 // Huge partition MS-DOS V4 +#define PARTITION_IFS 0x07 // IFS Partition +#define PARTITION_FAT32 0x0B // FAT32 +#define PARTITION_FAT32_XINT13 0x0C // FAT32 using extended int13 services +#define PARTITION_XINT13 0x0E // Win95 partition using extended int13 services +#define PARTITION_XINT13_EXTENDED 0x0F // Same as type 5 but uses extended int13 services +#define PARTITION_PREP 0x41 // PowerPC Reference Platform (PReP) Boot Partition +#define PARTITION_LDM 0x42 // Logical Disk Manager partition +#define PARTITION_UNIX 0x63 // Unix + +#define VALID_NTFT 0xC0 // NTFT uses high order bits + +// +// The high bit of the partition type code indicates that a partition +// is part of an NTFT mirror or striped array. +// + +#define PARTITION_NTFT 0x80 // NTFT partition + +// +// The following macro is used to determine which partitions should be +// assigned drive letters. +// + +//++ +// +// BOOLEAN +// IsRecognizedPartition( +// IN DWORD PartitionType +// ) +// +// Routine Description: +// +// This macro is used to determine to which partitions drive letters +// should be assigned. +// +// Arguments: +// +// PartitionType - Supplies the type of the partition being examined. +// +// Return Value: +// +// The return value is TRUE if the partition type is recognized, +// otherwise FALSE is returned. +// +//-- + +#define IsRecognizedPartition( PartitionType ) ( \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT_12)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT_16)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_IFS)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_HUGE)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT32)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT32_XINT13)) || \ + ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_XINT13)) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_FAT_12) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_FAT_16) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_IFS) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_HUGE) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_FAT32) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_FAT32_XINT13) || \ + ((PartitionType & ~PARTITION_NTFT) == PARTITION_XINT13) ) + +//++ +// +// BOOLEAN +// IsContainerPartition( +// IN DWORD PartitionType +// ) +// +// Routine Description: +// +// This macro is used to determine to which partition types are actually +// containers for other partitions (ie, extended partitions). +// +// Arguments: +// +// PartitionType - Supplies the type of the partition being examined. +// +// Return Value: +// +// The return value is TRUE if the partition type is a container, +// otherwise FALSE is returned. +// +//-- + +#define IsContainerPartition( PartitionType ) \ + ((PartitionType == PARTITION_EXTENDED) || (PartitionType == PARTITION_XINT13_EXTENDED)) + +// +// Define the media types supported by the driver. +// + +typedef enum _MEDIA_TYPE { + Unknown, // Format is unknown + F5_1Pt2_512, // 5.25", 1.2MB, 512 bytes/sector + F3_1Pt44_512, // 3.5", 1.44MB, 512 bytes/sector + F3_2Pt88_512, // 3.5", 2.88MB, 512 bytes/sector + F3_20Pt8_512, // 3.5", 20.8MB, 512 bytes/sector + F3_720_512, // 3.5", 720KB, 512 bytes/sector + F5_360_512, // 5.25", 360KB, 512 bytes/sector + F5_320_512, // 5.25", 320KB, 512 bytes/sector + F5_320_1024, // 5.25", 320KB, 1024 bytes/sector + F5_180_512, // 5.25", 180KB, 512 bytes/sector + F5_160_512, // 5.25", 160KB, 512 bytes/sector + RemovableMedia, // Removable media other than floppy + FixedMedia, // Fixed hard disk media + F3_120M_512, // 3.5", 120M Floppy + F3_640_512, // 3.5" , 640KB, 512 bytes/sector + F5_640_512, // 5.25", 640KB, 512 bytes/sector + F5_720_512, // 5.25", 720KB, 512 bytes/sector + F3_1Pt2_512, // 3.5" , 1.2Mb, 512 bytes/sector + F3_1Pt23_1024, // 3.5" , 1.23Mb, 1024 bytes/sector + F5_1Pt23_1024, // 5.25", 1.23MB, 1024 bytes/sector + F3_128Mb_512, // 3.5" MO 128Mb 512 bytes/sector + F3_230Mb_512, // 3.5" MO 230Mb 512 bytes/sector + F8_256_128 // 8", 256KB, 128 bytes/sector +} MEDIA_TYPE, *PMEDIA_TYPE; + +// +// Define the input buffer structure for the driver, when +// it is called with IOCTL_DISK_FORMAT_TRACKS. +// + +typedef struct _FORMAT_PARAMETERS { + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; +} FORMAT_PARAMETERS, *PFORMAT_PARAMETERS; + +// +// Define the BAD_TRACK_NUMBER type. An array of elements of this type is +// returned by the driver on IOCTL_DISK_FORMAT_TRACKS requests, to indicate +// what tracks were bad during formatting. The length of that array is +// reported in the `Information' field of the I/O Status Block. +// + +typedef WORD BAD_TRACK_NUMBER; +typedef WORD *PBAD_TRACK_NUMBER; + +// +// Define the input buffer structure for the driver, when +// it is called with IOCTL_DISK_FORMAT_TRACKS_EX. +// + +typedef struct _FORMAT_EX_PARAMETERS { + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; + WORD FormatGapLength; + WORD SectorsPerTrack; + WORD SectorNumber[1]; +} FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS; + +// +// The following structure is returned on an IOCTL_DISK_GET_DRIVE_GEOMETRY +// request and an array of them is returned on an IOCTL_DISK_GET_MEDIA_TYPES +// request. +// + +typedef struct _DISK_GEOMETRY { + LARGE_INTEGER Cylinders; + MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; +} DISK_GEOMETRY, *PDISK_GEOMETRY; + + +// +// This wmi guid returns a DISK_GEOMETRY structure +// +#define WMI_DISK_GEOMETRY_GUID { 0x25007f51, 0x57c2, 0x11d1, { 0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10 } } + + + +// +// The following structure is returned on an IOCTL_DISK_GET_PARTITION_INFO +// and an IOCTL_DISK_GET_DRIVE_LAYOUT request. It is also used in a request +// to change the drive layout, IOCTL_DISK_SET_DRIVE_LAYOUT. +// + +typedef struct _PARTITION_INFORMATION { + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + DWORD HiddenSectors; + DWORD PartitionNumber; + BYTE PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + BOOLEAN RewritePartition; +} PARTITION_INFORMATION, *PPARTITION_INFORMATION; + +// +// The following structure is used to change the partition type of a +// specified disk partition using an IOCTL_DISK_SET_PARTITION_INFO +// request. +// + +typedef struct _SET_PARTITION_INFORMATION { + BYTE PartitionType; +} SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION; + +// +// The following structures is returned on an IOCTL_DISK_GET_DRIVE_LAYOUT +// request and given as input to an IOCTL_DISK_SET_DRIVE_LAYOUT request. +// + +typedef struct _DRIVE_LAYOUT_INFORMATION { + DWORD PartitionCount; + DWORD Signature; + PARTITION_INFORMATION PartitionEntry[1]; +} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION; + +// +// The following structure is passed in on an IOCTL_DISK_VERIFY request. +// The offset and length parameters are both given in bytes. +// + +typedef struct _VERIFY_INFORMATION { + LARGE_INTEGER StartingOffset; + DWORD Length; +} VERIFY_INFORMATION, *PVERIFY_INFORMATION; + +// +// The following structure is passed in on an IOCTL_DISK_REASSIGN_BLOCKS +// request. +// + +typedef struct _REASSIGN_BLOCKS { + WORD Reserved; + WORD Count; + DWORD BlockNumber[1]; +} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS; + +#if(_WIN32_WINNT >= 0x0400) +// +// IOCTL_DISK_CONTROLLER_NUMBER returns the controller and disk +// number for the handle. This is used to determine if a disk +// is attached to the primary or secondary IDE controller. +// + +typedef struct _DISK_CONTROLLER_NUMBER { + DWORD ControllerNumber; + DWORD DiskNumber; +} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER; +#endif /* _WIN32_WINNT >= 0x0400 */ + +#if(_WIN32_WINNT >= 0x0500) + + +// +// IOCTL_DISK_SET_CACHE allows the caller to get or set the state of the disk +// read/write caches. +// +// If the structure is provided as the input buffer for the ioctl the read & +// write caches will be enabled or disabled depending on the parameters +// provided. +// +// If the structure is provided as an output buffer for the ioctl the state +// of the read & write caches will be returned. If both input and outut buffers +// are provided the output buffer will contain the cache state BEFORE any +// changes are made +// + +typedef enum { + EqualPriority, + KeepPrefetchedData, + KeepReadData +} DISK_CACHE_RETENTION_PRIORITY; + + +typedef struct _DISK_CACHE_INFORMATION { + + // + // on return indicates that the device is capable of saving any parameters + // in non-volatile storage. On send indicates that the device should + // save the state in non-volatile storage. + // + + BOOLEAN ParametersSavable; + + // + // Indicates whether the write and read caches are enabled. + // + + BOOLEAN ReadCacheEnabled; + BOOLEAN WriteCacheEnabled; + + // + // Controls the likelyhood of data remaining in the cache depending on how + // it got there. Data cached from a READ or WRITE operation may be given + // higher, lower or equal priority to data entered into the cache for other + // means (like prefetch) + // + + DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; + DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; + + // + // Requests for a larger number of blocks than this may have prefetching + // disabled. If this value is set to 0 prefetch will be disabled. + // + + WORD DisablePrefetchTransferLength; + + // + // If TRUE then ScalarPrefetch (below) will be valid. If FALSE then + // the minimum and maximum values should be treated as a block count + // (BlockPrefetch) + // + + BOOLEAN PrefetchScalar; + + // + // Contains the minimum and maximum amount of data which will be + // will be prefetched into the cache on a disk operation. This value + // may either be a scalar multiplier of the transfer length of the request, + // or an abolute number of disk blocks. PrefetchScalar (above) indicates + // which interpretation is used. + // + + union { + struct { + WORD Minimum; + WORD Maximum; + + // + // The maximum number of blocks which will be prefetched - useful + // with the scalar limits to set definite upper limits. + // + + WORD MaximumBlocks; + } ScalarPrefetch; + + struct { + WORD Minimum; + WORD Maximum; + } BlockPrefetch; + }; + +} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION; + +// +// IOCTL_DISK_GROW_PARTITION will update the size of a partition +// by adding sectors to the length. The number of sectors must be +// predetermined by examining PARTITION_INFORMATION. +// + +typedef struct _DISK_GROW_PARTITION { + DWORD PartitionNumber; + LARGE_INTEGER BytesToGrow; +} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION; +#endif /* _WIN32_WINNT >= 0x0500 */ + +/////////////////////////////////////////////////////// +// // +// The following structures define disk performance // +// statistics: specifically the locations of all the // +// reads and writes which have occured on the disk. // +// // +// To use these structures, you must issue an IOCTL_ // +// DISK_HIST_STRUCTURE (with a DISK_HISTOGRAM) to // +// obtain the basic histogram information. The // +// number of buckets which must allocated is part of // +// this structure. Allocate the required number of // +// buckets and call an IOCTL_DISK_HIST_DATA to fill // +// in the data // +// // +/////////////////////////////////////////////////////// + +#define HIST_NO_OF_BUCKETS 24 + +typedef struct _HISTOGRAM_BUCKET { + DWORD Reads; + DWORD Writes; +} HISTOGRAM_BUCKET, *PHISTOGRAM_BUCKET; + +#define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET) + +typedef struct _DISK_HISTOGRAM { + LARGE_INTEGER DiskSize; + LARGE_INTEGER Start; + LARGE_INTEGER End; + LARGE_INTEGER Average; + LARGE_INTEGER AverageRead; + LARGE_INTEGER AverageWrite; + DWORD Granularity; + DWORD Size; + DWORD ReadCount; + DWORD WriteCount; + PHISTOGRAM_BUCKET Histogram; +} DISK_HISTOGRAM, *PDISK_HISTOGRAM; + +#define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM) + +/////////////////////////////////////////////////////// +// // +// The following structures define disk debugging // +// capabilities. The IOCTLs are directed to one of // +// the two disk filter drivers. // +// // +// DISKPERF is a utilty for collecting disk request // +// statistics. // +// // +// SIMBAD is a utility for injecting faults in // +// IO requests to disks. // +// // +/////////////////////////////////////////////////////// + +// +// The following structure is exchanged on an IOCTL_DISK_GET_PERFORMANCE +// request. This ioctl collects summary disk request statistics used +// in measuring performance. +// + +typedef struct _DISK_PERFORMANCE { + LARGE_INTEGER BytesRead; + LARGE_INTEGER BytesWritten; + LARGE_INTEGER ReadTime; + LARGE_INTEGER WriteTime; + LARGE_INTEGER IdleTime; + DWORD ReadCount; + DWORD WriteCount; + DWORD QueueDepth; + DWORD SplitCount; + LARGE_INTEGER QueryTime; + DWORD StorageDeviceNumber; + WCHAR StorageManagerName[8]; +} DISK_PERFORMANCE, *PDISK_PERFORMANCE; + +// +// This structure defines the disk logging record. When disk logging +// is enabled, one of these is written to an internal buffer for each +// disk request. +// + +typedef struct _DISK_RECORD { + LARGE_INTEGER ByteOffset; + LARGE_INTEGER StartTime; + LARGE_INTEGER EndTime; + PVOID VirtualAddress; + DWORD NumberOfBytes; + BYTE DeviceNumber; + BOOLEAN ReadRequest; +} DISK_RECORD, *PDISK_RECORD; + +// +// The following structure is exchanged on an IOCTL_DISK_LOG request. +// Not all fields are valid with each function type. +// + +typedef struct _DISK_LOGGING { + BYTE Function; + PVOID BufferAddress; + DWORD BufferSize; +} DISK_LOGGING, *PDISK_LOGGING; + +// +// Disk logging functions +// +// Start disk logging. Only the Function and BufferSize fields are valid. +// + +#define DISK_LOGGING_START 0 + +// +// Stop disk logging. Only the Function field is valid. +// + +#define DISK_LOGGING_STOP 1 + +// +// Return disk log. All fields are valid. Data will be copied from internal +// buffer to buffer specified for the number of bytes requested. +// + +#define DISK_LOGGING_DUMP 2 + +// +// DISK BINNING +// +// DISKPERF will keep counters for IO that falls in each of these ranges. +// The application determines the number and size of the ranges. +// Joe Lin wanted me to keep it flexible as possible, for instance, IO +// sizes are interesting in ranges like 0-4096, 4097-16384, 16385-65536, 65537+. +// + +#define DISK_BINNING 3 + +// +// Bin types +// + +typedef enum _BIN_TYPES { + RequestSize, + RequestLocation +} BIN_TYPES; + +// +// Bin ranges +// + +typedef struct _BIN_RANGE { + LARGE_INTEGER StartValue; + LARGE_INTEGER Length; +} BIN_RANGE, *PBIN_RANGE; + +// +// Bin definition +// + +typedef struct _PERF_BIN { + DWORD NumberOfBins; + DWORD TypeOfBin; + BIN_RANGE BinsRanges[1]; +} PERF_BIN, *PPERF_BIN ; + +// +// Bin count +// + +typedef struct _BIN_COUNT { + BIN_RANGE BinRange; + DWORD BinCount; +} BIN_COUNT, *PBIN_COUNT; + +// +// Bin results +// + +typedef struct _BIN_RESULTS { + DWORD NumberOfBins; + BIN_COUNT BinCounts[1]; +} BIN_RESULTS, *PBIN_RESULTS; + +#ifndef _FILESYSTEMFSCTL_ +#define _FILESYSTEMFSCTL_ + +// +// The following is a list of the native file system fsctls followed by +// additional network file system fsctls. Some values have been +// decommissioned. +// + +#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_READ_VOLUME_METADATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_BUFFERED, FILE_READ_ACCESS) +#define FSCTL_WRITE_VOLUME_METADATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +// +// Structure for FSCTL_READ_VOLUME_METADATA and FSCTL_WRITE_VOLUME_METADATA. +// + +typedef struct _FSCTL_VOLUME_METADATA { + DWORD ByteOffset; + DWORD TransferLength; + PVOID TransferBuffer; +} FSCTL_VOLUME_METADATA, *PFSCTL_VOLUME_METADATA; + +#endif // _FILESYSTEMFSCTL_ + + +#endif // _WINIOCTL_ + diff --git a/Cerbios Custom Splash/AppCover.jpg b/Cerbios Custom Splash/AppCover.jpg new file mode 100644 index 0000000..d8cfb97 Binary files /dev/null and b/Cerbios Custom Splash/AppCover.jpg differ diff --git a/Cerbios Custom Splash/CustomCerbiosSplash.zip b/Cerbios Custom Splash/CustomCerbiosSplash.zip new file mode 100644 index 0000000..668f7a8 Binary files /dev/null and b/Cerbios Custom Splash/CustomCerbiosSplash.zip differ diff --git a/Cerbios Custom Splash/README.txt b/Cerbios Custom Splash/README.txt new file mode 100644 index 0000000..33dd142 --- /dev/null +++ b/Cerbios Custom Splash/README.txt @@ -0,0 +1,30 @@ +************************************************************************ +************************************************************************ + Use your D-Pad UP and Down to scoll UP and Down. + To close this window press the "Back" button. +************************************************************************ +************************************************************************ + +The files are double packed to avoid some problems and make easy use +of UX unzip instead of copy. + +Just in case a user do something like " Ohhh I have copied it but let +me copy it 20 times more just because I can". +That would lead into errors or me coding writing a copy dummy file +delete dumm file routine first before the file be be copied. +Unzip on the other hand just overwrites the file which, as I said, +copy doesn't do. + +So the first MD5 of the first zip will not match up! + +When you unpack the first zip you get another one which will match +the given MD5! + + +************************************************************************ +************************************************************************ + +PEACE! + +************************************************************************ +************************************************************************ \ No newline at end of file diff --git a/Cerbios Custom Splash/default.jpg b/Cerbios Custom Splash/default.jpg new file mode 100644 index 0000000..72090ed Binary files /dev/null and b/Cerbios Custom Splash/default.jpg differ diff --git a/Cerbios Custom Splash/default.tbn b/Cerbios Custom Splash/default.tbn new file mode 100644 index 0000000..72090ed Binary files /dev/null and b/Cerbios Custom Splash/default.tbn differ diff --git a/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME UX (23.7.2024).rar b/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME UX (23.7.2024).rar new file mode 100644 index 0000000..56c11e6 Binary files /dev/null and b/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME UX (23.7.2024).rar differ diff --git a/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME UX (23.7.2024).zip b/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME UX (23.7.2024).zip new file mode 100644 index 0000000..7afabae Binary files /dev/null and b/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME UX (23.7.2024).zip differ diff --git a/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME X4G (23.7.2024).rar b/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME X4G (23.7.2024).rar new file mode 100644 index 0000000..2bdf0ff Binary files /dev/null and b/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME X4G (23.7.2024).rar differ diff --git a/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME X4G (23.7.2024).zip b/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME X4G (23.7.2024).zip new file mode 100644 index 0000000..1789d19 Binary files /dev/null and b/Cerbios Installers/OGXBox Cerbios BFM USB Softmod Installer v2.4.1 Build 04 ENDGAME X4G (23.7.2024).zip differ diff --git a/Cerbios Installers/OGXBox Cerbios MC TSOP Flasher v2.3.1 Build 001 - EvoX Edition - 07.07.2023.rar b/Cerbios Installers/OGXBox Cerbios MC TSOP Flasher v2.3.1 Build 001 - EvoX Edition - 07.07.2023.rar new file mode 100644 index 0000000..14868bf Binary files /dev/null and b/Cerbios Installers/OGXBox Cerbios MC TSOP Flasher v2.3.1 Build 001 - EvoX Edition - 07.07.2023.rar differ diff --git a/Cerbios Installers/OGXBox Cerbios MC TSOP Flasher v2.3.1 Build 004 - UX Edition - 07.07.2023.rar b/Cerbios Installers/OGXBox Cerbios MC TSOP Flasher v2.3.1 Build 004 - UX Edition - 07.07.2023.rar new file mode 100644 index 0000000..c1789d7 Binary files /dev/null and b/Cerbios Installers/OGXBox Cerbios MC TSOP Flasher v2.3.1 Build 004 - UX Edition - 07.07.2023.rar differ diff --git a/Cerbios Intro Maker/AppCover.jpg b/Cerbios Intro Maker/AppCover.jpg new file mode 100644 index 0000000..7481161 Binary files /dev/null and b/Cerbios Intro Maker/AppCover.jpg differ diff --git a/Cerbios Intro Maker/Cerbios Intro Maker.zip b/Cerbios Intro Maker/Cerbios Intro Maker.zip new file mode 100644 index 0000000..158e8b9 Binary files /dev/null and b/Cerbios Intro Maker/Cerbios Intro Maker.zip differ diff --git a/Cerbios Intro Maker/README.txt b/Cerbios Intro Maker/README.txt new file mode 100644 index 0000000..33dd142 --- /dev/null +++ b/Cerbios Intro Maker/README.txt @@ -0,0 +1,30 @@ +************************************************************************ +************************************************************************ + Use your D-Pad UP and Down to scoll UP and Down. + To close this window press the "Back" button. +************************************************************************ +************************************************************************ + +The files are double packed to avoid some problems and make easy use +of UX unzip instead of copy. + +Just in case a user do something like " Ohhh I have copied it but let +me copy it 20 times more just because I can". +That would lead into errors or me coding writing a copy dummy file +delete dumm file routine first before the file be be copied. +Unzip on the other hand just overwrites the file which, as I said, +copy doesn't do. + +So the first MD5 of the first zip will not match up! + +When you unpack the first zip you get another one which will match +the given MD5! + + +************************************************************************ +************************************************************************ + +PEACE! + +************************************************************************ +************************************************************************ \ No newline at end of file diff --git a/Cerbios Playbook/The Cerbios Playbook v1.5.pdf b/Cerbios Playbook/The Cerbios Playbook v1.5.pdf new file mode 100644 index 0000000..f8f0a43 Binary files /dev/null and b/Cerbios Playbook/The Cerbios Playbook v1.5.pdf differ diff --git a/Cerbios Tool/- Cerbios Tool V2.0.2 b/Cerbios Tool/- Cerbios Tool V2.0.2 new file mode 100644 index 0000000..06d7405 Binary files /dev/null and b/Cerbios Tool/- Cerbios Tool V2.0.2 differ diff --git a/Cerbios Tool/AppCover.jpg b/Cerbios Tool/AppCover.jpg new file mode 100644 index 0000000..c904eb8 Binary files /dev/null and b/Cerbios Tool/AppCover.jpg differ diff --git a/Cerbios Tool/CerbiosTool-linux-x64.zip b/Cerbios Tool/CerbiosTool-linux-x64.zip new file mode 100644 index 0000000..6301766 Binary files /dev/null and b/Cerbios Tool/CerbiosTool-linux-x64.zip differ diff --git a/Cerbios Tool/CerbiosTool-osx-x64.zip b/Cerbios Tool/CerbiosTool-osx-x64.zip new file mode 100644 index 0000000..37ee4ca Binary files /dev/null and b/Cerbios Tool/CerbiosTool-osx-x64.zip differ diff --git a/Cerbios Tool/CerbiosTool-win-x64.zip b/Cerbios Tool/CerbiosTool-win-x64.zip new file mode 100644 index 0000000..ec96bb7 Binary files /dev/null and b/Cerbios Tool/CerbiosTool-win-x64.zip differ diff --git a/Cerbios Tool/README.txt b/Cerbios Tool/README.txt new file mode 100644 index 0000000..47dcd72 --- /dev/null +++ b/Cerbios Tool/README.txt @@ -0,0 +1,43 @@ +************************************************************************ +************************************************************************ + Use your D-Pad UP and Down to scoll UP and Down. + To close this window press the "Back" button. +************************************************************************ +************************************************************************ + +The files are double packed to avoid some problems and make easy use +of UX unzip instead of copy. + +Just in case a user do something like " Ohhh I have copied it but let +me copy it 20 times more just because I can". + +That would lead into errors or me writing a copy dummy file +then delete it routine which just blows up the config. +Unzip on the other hand just overwrites the file which, as I said, +copy doesn't do in UX. + +Windows +MD5 Zip (Disc) .............. : dbcd0067e46204db750eddfce3358cc6 +MD5 Zip (Final) ............. : c45f65074d34ed329227a5d51ba41f33 + +Lunix +MD5 Zip (Disc) .............. : 59b4d2acf19758dbd4bdea9a1bf122e7 +MD5 Tar (Final) ............. : bd919845fab1921de7b40d8651de86dd + +Mac +MD5 Zip (Disc) .............. : 995b4d639f5545a0bd9aed958ee742f3 +MD5 Tar (Final) ............. : bcf77033a266cbcfab3aef2a4d145f5c + + +Note: +MD5 Zip 1 (Disc) .... : The one you get if you have unpacked the ISO. +MD5 Zip 2 (Final) ... : The one you get after you used the copy (Unzip) function. + + +************************************************************************ +************************************************************************ + +PEACE! + +************************************************************************ +************************************************************************ \ No newline at end of file