diff --git a/.directory b/.directory new file mode 100644 index 0000000..db0006e --- /dev/null +++ b/.directory @@ -0,0 +1,3 @@ +[Dolphin] +Timestamp=2017,8,28,19,30,2 +Version=3 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..11fb517 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +Libs/* +*.o +Obj/ diff --git a/Building.c b/Building.c deleted file mode 100644 index daecf24..0000000 --- a/Building.c +++ /dev/null @@ -1,112 +0,0 @@ -/* ************************************** - * Includes * - * **************************************/ - -#include "Building.h" -#include "BarracksSpr.c" - -/* ************************************** - * Defines * - * **************************************/ - -/* ************************************** - * Local variables * - * **************************************/ - -/* Sprites */ -static TYPE_SPRITE BarracksSpr; -static TYPE_SPRITE BarracksShadowSpr; - -/* Tables */ -static uint8_t BuildingHPTable[] = { 100 }; -static TYPE_SPRITE * BuildingSprTable[] = {&BarracksSpr}; -static TYPE_SPRITE * BuildingShadowSprTable[] = {&BarracksShadowSpr}; - -void BuildingInit(void) -{ - BarracksSpr.Data = BarracksSpr_Data; - BarracksSpr.w = GfxGetWidthFromSpriteData(BarracksSpr_Data); - BarracksSpr.h = GfxGetHeightFromSpriteData(BarracksSpr_Data); - BarracksSpr.flip = 0; - BarracksSpr.rotation = 0; - BarracksSpr.color = GFX_BLACK; - - BarracksShadowSpr.Data = BarracksShadowSpr_Data; - BarracksShadowSpr.w = GfxGetWidthFromSpriteData(BarracksShadowSpr_Data); - BarracksShadowSpr.h = GfxGetHeightFromSpriteData(BarracksShadowSpr_Data); - BarracksShadowSpr.flip = 0; - BarracksShadowSpr.rotation = 0; - BarracksShadowSpr.color = GFX_GRAY; - -} - -uint8_t BuildingGetHpFromID(TYPE_BUILDING_ID id) -{ - return BuildingHPTable[id]; -} - -void BuildingSelectedOptions(TYPE_BUILDING * ptrBuilding) -{ - - -} - -void BuildingDraw(TYPE_CAMERA * ptrCamera, TYPE_BUILDING * ptrBuilding, bool bSelected) -{ - uint8_t id = ptrBuilding->id; - - if(ptrBuilding->built == false) - { - return; - } - - CameraApplyCoordinatesToSprite( ptrCamera, - BuildingShadowSprTable[id], - ptrBuilding->x - 6, - ptrBuilding->y ); - GfxDrawSprite(BuildingShadowSprTable[id]); - - CameraApplyCoordinatesToSprite( ptrCamera, - BuildingSprTable[id], - ptrBuilding->x, - ptrBuilding->y ); - - GfxDrawSprite(BuildingSprTable[id]); - - int8_t color = GFX_WHITE; - - if( (bSelected == true) && (ptrBuilding->selected == false) ) - { - color = GFX_GRAY; - } - else if(ptrBuilding->selected == true) - { - color = GFX_BLACK; - } - - if(color != GFX_WHITE) - { - TYPE_COLLISION_BLOCK cb = CameraApplyCoordinatesToCoordinates(ptrCamera, ptrBuilding->x, ptrBuilding->y); - - cb.w = BuildingGetWidthFromID(ptrBuilding->id); - cb.h = BuildingGetWidthFromID(ptrBuilding->id); - - GfxDrawRectangle( cb.x - (cb.w / 10), - cb.y - (cb.h / 10), - BuildingGetWidthFromID(ptrBuilding->id) + (cb.w / 5), - BuildingGetHeightFromID(ptrBuilding->id) + (cb.h / 5), - color ); - } - -} - -uint8_t BuildingGetWidthFromID(TYPE_BUILDING_ID id) -{ - return GfxGetWidthFromSpriteData(BuildingSprTable[id]->Data); -} - -uint8_t BuildingGetHeightFromID(TYPE_BUILDING_ID id) -{ - return GfxGetHeightFromSpriteData(BuildingSprTable[id]->Data); -} - diff --git a/Building.h b/Building.h deleted file mode 100644 index d88bfc4..0000000 --- a/Building.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __BUILDING_HEADER__ -#define __BUILDING_HEADER__ - -/* ************************************** - * Includes * - * **************************************/ - -#include "Global_Inc.h" -#include "Gfx.h" -#include "GameStructures.h" -#include "Camera.h" - -#ifdef __cplusplus -extern "C" -{ -#endif //__cplusplus - -/* ************************************** - * Defines * - * **************************************/ - - /* ************************************** - * Structs and enums * - * **************************************/ - - -/* ************************************** - * Global prototypes * - * **************************************/ - -void BuildingInit(void); -uint8_t BuildingGetHpFromID(TYPE_BUILDING_ID id); -uint8_t BuildingGetWidthFromID(TYPE_BUILDING_ID id); -uint8_t BuildingGetHeightFromID(TYPE_BUILDING_ID id); -void BuildingDraw(TYPE_CAMERA * ptrCamera, TYPE_BUILDING * ptrBuilding, bool bSelected); -void BuildingSelectedOptions(TYPE_BUILDING * ptrBuilding); - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif //__BUILDING_HEADER__ diff --git a/Camera.c b/Camera.c index 6127ed4..5b5c9c7 100644 --- a/Camera.c +++ b/Camera.c @@ -3,6 +3,8 @@ * *************************************/ #include "Camera.h" +#include "Gfx.h" +#include "Pad.h" /* ************************************* * Defines @@ -16,33 +18,31 @@ * Local Prototypes * *************************************/ -static void CameraUpdateSpeed(TYPE_CAMERA * ptrCamera); -static bool CameraSpecialConditions(TYPE_CAMERA * ptrCamera); +static void CameraUpdateSpeed(TYPE_CAMERA* ptrCamera); -void CameraInit(TYPE_CAMERA * ptrCamera) +void CameraInit(TYPE_CAMERA* ptrCamera) { ptrCamera->X_Offset = 0; ptrCamera->Y_Offset = 0; ptrCamera->X_Speed = 0; ptrCamera->Y_Speed = 0; ptrCamera->Speed_Timer = SPEED_CALCULATION_TIME; + ptrCamera->locked = false; } -TYPE_COLLISION_BLOCK CameraApplyCoordinatesToCoordinates( TYPE_CAMERA * ptrCamera, +TYPE_COLLISION_BLOCK CameraApplyCoordinatesToCoordinates( TYPE_CAMERA* ptrCamera, uint16_t x, uint16_t y ) { - TYPE_COLLISION_BLOCK cb; - - memset(&cb, 0, sizeof(TYPE_COLLISION_BLOCK)); - + TYPE_COLLISION_BLOCK cb = {0}; + cb.x = x + ptrCamera->X_Offset; cb.y = y + ptrCamera->Y_Offset; - + return cb; } -void CameraApplyCoordinatesToSprite(TYPE_CAMERA * ptrCamera, +void CameraApplyCoordinatesToSprite(TYPE_CAMERA* ptrCamera, TYPE_SPRITE * spr, uint16_t x, uint16_t y ) @@ -51,99 +51,98 @@ void CameraApplyCoordinatesToSprite(TYPE_CAMERA * ptrCamera, spr->y = (uint8_t)(y + ptrCamera->Y_Offset); } -void CameraUpdateSpeed(TYPE_CAMERA * ptrCamera) +void CameraUpdateSpeed(TYPE_CAMERA* ptrCamera) { - if(PadDirectionKeyPressed() == true) + if (PadDirectionKeyPressed() == true) { - if(PadButtonPressed(PAD_LEFT) == true) + if (PadButtonPressed(PAD_LEFT) == true) { - if(ptrCamera->X_Speed < 0) + if (ptrCamera->X_Speed < 0) { ptrCamera->X_Speed += 2; } - else if(ptrCamera->X_Speed < MAX_CAMERA_SPEED) + else if (ptrCamera->X_Speed < MAX_CAMERA_SPEED) { ptrCamera->X_Speed++; } } - - if(PadButtonPressed(PAD_UP) == true) + + if (PadButtonPressed(PAD_UP) == true) { - if(ptrCamera->Y_Speed < 0) + if (ptrCamera->Y_Speed < 0) { ptrCamera->Y_Speed += 2; } - else if(ptrCamera->Y_Speed < MAX_CAMERA_SPEED) + else if (ptrCamera->Y_Speed < MAX_CAMERA_SPEED) { ptrCamera->Y_Speed++; } } - - if(PadButtonPressed(PAD_DOWN) == true) + + if (PadButtonPressed(PAD_DOWN) == true) { - if(ptrCamera->Y_Speed > 0) + if (ptrCamera->Y_Speed > 0) { ptrCamera->Y_Speed -= 2; } - else if(ptrCamera->Y_Speed > -MAX_CAMERA_SPEED) + else if (ptrCamera->Y_Speed > -MAX_CAMERA_SPEED) { ptrCamera->Y_Speed--; } } - - if(PadButtonPressed(PAD_RIGHT) == true) + + if (PadButtonPressed(PAD_RIGHT) == true) { - if(ptrCamera->X_Speed > 0) + if (ptrCamera->X_Speed > 0) { ptrCamera->X_Speed -= 2; } - else if(ptrCamera->X_Speed > -MAX_CAMERA_SPEED) + else if (ptrCamera->X_Speed > -MAX_CAMERA_SPEED) { ptrCamera->X_Speed--; } } } - if( (PadButtonPressed(PAD_LEFT) == false) + if ( (PadButtonPressed(PAD_LEFT) == false) && (PadButtonPressed(PAD_RIGHT) == false) ) { - if(ptrCamera->X_Speed > 0) + if (ptrCamera->X_Speed > 0) { ptrCamera->X_Speed--; } - else if(ptrCamera->X_Speed < 0) + else if (ptrCamera->X_Speed < 0) { ptrCamera->X_Speed++; } } - - if( (PadButtonPressed(PAD_UP) == false) + + if ( (PadButtonPressed(PAD_UP) == false) && (PadButtonPressed(PAD_DOWN) == false) ) - { - if(ptrCamera->Y_Speed > 0) + { + if (ptrCamera->Y_Speed > 0) { ptrCamera->Y_Speed--; } - else if(ptrCamera->Y_Speed < 0) + else if (ptrCamera->Y_Speed < 0) { ptrCamera->Y_Speed++; } } } -void CameraHandler(TYPE_CAMERA * ptrCamera) +void CameraHandler(TYPE_CAMERA* ptrCamera) { - - if(CameraSpecialConditions(ptrCamera) == true) + if (ptrCamera->locked == true) { ptrCamera->X_Speed = 0; ptrCamera->Y_Speed = 0; return; } - - if(ptrCamera->Speed_Timer < SPEED_CALCULATION_TIME) + + if (ptrCamera->Speed_Timer < SPEED_CALCULATION_TIME) { ptrCamera->Speed_Timer++; } @@ -152,12 +151,12 @@ void CameraHandler(TYPE_CAMERA * ptrCamera) ptrCamera->Speed_Timer = 0; CameraUpdateSpeed(ptrCamera); } - - if((ptrCamera->X_Offset + ptrCamera->X_Speed) < 0) + + if ((ptrCamera->X_Offset + ptrCamera->X_Speed) < 0) { ptrCamera->X_Offset += ptrCamera->X_Speed; - - if(ptrCamera->X_Offset == 0) + + if (ptrCamera->X_Offset == 0) { ptrCamera->X_Speed = 0; } @@ -167,18 +166,18 @@ void CameraHandler(TYPE_CAMERA * ptrCamera) ptrCamera->X_Offset = 0; ptrCamera->X_Speed = 0; } - + /*char str[8]; - + snprintf(str, 8, "%u", ptrCamera->Y_Offset); - + GfxPrintText(str, 40, 40);*/ - - if((ptrCamera->Y_Offset + ptrCamera->Y_Speed) < 0) + + if ((ptrCamera->Y_Offset + ptrCamera->Y_Speed) < 0) { ptrCamera->Y_Offset += ptrCamera->Y_Speed; - - if(ptrCamera->Y_Offset == 0) + + if (ptrCamera->Y_Offset == 0) { ptrCamera->Y_Speed = 0; } @@ -190,8 +189,7 @@ void CameraHandler(TYPE_CAMERA * ptrCamera) } } -bool CameraSpecialConditions(TYPE_CAMERA * ptrCamera) +void CameraSetLock(TYPE_CAMERA* ptrCamera, bool value) { - - return false; + ptrCamera->locked = value; } diff --git a/Camera.h b/Camera.h index 5cba887..66a9fad 100644 --- a/Camera.h +++ b/Camera.h @@ -7,7 +7,6 @@ #include "Global_Inc.h" #include "Gfx.h" -#include "Pad.h" #ifdef __cplusplus extern "C" @@ -18,24 +17,37 @@ extern "C" /* ************************************* * Defines * *************************************/ - + /* ************************************* * Structs and enums * *************************************/ +typedef struct t_Camera +{ + int16_t X_Offset; + int16_t Y_Offset; + int8_t X_Speed; + int8_t Y_Speed; + uint8_t Speed_Timer; + bool locked; +}TYPE_CAMERA; + +typedef struct t_sprite TYPE_SPRITE; + /* ************************************* * Global prototypes * *************************************/ -void CameraInit(TYPE_CAMERA * ptrCamera); -void CameraHandler(TYPE_CAMERA * ptrCamera); -TYPE_COLLISION_BLOCK CameraApplyCoordinatesToCoordinates( TYPE_CAMERA * ptrCamera, - uint16_t x, - uint16_t y ); -void CameraApplyCoordinatesToSprite(TYPE_CAMERA * ptrCamera, - TYPE_SPRITE * spr, - uint16_t x, - uint16_t y ); +void CameraInit(TYPE_CAMERA* ptrCamera); +void CameraHandler(TYPE_CAMERA* ptrCamera); +void CameraSetLock(TYPE_CAMERA* ptrCamera, bool value); +void CameraApplyCoordinatesToSprite( TYPE_CAMERA* ptrCamera, + TYPE_SPRITE * spr, + uint16_t x, + uint16_t y ); +TYPE_COLLISION_BLOCK CameraApplyCoordinatesToCoordinates( TYPE_CAMERA* ptrCamera, + uint16_t x, + uint16_t y ); #ifdef __cplusplus } diff --git a/Exe/POCKET.ELF b/Exe/POCKET.ELF index 76a3ddd..e86408a 100755 Binary files a/Exe/POCKET.ELF and b/Exe/POCKET.ELF differ diff --git a/Exe/POCKET.HEX b/Exe/POCKET.HEX index 4096f4f..5d4a4a9 100644 --- a/Exe/POCKET.HEX +++ b/Exe/POCKET.HEX @@ -1,8 +1,8 @@ :100000000C9439030C9461030C9461030C94610308 :100010000C9461030C9461030C9461030C946103D0 -:100020000C9461030C9461030C9461030C94D81E2E +:100020000C9461030C9461030C9461030C94561EB0 :100030000C9461030C9461030C9461030C946103B0 -:100040000C94BD1F0C9461030C9461030C94610328 +:100040000C943B1F0C9461030C9461030C946103AA :100050000C9461030C9461030C9461030C94610390 :100060000C9461030C946103506F636B65742045BD :100070006D70697265730080007B00517569740052 @@ -10,21 +10,21 @@ :10009000044661696C656420746F206372656174E5 :1000A0006520756E697421004661696C6564207411 :1000B0006F20637265617465206275696C64696E36 -:1000C0006721000808003C4299A5661800080860EE -:1000D000BCC299A5671D02FD00EC00E400DF0051E1 -:1000E000756974004F7074696F6E73004D756C7430 -:1000F00069706C617965722067616D650053696E26 -:10010000676C6520706C617965722067616D650050 -:1001100018180000000000FEFE00FEFE003E3E003B -:10012000FEFE00FEFE001E1E001E1E001E1E001E05 -:100130001E001E1E001E1E001E1E001E1E001E1E75 -:10014000001E1E001E1E001E1E00FEFE00FEFE0003 -:100150003E3E00FEFE00FEFE00FE1818E700E7BD72 -:1001600000BDE7FFE7BD00BD81FF81E700E7A50017 -:10017000A5BDFFBDA500A5A500A5A500A5A500A539 -:10018000A500A5A500A5A500A5A500A5E700E7BDBC -:1001900000BDE7FFE7BD00BD81FF8181188181249B -:1001A00081FFFFFF03030705070504050504050399 +:1000C00067210018180000000000FEFE00FEFE0080 +:1000D0003E3E00FEFE00FEFE001E1E001E1E001E16 +:1000E0001E001E1E001E1E001E1E001E1E001E1EC6 +:1000F000001E1E001E1E001E1E001E1E00FEFE0014 +:10010000FEFE003E3E00FEFE00FEFE00FE1818E76A +:1001100000E7BD00BDE7FFE7BD00BD81FF81E7004F +:10012000E7A500A5BDFFBDA500A5A500A5A500A547 +:10013000A500A5A500A5A500A5A500A5A500A5E766 +:1001400000E7BD00BDE7FFE7BD00BD81FF8181186D +:1001500081812481FFFFFF0808003C4299A56618B1 +:1001600000080860BCC299A5671D02910180017852 +:1001700001730151756974004F7074696F6E73007B +:100180004D756C7469706C617965722067616D651D +:100190000053696E676C6520706C617965722067C9 +:1001A000616D6500030307050705040505040503E4 :1001B00006030207020201020203020E090E0E0DDF :1001C0000E0E0F0E070507050307050F05070507A8 :1001D00006070102050200070202070002070200EB @@ -102,1210 +102,1195 @@ :1006500000002300260029000000000025002800DB :100660002B0000000000240027002A007403BF03B1 :10067000C30311241FBECFEFD8E0DEBFCDBF11E012 -:10068000A0E0B1E0ECE7F1E502C005900D92A035E5 -:10069000B107D9F727E0A0E5B1E001C01D92A73A64 +:10068000A0E0B1E0E8E7F0E502C005900D92AE35DC +:10069000B107D9F727E0AEE5B1E001C01D92A5365C :1006A000B207E1F713E0C8E3D3E004C02197FE01ED -:1006B0000E942924C633D107C9F70E9463030C9412 -:1006C000B1280C9400000E945E200E94460480E540 -:1006D00091E00E94F51B68E670E080E591E00E94E1 -:1006E000781B0E94B20EF7CF1092A1011092A001C8 -:1006F00085E491E090939F0180939E01089580EEA0 -:1007000091E00E94DB0887E890E09093DF018093FE -:10071000DE0182E08093DD011092DB011092DC01AA -:1007200086E28093D70184E18093D8010E9403057B -:1007300086E090E00E948006882349F042E067E767 -:1007400070E080E591E00E94B3188111089580EE79 -:1007500091E00E942F0C0E94B40681110E94C703F1 -:100760000E940B058823E1F380EE91E00E940107CF -:1007700087ED91E00E941C050E94E303D9CF80EE33 -:1007800091E00C94C40680EE91E00C94C506809133 -:100790006605811117C081E0809366053091670579 -:1007A000209168058091690580916A0580916B05AB -:1007B00080916C0580916D0580916E05832F922F3D -:1007C0000C94B925089520916705309168054091F2 -:1007D000690550916A0560916B0570916C05809177 -:1007E0006D0590916E05A1E00E941D242093670580 -:1007F000309368054093690550936A0560936B05D3 -:1008000070936C0580936D0590936E0508958F929B +:1006B0000E94A723C633D107C9F70E9463030C9495 +:1006C0002F280C9400000E94DC1F0E9446048EE537 +:1006D00091E00E94731B68E670E08EE591E00E9455 +:1006E000F61A0E94F40EF7CF1092AF011092AE01ED +:1006F00082E591E09093AD018093AC0108958EEE78 +:1007000091E00E94800787E890E09093ED0180934C +:10071000EC0182E08093EB011092E9011092EA0172 +:1007200086E28093E50184E18093E6010E94B904AA +:1007300086E090E00E943C06882349F042E067E7AB +:1007400070E08EE591E00E943118811108958EEEDF +:1007500091E00E94D80B0E94700681110E94C7038D +:100760000E94C1048823E1F38EEE91E00E94BD0651 +:1007700085EE91E00E94D2040E94E303D9CF8EEE71 +:1007800091E00C9480068EEE91E00C9481068091AD +:10079000F304811117C081E08093F3043091F404D5 +:1007A0002091F5048091F6048091F7048091F8047B +:1007B0008091F9048091FA048091FB04832F922F99 +:1007C0000C94372508952091F4043091F50440915C +:1007D000F6045091F7046091F8047091F904809147 +:1007E000FA049091FB04A1E00E949B232093F4045F +:1007F0003093F5044093F6045093F7046093F804A3 +:100800007093F9048093FA049093FB0408958F92F7 :100810009F92AF92BF92CF92DF92EF92FF924B01E5 -:100820005C0169017A010E94B425BC01990F880B13 +:100820005C0169017A010E943225BC01990F880B95 :10083000990BC818D908EA08FB08A70196012F5F91 -:100840003F4F4F4F5F4F0E94D123680D791D8A1D86 +:100840003F4F4F4F5F4F0E944F23680D791D8A1D08 :100850009B1DFF90EF90DF90CF90BF90AF909F9047 -:100860008F900895E4E0F5E01386128611861086D5 +:100860008F900895E1E9F4E01386128611861086D0 :1008700010821182128213821482158216821782CC -:100880003C9685E0E436F80779F7089510926705FD -:10089000109268051092690510926A0510926B0516 -:1008A00010926C0510926D0510926E051092650500 -:1008B0000E943204109264050895EF92FF920F9304 -:1008C0001F93CF93DF93CDB7DEB72C970FB6F89475 -:1008D000DEBF0FBECDBF49835A836B837C839E836B -:1008E000EF82F88609871A873C8769817A814F8170 -:1008F0005885240F352F311D62177307C8F4860FF2 -:10090000972F911D4817590798F46B817C81498571 -:100910005A858C85840F952F911D6817790740F4AF -:100920002E81260F372F311D81E04217530708F023 -:1009300080E081702C960FB6F894DEBF0FBECDBF5D -:10094000DF91CF911F910F91FF90EF90089550E0AC -:10095000480F511D87FD5A9557FD0CC0843554F43E -:1009600030E0260F311D67FD3A9537FD03C081E069 -:1009700060330CF080E00895DC01643508F042C07B -:10098000403308F03FC090968C919097E62F062E4A -:10099000000CFF0B242F25952595259594E529021C -:1009A000E00DF11D1124E856FA4F2081342F3770E5 -:1009B0008230A1F4822F90E0032E02C09595879596 -:1009C0000A94E2F780958170882399F081E090E0A5 -:1009D00001C0880F3A95EAF7822B13C08330A1F744 -:1009E0001C968C916427062E000C770B682760FDFF -:1009F000EDCF81E090E001C0880F3A95EAF780954D -:100A00008223808308951092A40166E273E08EE948 -:100A100091E00C941E1580E591E00E94FB1791E097 -:100A2000811101C090E0892F0895FC01238142814A -:100A3000618180810C94A704EF920F931F93CF9351 -:100A4000DF93EC010E9415058823E1F01091BE01AF -:100A500040E06E818EE991E00E9471102F8138850F -:100A6000ED800C81498168818EE991E00E94371404 -:100A7000612F8EE991E0DF91CF911F910F91EF905F -:100A80000C946D10DF91CF911F910F91EF9008950D -:100A9000FC01849108950196FC01849108954CE332 -:100AA000BC0180E591E00C94D3160F931F93CF9374 -:100AB000DF938C01C091BC01D091BD01229740937E -:100AC000A7012093A8018EE991E00E941E1540E045 -:100AD00061E08EE991E00E947110B8018EE991E029 -:100AE0000E942722209749F0BE018EE991E0DF9114 -:100AF000CF911F910F910C941E15DF91CF911F91F3 -:100B00000F910895FF920F931F93CF93DF93D82FE8 -:100B1000162FC42FF22E242F0E94A7048823C1F081 -:100B20000091BE016F2D8EE991E00E946D102C2F77 -:100B3000412F6D2F8EE991E00E94FE10602F8EE90B -:100B400091E0DF91CF911F910F91FF900C946D1068 -:100B5000DF91CF911F910F91FF900895EF92FF9237 -:100B60000F931F93CF93DF93C82FD62F142FF22EFE -:100B70000E94A7048823D1F0E090BE01602F8EE987 -:100B800091E00E946D100F2D212F4D2F6C2F8EE9BB -:100B900091E00E94AD106E2D8EE991E0DF91CF9132 -:100BA0001F910F91FF90EF900C946D10DF91CF91FA -:100BB0001F910F91FF90EF900895EF92FF920F9386 -:100BC0001F93CF93DF93C82FD62F142FF22E0E949E -:100BD000A7048823D1F0E090BE01602F8EE991E058 -:100BE0000E946D100F2D212F4D2F6C2F8EE991E05B -:100BF0000E94D5106E2D8EE991E0DF91CF911F916B -:100C00000F91FF90EF900C946D10DF91CF911F9199 -:100C10000F91FF90EF900895CF92DF92FF920F9384 -:100C20001F93CF93DF93CDB7DEB728970FB6F89415 -:100C3000DEBF0FBECDBF6C0160E08EE991E00E9487 -:100C40006D1005E024E540E060E08EE991E00E944F -:100C5000D510F60180811F928F9386E091E09F93DB -:100C60008F931F9288E0F82EFF928E010F5F1F4F27 -:100C70001F930F930E94C42521E044E064EA71E0D1 -:100C8000C8010E945505F60181811F928F938BE068 -:100C900091E09F938F931F92FF921F930F930E9457 -:100CA000C42521E048E164EA71E0C8010E945505CD -:100CB000F60182811F928F9380E191E09F938F9341 -:100CC0001F92FF921F930F930E94C42521E040E3DF -:100CD00064EA71E0C8010E9455050FB6F894DEBFC2 -:100CE0000FBECDBF28960FB6F894DEBF0FBECDBFA6 -:100CF000DF91CF911F910F91FF90DF90CF900895DA -:100D0000682F8AE591E00E94CC0F91E0811101C02B -:100D100090E0892F0895CF93C62F682F8AE591E040 -:100D20000E94EB0F91E0C81708F090E0892FCF9157 -:100D3000089560E00C948B0681E090E00E94990693 -:100D4000811110C083E090E00E94990681110AC0D1 -:100D500090E080E00E949906811104C082E090E05A -:100D60000C94990681E008950E949C0681110AC0A6 -:100D700084E090E00E949906811104C085E090E033 -:100D80000C94990681E00895089508950F931F9398 -:100D9000CF93DF93CDB7DEB728970FB6F894DEBFB9 -:100DA0000FBECDBF162F00E028E044E56BE280E0E7 -:100DB0000E94DD051F921F9385E191E09F938F9321 -:100DC0001F9288E08F938E010F5F1F4F1F930F9329 -:100DD0000E94C4252CE244E064EA71E0C8010E944C -:100DE00055050FB6F894DEBF0FBECDBF28960FB6DF -:100DF000F894DEBF0FBECDBFDF91CF911F910F9151 -:100E000008956F927F928F929F92AF92BF92CF92EE -:100E1000DF92EF92FF920F931F93CF93DF93EC013A -:100E20004C0180E1881A8EEF980A8E017E01E0EF76 -:100E3000EE1AECEFFE0A712C6E01FEEECF1AFCEFFB -:100E4000DF0A5E0187EEA81A8CEFB80AF4018781E9 -:100E50008823D1F041E0F6018081918188159905C0 -:100E600009F040E0B401C5010E94FA0EF40160846B -:100E7000662051F0711008C06481CE010E94C60640 -:100E8000C4010E94ED0E762CF9E08F0E911C8E1499 -:100E90009F04E1F64E0180E2881A8EEF980A5E0107 -:100EA000E7EEAE1AECEFBE0AF801858D8823F1F06B -:100EB0006801F0E1CF0ED11C41E0F7018081918102 -:100EC0008C159D0509F040E0B601C5010E946F0D2B -:100ED000F801668C662051F0711008C0608DCE015B -:100EE0000E94C606C6010E945F0E762C015F1F4F4E -:100EF00008151905C9F6CD5DDC4F4881442331F052 -:100F000001E022E06CE284E40E94AE05DF91CF9123 -:100F10001F910F91FF90EF90DF90CF90BF90AF9017 -:100F20009F908F907F906F9008956F927F928F9295 -:100F30009F92AF92BF92CF92DF92EF92FF920F9368 -:100F40001F93CF93DF9300D000D000D0CDB7DEB792 -:100F50004C015B013C0180EF681A8CEF780A640158 -:100F6000E0E1CE1AEEEFDE0AF6018781882309F46C -:100F70005AC0808191819A838983828193819C83E5 -:100F80008B83858196810E94EE0E8D83F60185818B -:100F900096810E94F40E8E83E980FA800B811C8179 -:100FA0002D81382FF50140815181628173818481C7 -:100FB00095810E945D048823B1F120E830E040E093 -:100FC00050E060E070E0CB010E940704F5017183FE -:100FD000608320E830E040E050E060E070E0CB016A -:100FE0000E940704F50173836283809170058F5F0F -:100FF00080937005803108F4B2CF80E026960FB65A -:10100000F894DEBF0FBECDBFDF91CF911F910F913E -:10101000FF90EF90DF90CF90BF90AF909F908F9018 -:101020007F906F900895F9E0CF0ED11CC614D704BD -:1010300009F09ACF1092700581E0E0CF8F929F92D5 -:10104000AF92BF92CF92DF92EF92FF920F931F93D6 -:10105000CF93DF9300D000D000D0CDB7DEB77C01B6 -:101060004B0109831A832B833C834D835E83BE012E -:101070006F5F7F4F0E949507B82E8823A9F1670103 -:101080008AEEC81A8CEFD80AF6018081803208F007 -:101090003FC099E0A92E8701A89E000D111D1124C3 -:1010A000F801EB50FE4F91828082359789819A81B9 -:1010B0009183808332968B819C8191838083C4014C -:1010C0000E94EB0EF801EC50FE4F8083F601808108 -:1010D000A89EE00CF11C1124F701E950FE4F91E0AD -:1010E00090838F5FF60180838B2D26960FB6F89440 -:1010F000DEBF0FBECDBFDF91CF911F910F91FF904B -:10110000EF90DF90CF90BF90AF909F908F90089519 -:10111000B12CEACFBF92CF92DF92EF92FF920F9362 -:101120001F93CF93DF9300D000D000D0CDB7DEB7B0 -:101130007C01862F09831A832B833C8367019BEEF6 -:10114000C91A9CEFD90AF6019081903290F52FE0F0 -:10115000B22E8701B99E000D111D1124F801618F77 -:1011600029813A81318B208B2B813C81338B228BDF -:101170000E94180EF801808FF6018081F701B89E59 -:10118000E00DF11D112491E0958F8F5FF6018083B2 -:1011900081E026960FB6F894DEBF0FBECDBFDF917B -:1011A000CF911F910F91FF90EF90DF90CF90BF9064 -:1011B000089580E0EECFEF92FF920F931F93CF93AD -:1011C000DF9300D000D000D0CDB7DEB77C01FC01AA -:1011D000EB5EFC4F1082319610828C01005F1C4F39 -:1011E000D8011D921C92349711821082875E9C4F09 -:1011F0000E945E0C0E94C20E0E943F0DF701E0515A -:10120000FE4FCF0129E0DF01322F1D923A95E9F719 -:101210003996E017F107B9F7F70170962FE0DF0173 -:10122000322F1D923A95E9F73F96E817F907B9F77B -:1012300089E1F701E05EFC4F808382E33196808391 -:101240008BE43196808324E130E040E050E060E0C0 -:1012500070E0CB010E9407047A83698324E130E0C7 -:1012600040E050E060E070E0CB010E9407047C8326 -:101270006B8390E080E00E94EE0E8D8390E080E032 -:101280000E94F40E09811A812B813C814D81582FD7 -:1012900070E060E0C7010E941E08811104C088EA66 -:1012A00090E00E944F0528E330E040E050E060E32A -:1012B00070E080E090E00E9407047A83698328E36D -:1012C00030E040E050E060E370E080E090E00E94B9 -:1012D00007047C836B8380E00E94690D8D8380E02E -:1012E0000E94120E09811A812B813C814D81582F59 -:1012F00060E0C7010E948A08811110C081E990E076 -:1013000026960FB6F894DEBF0FBECDBFDF91CF910A -:101310001F910F91FF90EF900C944F0526960FB6FA -:10132000F894DEBF0FBECDBFDF91CF911F910F911B -:10133000FF90EF900895CF93DF9300D000D000D0BE -:10134000CDB7DEB7FC01E55EFC4F2081318144E181 -:1013500050E0421B530B875E9C4FFC0180819181C2 -:1013600026E230E0281B390B3A8329835C834B83C8 -:101370003A815C8168E078E080E090E026960FB6E4 -:10138000F894DEBF0FBECDBFDF91CF9108952F92AD -:101390003F924F925F926F927F928F929F92AF9205 -:1013A000BF92CF92DF92EF92FF920F931F93CF9352 -:1013B000DF93CDB7DEB761970FB6F894DEBF0FBEEF -:1013C000CDBF8C012C0120E2421A2EEF520A7C0183 -:1013D00088248A94982C5401312C212CF701858D76 -:1013E0008823D9F1868D811138C0C8010E949B09DC -:1013F00029833A834B835C836D837E83F701C088A6 -:10140000D18862887388818D0E94690DF701818D72 -:101410000E94120E89819A81C81AD90A8B819C81F7 -:10142000681A790ACC9CC001CD9C900D900D1124B6 -:10143000669C9001679C300D300D1124820F931F24 -:10144000B0E0A0E088159905AA05BB0530F41701A6 -:10145000F0E12F0E311C4C015D012FE0E20EF11C7A -:10146000E414F50409F0BACF780130E1E31A3EEF55 -:10147000F30AB801605F7C4F798B688B44244A94EF -:10148000542C32011F821886E4E0CE2ED12CE9863E -:10149000FA86F7018781882309F463C0808581116A -:1014A00060C0C8010E949B0929833A834B835C83F7 -:1014B0006D837E83F7010190F081E02DFC87EB873F -:1014C000F7010280F381E02DFE87ED87F70185812A -:1014D00096810E94EE0E8F87F701858196810E948A -:1014E000F40E29813A81A601421B530B2B853C85C2 -:1014F000420F531F6F85262F30E035952795420FF9 -:10150000531F2B813C81F601E21BF30B9F016D857C -:101510007E85260F371F90E095958795280F391FF8 -:10152000449FC001459F900D900D1124229FA00162 -:10153000239F500D500D1124840F951FB0E0A0E0A3 -:1015400084159505A605B70530F0D301C2017F814A -:101550007987E885EA872C013D01F985FF832A8593 -:10156000288739E0E30EF11C688979896E157F05BB -:1015700009F08DCFD801A05FBC4FF801EE5EFC4FA3 -:1015800084149504A604B70490F111961C921E923F -:101590007F8170838885818391E9891691E099061E -:1015A000A104B10458F021E9421621E05206610479 -:1015B000710420F01D921C921182108261960FB668 -:1015C000F894DEBF0FBECDBFDF91CF911F910F9179 -:1015D000FF90EF90DF90CF90BF90AF909F908F9053 -:1015E0007F906F905F904F903F902F90089511964D -:1015F0003C922E9211821082CFCF0F931F93CF93E4 -:10160000DF93EC01FC01E850FE4F8C01885E9C4F9B -:1016100020812223D9F0FE01EE5EFC4F8081918172 -:101620000E94ED0ECE0180529E4FF801268D22239E -:1016300091F0C05FDC4F888199810E945F0E009716 -:1016400081F4DF91CF911F910F9108953996E8179A -:10165000F907F1F6E7CF015F1F4F8017910729F7D0 -:10166000F0CF2CE240E364EA71E0DF91CF911F916B -:101670000F910C945505EF92FF920F931F93CF9308 -:10168000DF9300D000D000D0CDB7DEB78C0184E06E -:1016900090E00E949906882341F0F801ED5DFC4F2F -:1016A0008081853010F48F5F808384E090E00E9419 -:1016B0008006882309F444C0F801E05FFC4FA08154 -:1016C000B181C8014096980120513E4F41E0A817D2 -:1016D000B90719F41E964C931E970F96821793071D -:1016E000B1F7D801AE5EBC4F0D90BC91A02D21E0AA -:1016F000A817B90719F418962C93189709968E17FE -:101700009F07B1F785E090E00E948006882329F0CA -:1017100080916F05882309F465C085E090E00E9400 -:101720008006811187C026960FB6F894DEBF0FBEE3 -:10173000CDBFDF91CF911F910F91FF90EF90089552 -:1017400065E084E090E00E948B068823C9F0F801F0 -:1017500030E020E0868D882361F04FE0429FC00199 -:10176000439F900D11244096800F911F0E947E0E82 -:10177000C9CF2F5F3F4F3F962032310559F7C2CF77 -:1017800065E085E090E00E948B06882321F080913F -:101790006F05882329F0F801ED5DFC4F1082B2CF70 -:1017A000C80180529E4FF801168E3F96E817F90740 -:1017B000D9F7F801E850FE4FC801885E9C4F1082AF -:1017C0003996E817F907D9F7D801A05FBC4F1196F1 -:1017D0001C921E9212961D921C9281E080936F05BE -:1017E000808390CFF801E85EFC4F8081811120C09A -:1017F000C8010E949B0929833A834B835C836D83D4 -:101800007E83780180E2E81A8EEFF80AF801868D6F -:10181000882341F04B815C8169817A81C8014096BF -:101820000E941A0E015F1F4F0E151F0579F77BCF1F -:10183000108279CF80916F05882309F474CF1092BC -:101840006F0526960FB6F894DEBF0FBECDBFDF91B1 -:10185000CF911F910F91FF90EF900C94A50EEF92F6 -:10186000FF920F931F93CF93DF93EC01875E9C4F02 -:101870000E94A50CCE010E94C7098E01005F1F4F78 -:101880007E0180E1E81A8EEFF80AC8010E94220E5C -:10189000015F1F4F0E151F05C1F7CE010E943B0BC4 -:1018A000CE010E94FD0ACE01805E9C4FDF91CF9158 -:1018B0001F910F91FF90EF900C940C06FC01118288 -:1018C0001082138212821482158283E08683089527 -:1018D000CF93DF93CDB7DEB72C970FB6F894DEBF6A -:1018E0000FBECDBF1C861B86FC0120813181620F9B -:1018F000731F78876F8382819381480F591F5A879E -:10190000498786E0FE013796DE01119601900D921F -:101910008A95E1F729813A814B815C816D817E81D5 -:1019200080E090E02C960FB6F894DEBF0FBECDBFDE -:10193000DF91CF910895FC019081490FDB014C9319 -:101940008281280F11962C930895CF93DF93EC0199 -:101950008E818330D8F48F5F8E832C81888199812A -:10196000820F911D27FD9A9597FF80C099838883E8 -:101970002D818A819B81820F911D27FD9A9597FF6A -:1019800079C09B838A83DF91CF9108951E820E9444 -:101990009C06882369F190E080E00E9499068823E4 -:1019A00029F08C8187FF47C08E5F8C8381E090E0B7 -:1019B0000E949906882329F08D8187FF41C08E5FA0 -:1019C0008D8383E090E00E949906882331F08D8119 -:1019D00018160CF03AC082508D8382E090E00E948D -:1019E0009906882329F08C8118169CF582508C83E7 -:1019F00090E080E00E94990681110BC082E090E0A7 -:101A00000E949906811105C08C81181634F5815009 -:101A10008C8381E090E00E94990681119ECF83E043 -:101A200090E00E949906811198CF8D811816CCF410 -:101A300081508D8392CF85300CF0B8CF8F5FB5CFBA -:101A400085300CF0BECF8F5FBBCF8C3F34F281501E -:101A5000C3CF8C3F6CF28150CACF8823D1F28F5F05 -:101A6000D7CF882309F479CF8F5FE3CF198218820B -:101A70001C827ECF1B821A821D8285CF08951F9300 -:101A8000CF93DF93CCE7D5E083EC90E098878F830A -:101A90000E9448058A8383EC90E00E944B058B836B -:101AA0001D821C8211E01E83C3E7D5E08DEC90E01F -:101AB00098878F830E9448058A838DEC90E00E946E -:101AC0004B058B831D821C821E83DF91CF911F915A -:101AD000089580918305909184050C944805BF92E8 -:101AE000CF92DF92EF92FF920F931F93CF93DF93EA -:101AF00000D000D000D0CDB7DEB76C018B01B42E82 -:101B0000FB018585882309F458C0848523E7E22EEC -:101B100025E0F22E811104C09CE7E92E95E0F92E14 -:101B2000F8019285F70194831582882341F0809112 -:101B30007205882321F081E0911182E08583F8010C -:101B40008385811106C0F7018581911146C08260AD -:101B50008583F8012281338140815181B701C6011B -:101B60000E949B0CC7010E941C05F8018685BB20C2 -:101B7000B1F1811134C04281538160817181C6010C -:101B80000E94680C29833A834B835C83F80181852A -:101B90000E94690D6B817C816D5F7F4FE981FA81C5 -:101BA00023E0482FCF0103960E94820580917105A2 -:101BB0008F5F853070F58093710526960FB6F89487 -:101BC000DEBF0FBECDBFDF91CF911F910F91FF9070 -:101BD000EF90DF90CF90BF9008958160B9CF8823B8 -:101BE00029F3F8014281538160817181C6010E940D -:101BF000680C29833A834B835C83F80181850E94BA -:101C0000690D6B817C816D5F7F4FE981FA8121E0F5 -:101C1000C8CF109271058091720591E08927809359 -:101C20007205CBCF80918305909184050C944B0570 -:101C300089E10895FC01758364835783468381E0BD -:101C400084870895FC0184858823F9F020813181FF -:101C5000B901615071094481558146175707B0F4A5 -:101C60007183608391E092871386982F228133815C -:101C7000B90161507109468157814617570790F4A1 -:101C80007383628312861386848708952F5F3F4F84 -:101C900090E02417350750F73183208391E0928735 -:101CA0009387E3CF2F5F3F4F2417350730F43383FB -:101CB0002283128691E09387E7CF892FE5CF209189 -:101CC0008505222329F0213079F090E080E0089505 -:101CD000DC011996EC91B4E0EB9FF0011124E75C74 -:101CE000FE4F808191810895DC011996EC91B4E05A -:101CF000EB9FF0011124EF5CFE4FF3CF209185059F -:101D0000222319F02130A9F00895DC011996EC91F5 -:101D1000B4E0EB9FF0011124E75CFE4F0280F381F9 -:101D2000E02D309781F421110FC081E0809385056B -:101D30000895DC011996EC91B4E0EB9FF0011124B9 -:101D4000EF5CFE4FEBCF099408951092850508953E -:101D500020E1FC0111922A95E9F7BC0180E591E0B0 -:101D60000C94501C43E067ED70E080E591E00E9428 -:101D7000B318811106C080EE91E00E94A80E0C9469 -:101D80007F030895CF93DF93CFE8D5E08AE591E014 -:101D900098878F830E9448058A838AE591E00E9494 -:101DA0004B058B831D821C8281E08E83C6E8D5E0C3 -:101DB00080E191E098878F830E9448058A8380E1C3 -:101DC00091E00E944B058B831D821C8283E08E83F1 -:101DD000DF91CF91089584E6089508958091960546 -:101DE000909197050C9448058091960590919705E0 -:101DF0000C944B05BF92CF92DF92EF92FF920F931C -:101E00001F93CF93DF9300D000D000D0CDB7DEB7C3 -:101E10006C017B01142FFB018781882331F1228122 -:101E20003381408151814650510966E875E0C60111 -:101E30000E949B0C86E895E00E941C05F701228118 -:101E40003381408151816FE875E0C6010E949B0C8F -:101E50008FE895E00E941C05F7018085112311F0A1 -:101E6000882399F001E0811111C026960FB6F894ED -:101E7000DEBF0FBECDBFDF91CF911F910F91FF90BD -:101E8000EF90DF90CF90BF90089503E0F70142817B -:101E9000538160817181C6010E94680C29834B8344 -:101EA000F701858196810E94EE0ED82EF70185817B -:101EB00096810E94EE0EC82EF701858196810E94C0 -:101EC000F40E182F85E0B82E8C2D6B2D0E949D23CB -:101ED000180FF701858196810E94EE0E482F8D2DF7 -:101EE0006B2D0E949D23480F2AE08C2D622F0E94AB -:101EF0009D233B81381B8D2D0E949D239981212F8D -:101F0000632F981B892F0E94AE05AFCFFC0188E09C -:101F1000808389E0818387E0828386E0838384E015 -:101F2000848382E0858381E186830895FF920F9305 -:101F30001F93CF93DF93EC018C01095F1F4FFF24A8 -:101F4000FA9462E088810E943A2188810E94A4214B -:101F50002F81892B81F42F5F2F8360E088810E947D -:101F60003A212196C017D10761F7DF91CF911F91D8 -:101F70000F91FF9008952223A1F32F3F11F41F82A8 -:101F8000ECCFFF82EACFFC01E60FF11D81E09781E3 -:101F9000913009F080E00895FC01E60FF11D81E029 -:101FA00097819F3F09F080E00895860F911DFC0105 -:101FB0008781423038F49FEF980F81E09E3F50F0C8 -:101FC00080E008C08F3FE1F3642F0E949D2381E0F1 -:101FD0009130B1F70895860F911DFC0187818F3FE5 -:101FE00009F480E008958EBD0DB407FEFDCF8EB5D7 -:101FF00008951F93CF93DF93EC01162FF89460E0C0 -:102000008F850E947621888918161CF460E00E9452 -:102010007621812F0E94F30F888918161CF461E045 -:102020000E9476217894DF91CF911F910895E8E97D -:10203000F5E028EF31E0DF01A9011D924150504049 -:10204000E1F7DC0119961C9219971A961C920895D3 -:10205000CF92DF92EF92FF920F931F93CF93DF9374 -:10206000EC018C858F5F8C8788E9E82E85E0F82E5F -:1020700010E0612F6064CE010E94F90F60E8CE018C -:102080000E94F90F61E08F850E94762188891816D9 -:102090001CF460E00E947621670104E5F60181915D -:1020A0006F010E94F30F0150C9F7888918161CF4BC -:1020B00061E00E9476211F5FF4E5EF0EF11C1630FF -:1020C000C1F660E4CE01DF91CF911F910F91FF9097 -:1020D000EF90DF90CF900C94F90FFC0160A361A307 -:1020E0000895FC0160A341A30895EF92FF920F931E -:1020F0001F93CF93DF938C01D62FF42EE22EC0E0F6 -:10210000CE1544F44F2D4C0F6D2FC8010E94BC0416 -:10211000CF5FF6CFDF91CF911F910F91FF90EF909E -:102120000895EF92FF920F931F93CF93DF938C014B -:10213000F62ED42FE22EC0E0CE1544F46F2D6C0F96 -:102140004D2FC8010E94BC04CF5FF6CFDF91CF9125 -:102150001F910F91FF90EF900895EF92FF920F93D0 -:102160001F93CF93DF937C01162FD42FC22F0E9491 -:1021700091104FEF400F4D0F2C2F612FC7010E9480 -:102180009110202F4D2F612FC7010E9475106FEF06 -:102190006C0F610F202F4D2FC701DF91CF911F9141 -:1021A0000F91FF90EF900C947510DF92EF92FF92D9 -:1021B0000F931F93CF93DF937C01D62FD22EC42F82 -:1021C000002E000C110B040F111D47FD1A958C2FCA -:1021D0000C2E000C990B8017910744F42D2D4C2FD9 -:1021E0006D2FC7010E949110CF5FF1CFDF91CF918A -:1021F0001F910F91FF90EF90DF9008959F92AF9203 -:10220000BF92CF92DF92EF92FF920F931F93CF93E3 -:10221000DF938C01E62EF42EC22F81E0D82ED21A45 -:10222000C22EC194CC0C422F4F0DC8010E94BC0499 -:102230004F2D4C1B6E2DC8010E94BC046C2F6E0DDF -:102240004F2DC8010E94BC046E2D6C1B4F2DC80180 -:102250000E94BC04D0E0DC170CF044C0D7FC04C0E2 -:10226000C150C394C394DC0CDF5F8D2F880F8F5F48 -:10227000D80E9E2C9D0EBF2CBC0E4B2D692DC80177 -:102280000E94BC04AE2CAD1A4B2D6A2DC8010E94D1 -:10229000BC04BF2CBC1A4B2D692DC8010E94BC0484 -:1022A0004B2D6A2DC8010E94BC04BF2CBD0E4B2DC6 -:1022B000AE2CAC0E6A2DC8010E94BC044B2DBE2C66 -:1022C000BC1A6B2DC8010E94BC049F2C9D1A492D7D -:1022D0006A2DC8010E94BC04492D6B2DC8010E94C3 -:1022E000BC04B9CFDF91CF911F910F91FF90EF9078 -:1022F000DF90CF90BF90AF909F9008958F929F9264 -:10230000AF92BF92CF92DF92EF92FF920F931F9303 -:10231000CF93DF937C01162FD42EC22F81E0C82EDD -:10232000C21AB22EB194BB0CD0E0802F8470A82EBC -:10233000802F8270982E802F8870882E0170DC1775 -:102340000CF04DC0C7FC04C0C150B394B394CB0C87 -:10235000DF5F8D2F880F8F5FC80EAA2071F04D2D83 -:102360004C0F612F6D0FC7010E94BC044D2D4D0F06 -:102370006C2F610FC7010E94BC04992071F04D2D94 -:102380004C1B612F6D0FC7010E94BC044D2D4D1BCE -:102390006C2F610FC7010E94BC04882071F04D2D85 -:1023A0004D0F612F6C1BC7010E94BC044D2D4C0FBB -:1023B000612F6D1BC7010E94BC04002309F4BFCF2D -:1023C0004D2D4D1B612F6C1BC7010E94BC044D2D70 -:1023D0004C1B612F6D1BC7010E94BC04B0CFDF9165 -:1023E000CF911F910F91FF90EF90DF90CF90BF9012 -:1023F000AF909F908F9008957F928F929F92AF920F -:10240000BF92CF92DF92EF92FF920F931F93CF93E1 -:10241000DF935C01C62E942EC22F11E0121BD22E28 -:10242000D194DD0C83E0F82ED0E0802F8170782EDF -:10243000882483948E0C0270DC17ACF517FD04C061 -:10244000C150D394D3941D0DDF5F1F0D772099F0F9 -:102450002C2F220F280D492D4C1B6C2D6D0FC50103 -:102460000E9475102E2D2F0D492D4D1B6C2F6C0DBC -:10247000C5010E947510002399F02C2F220F280D02 -:10248000492D4C1B6C2D6D1BC5010E9475102E2D06 -:102490002F0D492D4D1B6C2D6C1BC5010E94751015 -:1024A000F394F394C9CFDF91CF911F910F91FF90D7 -:1024B000EF90DF90CF90BF90AF909F908F907F90E4 -:1024C00008959F92AF92BF92CF92DF92EF92FF92C8 -:1024D0000F931F93CF93DF93EC01B62E142FD22EC0 -:1024E000AE2CAA0C922E9A18CE2CC60E292D6C2D2D -:1024F0000E949110FF24FA94F00EF10E292D4F2D19 -:102500006C2DCE010E9491100A191E0D202F412F13 -:102510006B2DCE010E947510DB0C6FEF6D0D202F1F -:10252000412FCE010E94751001E02E2D412F6C2D00 -:10253000CE010E947E118E2D8095D80E02E02E2DA8 -:10254000412F6D2DCE010E947E11FE1804E02E2D2C -:102550004F2D6D2DCE010E947E1108E02E2D4F2DA6 -:102560006C2DCE010E947E11DF91CF911F910F91B2 -:10257000FF90EF90DF90CF90BF90AF909F90089525 -:10258000AF92BF92CF92DF92EF92FF920F931F9381 -:10259000CF93DF936C01C62FF42EA22ED02F1E2DC9 -:1025A000EE0CB12EB60E2E196B2D0E94D510D15007 -:1025B000DE19F10E6FEF6C0F6A0D611BED2E01E05D -:1025C000212F4F2DC6010E94FC1102E0212F4F2D1B -:1025D0006B2DC6010E94FC11DF91CF911F910F91CD -:1025E000FF90EF90DF90CF90BF90AF9008952F9223 -:1025F0003F925F926F927F928F929F92AF92BF9223 -:10260000CF92DF92EF92FF920F931F93CF93DF93BE -:10261000EC01F901E4903196849164350CF015C118 -:102620000E2C000CFF08062F062E000C110BF701D4 -:10263000E00FF11F1E161F060CF007C140330CF00F -:1026400004C1A82FC42E042E000CDD085601A80ECC -:10265000B11C87FDBA941A141B040CF0F6C02E5F4F -:102660003F4F570197E0A90EB11CB7FE04C05701B8 -:10267000BEE0AB0EB11CB3E0B594A794BA95E1F7F8 -:1026800047FF0AC0A42FA80FAC9CC001AD9C900DC1 -:102690001124281B390B40E08A2F0A2E000C990BBD -:1026A000840F911D47FD9A95C19714F0A0E3A41BD8 -:1026B000F8A067FD60E0E535F10514F0E4E5F0E031 -:1026C0009E2FCC85C427C62E062E000CDD08F601F1 -:1026D000E01BF10B8F014F01F7E08F229924E0E816 -:1026E000F0E002C0F595E7958A94E2F77E2F17FF98 -:1026F00002C0095F1F4FF3E015950795FA95E1F7C2 -:10270000200F311F542F577081E001C0880F5A9558 -:10271000EAF7459545954595F601B4E54B02E00D80 -:10272000F11D1124AF0148565A4FD0E02A2EAA0FAE -:102730003308EE24E394BB24D21513040CF085C0B7 -:10274000F9015490F1E0FF121AC06901962E8A0136 -:10275000E72F991608F057C08E2E852021F0D8015A -:102760008C90882A8C92E69531F4BFEFCB1ADB0A65 -:10277000F6015490E0E893940F5F1F4FEACFF110F9 -:102780001CC0782E70946901962E8A01E72F991645 -:1027900008F039C08E2E852021F0D8018C9087203A -:1027A0008C92E69531F4BFEFCB1ADB0AF601549018 -:1027B000E0E893940F5F1F4FEACFF3E0FF122CC0C5 -:1027C000782E70946901862E8A01972E8916D0F48E -:1027D000E92DE52141F0D801EC916C2E682460FED2 -:1027E0000FC0E82BEC93969439F4BFEFCB1ADB0AB9 -:1027F000F6015490E0E89E2E83940F5F1F4FE6CFC2 -:10280000E721F0CFCE25880F19F44C5A5F4F81E0B5 -:10281000DF5F2A0D3B1D90CF6901962E8A01E72FBD -:10282000991688F78E2E852021F0D8018C90882665 -:102830008C92E69531F4BFEFCB1ADB0AF601549087 -:10284000E0E893940F5F1F4FEBCFDF91CF911F9183 -:102850000F91FF90EF90DF90CF90BF90AF909F903F -:102860008F907F906F905F903F902F9008952F9260 -:102870003F924F925F926F927F928F929F92AF9210 -:10288000BF92CF92DF92EF92FF920F931F93CF935D -:10289000DF9300D000D000D01F92CDB7DEB74C013F -:1028A000462E342E69018E2D01111DC0E1101BC072 -:1028B000C40127960FB6F894DEBF0FBECDBFDF91DF -:1028C000CF911F910F91FF90EF90DF90CF90BF902D -:1028D000AF909F908F907F906F905F904F903F90C0 -:1028E0002F900C94F712F60154903196E490A52C99 -:1028F000B12C9501295F3F4FA90133E055954795CC -:102900003A95E1F75B834A830370F12CEE2DF0E0FA -:10291000FD83EC835A941FEF1E0D2F2D0F2C000CFE -:10292000330B2A153B050CF070C0F982F7FE03C08B -:10293000F7E0FF0DF98329812595259525952983B4 -:102940009F2D977897FF03C09150986F9F5F20E865 -:10295000622E712C02C0759467949A95E2F7212C2F -:102960004981042E000C550B4E5F5F4F5F834E83F1 -:10297000222D022C000C330BEC81FD812E173F071A -:102980000CF041C04A815B81429FF001439FF00DF2 -:10299000529FF00D11242E813F81E20FF31FEC0DA9 -:1029A000FD1DE491F0E0E621F721EF2B41F102302B -:1029B00069F0612F62194F2D033061F0452D4F19D9 -:1029C000622D013039F0422D6F2D04C0652D6F1935 -:1029D000412F42198823A9F0382F3370398380FFA3 -:1029E00003C0552D561B652F81FF03C08E2D841B00 -:1029F000482F640D430DC4010E94BC0489812394B7 -:102A0000B7CF1982F6CFF39488CF27960FB6F894F4 -:102A1000DEBF0FBECDBFDF91CF911F910F91FF9011 -:102A2000EF90DF90CF90BF90AF909F908F907F906E -:102A30006F905F904F903F902F900895DC01FB01C5 -:102A400084918F5F14968C9314973196E491EF5F85 -:102A50001596EC9315976E5F7F4F5F967C936E9300 -:102A60005E970895EF920F93CF93DF93EC014E871B -:102A70006D872F87E98A088B81E0888788A319A250 -:102A80008F8366E273E0CE010E941E150E945A23D6 -:102A900081E00E94702385E00E947E238CE00E94EA -:102AA000792361E08E850E943A2161E08D850E9444 -:102AB0003A2161E08F850E943A21898918161CF419 -:102AC00061E00E943A21888918161CF461E00E9496 -:102AD0003A21898918166CF460E00E9476216AE038 -:102AE00070E080E090E00E94382061E089890E94D7 -:102AF00076218D85082E000C990BFC01E65CF94FC0 -:102B0000E491F0E0EE0FFF1FE85AF94F2591349160 -:102B10003D8B2C8BFC01EA5DF94FE491EB8F8E85A8 -:102B2000082E000C990BFC01E65CF94FE491F0E0F3 -:102B3000EE0FFF1FE85AF94F259134913B8B2A8BFA -:102B4000FC01EA5DF94FE491EA8F8889082E000CB8 -:102B5000990BFC01E65CF94FE491F0E0EE0FFF1FEA -:102B6000E85AF94F259134913F8B2E8BFC01EA5D99 -:102B7000F94FE491EC8F8F85082E000C990BFC0126 -:102B8000E65CF94FE491F0E0EE0FFF1FE85AF94FD1 -:102B900025913491398F288FFC01EA5DF94FE4913A -:102BA000ED8F61E2CE010E94F90F64E1CE010E9437 -:102BB000F90F8B8587FF02C08FE78B876B85606875 -:102BC000CE010E94F90F60E2CE010E94F90F6CE085 -:102BD000CE010E94F90FCE01DF91CF910F91EF90BE -:102BE0000C9428104F925F926F927F928F929F92D7 -:102BF000AF92BF92CF92DF92EF92FF920F931F930B -:102C0000CF93DF93EC01862EF42E102F83E58617E9 -:102C10000CF485C08FE284170CF481C04C814150C4 -:102C2000550B049FC001059F900D1124860F911D27 -:102C300067FD9A95181619060CF071C03D818F2D0D -:102C40000F2C000C990B039F800D911D1124181659 -:102C500019060CF064C078A0E62E912CC22ED12C5F -:102C6000292D092C000C330B8C8190E02817390793 -:102C70000CF054C00197E0E02817390771F0C89EA6 -:102C8000F001C99EF00DD89EF00D11242E0F3F1FAC -:102C9000EE8DFF8DE20FF31FE4915F2C612C492C28 -:102CA000480C2D81862D062C000C990B281719062F -:102CB00091F18CF1AE2EB12CE0FF16C0113061F411 -:102CC000462D4F0D642DCE010E94BC04F501F595F3 -:102CD000E7956394510EE5CF012F212F452D6E2DE1 -:102CE000CE010E94D510F2CF89A198A1891771F366 -:102CF00088A3113041F4462D4F0D642DCE010E9462 -:102D0000BC0478A2E3CF012F212F452D6E2DCE01DB -:102D10000E94D510F6CF9394E10EA2CF78A2DF9156 -:102D2000CF911F910F91FF90EF90DF90CF90BF90C8 -:102D3000AF909F908F907F906F905F904F9008958D -:102D40000F93CF93DF93EC01262F6A3049F4288547 -:102D50009D818A85299F800D11248A8719861DC02F -:102D60006D30D9F008854A8569850E94F21528855D -:102D70003C818985239F800D112489879F81992318 -:102D800061F0082E000C990B44E550E0239F401998 -:102D90005109112448175907DCF281E090E0DF91D6 -:102DA000CF910F910895FC01EC57FF4F7183608321 -:102DB0008A579F4F445FFC01408308956F927F9232 -:102DC0008F929F92AF92BF92CF92DF92EF920F932A -:102DD000CF93DF934C015C0186E8A80EB11CD501AE -:102DE0008C91882309F44AC0CCE0C81B8C3008F0D1 -:102DF000C0E0F401EA5AFF4F81E080836401BEE441 -:102E0000CB0ED11C60E0C6010E946D103401E3E5D9 -:102E10006E0E711CD3018C9103E0080FDDE24D2F83 -:102E2000481B4C0F83E0E82E24E560E0C6010E94B9 -:102E3000C01261E0C6010E946D10F301808103E0C1 -:102E4000080F4D2F481B4C0F24E560E0C6010E947F -:102E50006112F401E95AFF4F84E080833196D30177 -:102E60008C91C81BC15DC083BC9660817181C60115 -:102E70000E940422F501808181508083DF91CF91EF -:102E80000F91EF90DF90CF90BF90AF909F908F9079 -:102E90007F906F900895CF92DF92FF920F931F93D0 -:102EA000CF93DF93EC018C8D9D8D892B01F18E01E9 -:102EB000025B1F4F40E061E0C8010E947110FE01FB -:102EC000E95AFF4FDE01AE5ABF4F9C9185E5891B41 -:102ED000808331961082698D613009F46DC078F07D -:102EE000888D653008F082C06B5F811175C0DF91FD -:102EF000CF911F910F91FF90DF90CF900895CE0159 -:102F000085960E94A51E81E0FE01EA5AFF4F80834C -:102F100066E273E0C8010E941E151D8E1C8EFE0124 -:102F2000EC5AFF4F108288EAF82E6E018AE0C80E34 -:102F3000D11CCE010E94FB178823D9F365E175E00F -:102F4000C8010E9404226A8D7B8D4AE050E0C801CE -:102F50000E94132360E075E0C8010E9404226F2DD7 -:102F600062956F7070E04AE050E0C8010E94FF2255 -:102F700065EF74E0C8010E94042264E0C6010E946B -:102F8000C30F8111B4CFFA94F110D3CF60E0CE011A -:102F90000E94181F83B7817F846083BF83B78160DD -:102FA00083BF83B7816083BF889583B78E7F83BFDC -:102FB00083B78E7F83BFBDCFCF58DF4F8881998184 -:102FC000AA81BB818F709927AA27BB2767E0089742 -:102FD000A105B10508F068E7C801DF91CF911F9105 -:102FE0000F91FF90DF90CF900C942F22882309F44B -:102FF0007ECF6FE2F1CF8F929F92AF92BF92CF922E -:10300000DF92EF92FF920F931F93CF93DF93EC0128 -:103010007C0180E8E80EF11CF70180809180A2809D -:10302000B3800E940720861A970AA80AB90A6E017F -:10303000FFE7CF0ED11CF601808190E0B0E0A0E068 -:103040008E0105581F4F88159905AA05BB0508F084 -:103050004AC0F80180819181A281B381892B8A2B9A -:103060008B2B09F440C00E940720F6012081620FDB -:10307000711D811D911DF70160837183828393838C -:103080003F9780819181A281B3810196A11DB11DDD -:1030900080839183A283B383F8011082118212820C -:1030A00013820E941320FE01E958FF4F6083718351 -:1030B00082839383CE010E941C1FCE010A960E9438 -:1030C000960FCE0148960E94851F81E0DF91CF9137 -:1030D0001F910F91FF90EF90DF90CF90BF90AF9036 -:1030E0009F908F900895F80180819181A281B38192 -:1030F000892B8A2B8B2BA9F57E01F5E2EF0EF11CB3 -:10310000C7010E94601DC7010E94D31DC7010E9414 -:10311000971ECE010E94DE16CE010E944B177E0143 -:103120008EE4E80EF11CC7010E942810FE01EC5A43 -:10313000FF4F8081811103C0C7010E9417100E94B8 -:103140001320F8016083718382839383FE01EB581F -:10315000FF4FC958DF4F28813981621B730B718380 -:10316000608380E0B3CF2F923F924F925F926F9235 -:103170007F928F929F92AF92BF92CF92DF92EF9207 -:10318000FF920F931F93CF93DF93CDB7DEB7659771 -:103190000FB6F894DEBF0FBECDBF6C016A8B7B8B80 -:1031A0004B83FC01EC5AFF4F10822FEF2D831C82C2 -:1031B0001D8A10E31C8A3C013AE0630E711C842FC7 -:1031C00090E09F838E832601E3E54E0E511C46015D -:1031D000F5E28F0E911C9601295A3F4F39872887B7 -:1031E000C601885A9F4F9B878A87F601EA5AFF4F8C -:1031F000FF87EE8722503109398B288B0A971C01F3 -:10320000C6010E94FB178823D9F364E0C3010E9422 -:10321000C30F012F110F110B882399F0F201F081D8 -:10322000F1952B81F29F202D112422502D8B64E0EB -:10323000C3010E94C30F811193C0C4010E94001FEB -:1032400094C065E0C3010E94C30F8111E7CF66E01F -:10325000C3010E94C30F8111E1CF8C81811185C010 -:1032600044E063E0C3010E94D50F882331F09C89BC -:103270009F5F9C8BC4010E94041F44E061E0C30176 -:103280000E94D50F882331F0EC89E150EC8BC4010A -:103290000E94041FFC898F2F0F2E000C990B2E818A -:1032A0003F818217930709F46BC0F7FF03C03B818E -:1032B00031503C8BF2018081F4E0F80F2C89829F21 -:1032C000F0191124FD8B9D89090F111D97FD1A9589 -:1032D00017FF02C00F5F1F4FF801F595E795FA83BE -:1032E000E9830981102FE885F9851082EA85FB853D -:1032F000008321E0EE85FF852083E889F98910822B -:10330000EA88FB88B12CA12C2C89022E000C330BEF -:103310003D872C878E819F818A159B0599F1EC85CD -:10332000FD85EA15FB0579F423E0E885F98520831E -:10333000F2018081F02F2C89289FF00D11248F2F0E -:10334000EA85FB858083F70165917491C1010E9434 -:103350004A22FFEFAF1ABF0A22E0E20EF11CDACFD9 -:10336000C4010E94FC1E3C893D83C8013D89831B2A -:10337000910937FD9395029764F181E08C83A3CF87 -:103380001C8A98CF60E0C1010E946D10F20180811B -:103390004981FC89F89F400D1124415024E560E0EB -:1033A000C1010E94911061E0C1010E946D10F20103 -:1033B000808103E0080F4981FC898F9F400D112413 -:1033C000425083E0E82E24E560E0C1010E946112D2 -:1033D00017CF8D8165960FB6F894DEBF0FBECDBFB7 -:1033E000DF91CF911F910F91FF90EF90DF90CF90E1 -:1033F000BF90AF909F908F907F906F905F904F9015 -:103400003F902F9008950F931F93CF93DF93EC017C -:103410008C01025B1F4FC8010E9417106DEC74E015 -:10342000C8010E940422C8010E94281083E00E9463 -:103430007E2389E491E0EEEFFFE30995FE01EC5A6B -:10344000FF4F108268EA74E0C8010E944A22C80156 -:103450000E9428102A96CE010E94960F64E0CE01A9 -:103460000E94C30F811107C062E370E080E090E02A -:103470000E943820F0CFDF91CF911F910F910895D6 -:103480002F923F924F925F926F927F928F929F9274 -:10349000AF92BF92CF92DF92EF92FF920F931F9362 -:1034A000CF93DF93CDB7DEB729970FB6F894DEBF81 -:1034B0000FBECDBF998788877B836A832A013C0131 -:1034C00080E7680E711CF3018081882309F4F7C03E -:1034D00081E0E885F985EA5AFF4F8083E885F98520 -:1034E000EB5AFF4F1082E885F985EC5AFF4F1082A6 -:1034F000E885F985108E8F01025B1F4F61E0C801DE -:103500000E946D10888599858D5A9F4F9F838E8369 -:10351000A884B98497E5A90EB11CE884F984E8E58C -:10352000EE0EF11C88849984F2E58F0E911C88853B -:1035300099858F589F4F9D838C83288439849AE086 -:10354000290E311CC884D984E5E2CE0ED11C8885B1 -:1035500099850E94FB178823D1F3EA81FB81F491BE -:10356000F983FF2321F0EE81FF81F081F98327E3C6 -:1035700035E040E060E0C8010E94F71241145104B8 -:1035800039F04981445F920160E0C8010E94F7125E -:10359000F50110828CE0F70180836A817B81C8018C -:1035A0000E940422F4018081982F990F990F891BA2 -:1035B0008D5AF5018083EE81FF818081982F990FCC -:1035C000990F891B835DF7018083EC81FD818081E8 -:1035D00063E375E084FD02C06FE275E0C8010E94FC -:1035E0004A22F4018081982F990F990F891B8D5AD7 -:1035F000F5018083F70180818F5F8083E885F985FD -:1036000082A56BE275E0811102C067E275E0C80136 -:103610000E944A22F4018081982F990F990F891BEB -:103620008D5AF5018083F70180818F5F808363E28B -:1036300075E0C8010E944A2265E0C1010E94C30FE3 -:10364000882351F0E885F98562A56F5FC6010E9465 -:10365000081FC6010E94041F64E0C1010E94C30F3D -:1036600081111FC0F3012081422F50E070E060E023 -:10367000EC81FD8180819181A281B38184179507BE -:10368000A607B70710F02F3F61F466E0C1010E9462 -:10369000C30F882309F45BCF888599850E94031A9C -:1036A00056CF8FEFF301808360E0C6010E949A1E1F -:1036B000C6010E94FC1E81E0E885F985808F29966D -:1036C0000FB6F894DEBF0FBECDBFDF91CF911F9133 -:1036D0000F91FF90EF90DF90CF90BF90AF909F90B1 -:1036E0008F907F906F905F904F903F902F900895B4 -:1036F00050E040E00C94401AE0E8F7E7259134915F -:1037000081E02130304C09F080E00895CF93DF93C1 -:10371000EC010E947C1B9E01275A3F4FDE01A059FD -:10372000BF4F882309F440C0E6E9F7E78491F90127 -:103730008083E7E9F7E7E491EC83E8E9F7E7E491D0 -:10374000ED83E9E9F7E7859194919F838E83EBE917 -:10375000F7E78591949199878887EDE9F7E7E491F8 -:10376000EBA7EEE9F7E7E491EAA7EFE9F7E7E491E1 -:10377000EC93E0EAF7E7859194919D8F8C8FE2EAD4 -:10378000F7E7859194919F8F8E8FE4EAF7E7859113 -:10379000949199A388A3E6EAF7E7859194919BA376 -:1037A0008AA3DF91CF9108958CE3F90180831C8275 -:1037B0008FEF8D8320E233E03F832E8324ED33E0CF -:1037C0003987288791E09BA79AA78C938CEA9DE084 -:1037D0009D8F8C8F8EED9DE09F8F8E8F84E79EE076 -:1037E00099A388A38CE39FE0DACFCF92DF92EF9288 -:1037F0000F93CF93DF93EC01FC01E158FF4F82E37D -:103800008083349781E090E0A0E0B0E080839183F2 -:10381000A283B3833B978FEF8083CE010E94861BE8 -:10382000CE010E94141F6FEFCE010E94181F6E017F -:103830008AE0C80ED11CC6010E94860FC6010E94F4 -:10384000960FCE0148960E947B1F8EE0E82E0FE077 -:1038500020E14BE06DE0CE01825B9F4F0E9432156C -:10386000A596CE010E94991C65E0C6010E94C30F77 -:10387000882351F060E0CE01DF91CF910F91EF905E -:10388000DF90CF900C94081F40E067EA75E0CE010E -:10389000DF91CF910F91EF90DF90CF900C942D1D81 -:1038A000CF93DF93D62FC72F0E947C1B882359F01C -:1038B000AD2FBC2FEBE8F7E784918D933196E53976 -:1038C00087E7F807C9F7DF91CF910895CF93DF938A -:1038D000DC0170E0660F771F1F96ED91FC91509709 -:1038E000E60FF71F2591349190963C932E935F97A6 -:1038F000F9014591549114968C911497849F402D11 -:10390000112491964C939197F901C591D4916D2F03 -:1039100070E04617170629F020F0F901259134913F -:10392000432F849F402D112492964C93DF91CF9189 -:10393000089521E0FC01248324E020A726E036E05E -:10394000308B278760E00E94661C61E070E083E0B6 -:103950000E94B420E1EBF0E08081887F8160808369 -:10396000F89410928000E1E8F0E010821092850057 -:103970001092840088E191E0909389008093880000 -:10398000808188608083808181608083EFE6F0E0C1 -:10399000808182608083789408950F93FC010111E7 -:1039A00007C06230D9F030F4662379F0613091F0CD -:1039B0000F9108956330C9F06430D1F76481649F3A -:1039C000402D1124458F268FF3CF4B3008F04AE06D -:1039D000468BEECF642F0F910C94661C6481649F1C -:1039E000402D1124418F228FE3CF6481649F402DAD -:1039F0001124438F248FDCCF80919C07882329F0EA -:103A0000809199078093B400089580E0FBCFFC017A -:103A1000178A158A14A213A2108E10929907109279 -:103A20009A0710929C070C94FC1C0F931F93CF9342 -:103A3000DF93EC018B010E94071D1E870D871B8AF7 -:103A40001A8A81E0898389E08E8B198E1B8E1D8EE8 -:103A5000DF91CF911F910F910895411102C00C94F5 -:103A6000151D0895CF93DF93EC01611115C0888176 -:103A7000882391F0898181110FC0E9858E2F90E014 -:103A8000880F991FEF81F885E80FF91F85919491B0 -:103A90008F3F980721F41882DF91CF9108959C877A -:103AA0009927880F991FEA85FB85E80FF91F659113 -:103AB0007491CE010E94151D89858F5F8987ECCF97 -:103AC00060E00C94321D0F93CF93DF93EC016111F2 -:103AD00066C08981882309F462C08D8981115FC025 -:103AE0008D859E85EA89FB89EE0FFF1FE80FF91F80 -:103AF000459154914115510541F42989213021F511 -:103B00001B8A1A8AFC0145915491BA0176956795F2 -:103B100076956795862F40FF2EC0252F26952695F2 -:103B20002695205186E0569547958A95E1F74F7185 -:103B30006F7000E0CE010E94CD1CEA89FB893196AE -:103B4000FB8BEA8BCF010AC019828881882369F038 -:103B500060E0CE010E94321D8A899B89880F991FDF -:103B6000ED85FE85E80FF91FCECFCE01DF91CF9115 -:103B70000F910C94071D8F738C8B8C81859F802DEA -:103B800011248D8B1DA21CA21BA281E08F8B809320 -:103B90009C07188E8A899B8901969B8B8A8BDF9163 -:103BA000CF910F91089560E00C94631DCF93DF9344 -:103BB000EC016111B3C08F89882309F4AFC08D89EE -:103BC000811105C0CE01DF91CF910C94071D81506A -:103BD0008D8B8DA1811134C02BA13CA12F5F3F4F54 -:103BE000C901880F991FEF8DF8A1E80FF91F859182 -:103BF0009491482F47704EA3492F469546954FA361 -:103C0000AC0164E0569547956A95E1F74F739C8146 -:103C1000499F402D11244DA383FB882780F9809371 -:103C200098073CA32BA389A190E02817390740F0FF -:103C30002AA1222309F475C0821B91099CA38BA39E -:103C40008DA181508DA3888D31E0380F388F4C893C -:103C50002FA1240F8C85280F2A836B8D662361F09A -:103C600070E0832F032E000C990B0E94BD238C8DD6 -:103C7000869F200D11242A838A8190E0CB966BE3E6 -:103C800070E00E94BD238A832E892B83698D662371 -:103C900071F0062E000C770B832F032E000C990B6E -:103CA0000E94BD238A8D869F200D11242B836D8D4C -:103CB000662389F0832F330F990B70E00E94BD2398 -:103CC000CB0162E070E00E94BD232E8D9B81289F76 -:103CD000900D11249B834F3341F18B818A300CF07E -:103CE00089E087FD80E08B83F894EA81F0E0EB5473 -:103CF000FA4FE491E0939B078D8198A5899F802DD1 -:103D000011249B81899F802D11249EA1899F802D44 -:103D1000112480939A07809399077894DF91CF912B -:103D20000895CE010E94071D8BCF1B82DDCF60E07E -:103D30000C94D61DCF93DF93EC01611103C00E9458 -:103D4000071D1982DF91CF910895CF93DF93EC0186 -:103D50000E94071D1982DF91CF91089560919A0703 -:103D6000662329F180919D078F5F80939D07909135 -:103D70009B078917E0F081E090919C07911180E00A -:103D800080939C0710929D0780919807882369F083 -:103D90008091040193E4899F802D1124895B809395 -:103DA00004010E949D23909399070C94FC1C089594 -:103DB0001F920F920FB60F9211242F933F934F93A0 -:103DC0005F936F937F938F939F93AF93BF93EF9383 -:103DD000FF930E94AE1EFF91EF91BF91AF919F9113 -:103DE0008F917F916F915F914F913F912F910F90A4 -:103DF0000FBE0F901F9018956EEF75E00C94151D77 -:103E000066EF75E00C94151D60EF75E00C94151DC0 -:103E1000FC01862F660F990B668170E06F5F7F4F04 -:103E20000E94BD238583089521E0FC01208308952D -:103E300070E085E00C94B420AF92BF92CF92DF92F5 -:103E4000EF92FF920F931F93CF93DF93EC01898141 -:103E50009A812FE0289F8001299F100D112485E170 -:103E60000E949920800F911F24E0969587952A95AE -:103E7000E1F79A8389832881222391F1EC81AD8037 -:103E8000B12CD12CC12CA885B9857D0110E000E0B2 -:103E90006E817F819B0150E040E08617970728F0F4 -:103EA000BC01A817B90708F4BD0190E080E01F929B -:103EB0001F921F92EF930E9419236B830F900F9014 -:103EC0000F900F9070E085E0DF91CF911F910F91DF -:103ED000FF90EF90DF90CF90BF90AF900C94B42004 -:103EE000DF91CF911F910F91FF90EF90DF90CF90D6 -:103EF000BF90AF900895FC018CE39FE09383828391 -:103F000084E0818381E084870895CF93DF93EC017F -:103F10008C819D81892B21F18C858F7139F584E10C -:103F20000E949920BC01990F880B990B0E946F2465 -:103F300026EE3FE34EEC50E40E94FB240E943E2418 -:103F40009B017B836A83672BA9F084E08983FE0150 -:103F5000349680E0419151912417350720F48983EC -:103F6000DF91CF9108958F5F8430A1F78C858F5FAB -:103F70008C87F6CF8FEF8983F9CF1F920F920FB600 -:103F80000F9211242F933F938F939F93AF93BF93DF -:103F900080919F079091A007A091A107B091A207DF -:103FA00030919E0723E0230F2D3758F50196A11D70 -:103FB000B11D20939E0780939F079093A007A09325 -:103FC000A107B093A2078091A3079091A407A091A5 -:103FD000A507B091A6070196A11DB11D8093A30767 -:103FE0009093A407A093A507B093A607BF91AF91A4 -:103FF0009F918F913F912F910F900FBE0F901F9027 -:10400000189526E8230F0296A11DB11DD2CF2FB718 -:10401000F89460919F077091A0078091A1079091FB -:10402000A2072FBF08953FB7F8948091A3079091FE -:10403000A407A091A507B091A60726B5A89B05C027 -:104040002F3F19F00196A11DB11D3FBFBA2FA92F17 -:10405000982F8827BC01CD01620F711D811D911D14 -:1040600042E0660F771F881F991F4A95D1F7089580 -:10407000CF92DF92EF92FF92CF93DF936B017C019F -:104080000E941320EB01C114D104E104F10439F4BE -:10409000DF91CF91FF90EF90DF90CF9008950E9435 -:1040A00013206C1B7D0B683E734068F381E0C81AD7 -:1040B000D108E108F108C851DC4FE5CF789484B508 -:1040C000826084BD84B5816084BD85B5826085BD14 -:1040D00085B5816085BDEEE6F0E0808181608083FA -:1040E000E1E8F0E0108280818260808380818160DD -:1040F0008083E0E8F0E0808181608083E1EBF0E0A4 -:10410000808184608083E0EBF0E080818160808347 -:10411000EAE7F0E080818460808380818260808330 -:104120008081816080838081806880831092C1005B -:1041300008958E3008F08E502091050190E4299F5B -:10414000900111248770822B80937C0080917A00EB -:10415000806480937A0080917A0086FDFCCF809104 -:1041600078009091790008951F93CF93DF93182FD3 -:10417000EB0161E00E943A21209739F460E0812F41 -:10418000DF91CF911F910C947621CF3FD10511F48F -:1041900061E0F5CFE12FF0E0EE5EF94FE491E3301E -:1041A00031F140F4E130B1F0E230E1F0C038D10556 -:1041B0007CF7E4CFE63029F1E73059F1E430B1F78C -:1041C00080918000806280938000D0938B00C093A8 -:1041D0008A0004C084B5806884BDC7BDDF91CF91DB -:1041E0001F91089584B5806284BDC8BDF7CF8091CA -:1041F0008000806880938000D0938900C0938800FD -:10420000EDCF8091B00080688093B000C093B30080 -:10421000E5CF8091B00080628093B000C093B4007D -:10422000DDCF833081F028F4813099F08230A9F01D -:1042300008958630A9F08730C9F08430B1F48091B8 -:1042400080008F7D03C0809180008F7780938000F5 -:10425000089584B58F7784BD089584B58F7DFBCF95 -:104260008091B0008F778093B00008958091B00066 -:104270008F7DF9CFCF93DF9390E0FC01EA5DF94F9A -:104280002491865C994FFC0184918823C9F090E0C9 -:10429000880F991FFC01EE59F94FA591B491FC01CB -:1042A000E85AF94FC591D49161110DC09FB7F894A8 -:1042B0008C91209582238C938881282328839FBF0B -:1042C000DF91CF910895623051F49FB7F8943C91FB -:1042D000822F809583238C93E8812E2BEFCF8FB78D -:1042E000F894EC912E2B2C938FBFEACF1F93CF9392 -:1042F000DF93162F282F30E0F901EE5EF94F8491FD -:10430000F901EA5DF94FD491F901E65CF94FC491E6 -:10431000CC23A1F081110E941121EC2FF0E0EE0FCF -:10432000FF1FE85AF94FA591B4918FB7F894EC911B -:10433000111108C0D095DE23DC938FBFDF91CF91A0 -:104340001F910895DE2BF8CFCF93DF93282F30E015 -:10435000F901EE5EF94F8491F901EA5DF94FD491CC -:10436000F901E65CF94FC491CC23A1F081110E94C0 -:104370001121EC2FF0E0EE0FFF1FE25BF94FA5914A -:10438000B491EC91ED2381E090E009F480E0DF91BD -:10439000CF91089580E090E0FACFCF92DF92EF9234 -:1043A000FF920F931F93CF93DF936C01EB017B017F -:1043B000E40EF51E10E000E0CE15DF0561F0699116 -:1043C000D601ED91FC910190F081E02DC601099597 -:1043D000080F191FF1CFC801DF91CF911F910F91E5 -:1043E000FF90EF90DF90CF900895FB0101900020A7 -:1043F000E9F73197AF01461B570BDC01ED91FC91BA -:104400000280F381E02D0994EF92FF920F931F93A6 -:10441000CF93DF937C018B01D0E0C0E0F801649181 -:104420000F5F1F4F662359F0D701ED91FC9101906A -:10443000F081E02DC7010995C80FD91FEFCFCE013C -:10444000DF91CF911F910F91FF90EF90089561152B -:10445000710511F00C94F52190E080E00895DC01E5 -:10446000ED91FC910190F081E02D09940F931F9341 -:10447000CF93DF93EC016DE00E942F228C016AE064 -:10448000CE010E942F22800F911FDF91CF911F91AB -:104490000F9108950F931F93CF93DF93EC010E9428 -:1044A00004228C01CE010E943622800F911FDF91E1 -:1044B000CF911F910F9108958F929F92AF92BF92CB -:1044C000CF92DF92EF92FF920F931F93CF93DF93E0 -:1044D000CDB7DEB7A1970FB6F894DEBF0FBECDBF44 -:1044E0006C01142FE52FCB01022F19A2223008F402 -:1044F0000AE07E0121E2E20EF11C802E912CB12C0B -:10450000A12C612F7E2FA50194010E94D123029F2F -:10451000101911241A303CF5105DF70112937F0138 -:10452000122FE32FCA01232B242B252B51F790E0C8 -:1045300080E0E114F10421F0B701C6010E94F521E9 -:10454000A1960FB6F894DEBF0FBECDBFDF91CF911D -:104550001F910F91FF90EF90DF90CF90BF90AF90A1 -:104560009F908F900895195CD8CFCF92DF92EF92F1 -:10457000FF920F931F93CF93DF93EC016A017B01AE -:104580002115310579F4E881F9810190F081E02D60 -:10459000642FDF91CF911F910F91FF90EF90DF90EB -:1045A000CF9009942A303105E9F42AE0F7FE1AC0C9 -:1045B0006DE20E942F228C0144275527BA014C1925 -:1045C0005D096E097F092AE0CE010E945C22800FFE -:1045D000911FDF91CF911F910F91FF90EF90DF908E -:1045E000CF900895B701A601CE01DF91CF911F9121 -:1045F0000F91FF90EF90DF90CF900C945C229A0186 -:10460000AB01770F660B770B0C94B52221153105A2 -:1046100041F4DC01ED91FC910190F081E02D642FDB -:1046200009940C945C229A01AB0170E060E00C9458 -:1046300006234F925F926F927F92AF92BF92CF927A -:10464000DF92EF92FF920F931F93CF93DF93CDB73B -:10465000DEB729013A019B01AC012419350946094D -:10466000570989899A89AB89BC89BC01CD016A192E -:104670007B098C099D090E948D23A80197012419AB -:104680003509460957090E94F323CA01B9016A0D89 -:104690007B1D8C1D9D1DDF91CF911F910F91FF9070 -:1046A000EF90DF90CF90BF90AF907F906F905F9032 -:1046B0004F90089561E08AE00E94762161E08AE0EF -:1046C0000E943A218CB580618CBD8CB580648CBD14 -:1046D00061E08DE00E943A2161E08BE00C943A2188 -:1046E000811104C08CB580628CBD08958CB58F7D1E -:1046F000FBCF9CB5937F892B8CBD08959CB59C7F87 -:10470000282F2370922B9CBD9DB582FB222720F978 -:10471000892F8E7F822B8DBD0895DB018F939F9310 -:104720000E941224BF91AF91A29F800D911DA39F63 -:10473000900DB29F900D11240895991B79E004C04B -:10474000991F961708F0961B881F7A95C9F78095D0 -:104750000895AA1BBB1B51E107C0AA1FBB1FA617C8 -:10476000B70710F0A61BB70B881F991F5A95A9F71A -:1047700080959095BC01CD01089597FB072E16F406 -:10478000009407D077FD09D00E94A92307FC05D02B -:104790003EF4909581959F4F0895709561957F4F58 -:1047A0000895A1E21A2EAA1BBB1BFD010DC0AA1F72 -:1047B000BB1FEE1FFF1FA217B307E407F50720F08A -:1047C000A21BB30BE40BF50B661F771F881F991F05 -:1047D0001A9469F760957095809590959B01AC014E -:1047E000BD01CF010895052E97FB1EF400940E9491 -:1047F0000A2457FD07D00E94D12307FC03D04EF4B2 -:104800000C940A2450954095309521953F4F4F4F79 -:104810005F4F089590958095709561957F4F8F4F6C -:104820009F4F08950E942F24A59F900DB49F900D37 -:10483000A49F800D911D112408950024A7FD0094CC -:104840002A0F301D401D501D601D701D801D901DC4 -:104850000895EE0FFF1F0590F491E02D0994A29F9B -:10486000B001B39FC001A39F700D811D1124911D44 -:10487000B29F700D811D1124911D08950E94DA24AC -:1048800088F09F5798F0B92F9927B751B0F0E1F011 -:10489000660F771F881F991F1AF0BA95C9F714C0C1 -:1048A000B13091F00E94F424B1E008950C94F42406 -:1048B000672F782F8827B85F39F0B93FCCF38695FA -:1048C00077956795B395D9F73EF490958095709557 -:1048D00061957F4F8F4F9F4F0895E89409C097FBD4 -:1048E0003EF490958095709561957F4F8F4F9F4FC7 -:1048F0009923A9F0F92F96E9BB279395F69587950B -:1049000077956795B795F111F8CFFAF4BB0F11F4CD -:1049100060FF1BC06F5F7F4F8F4F9F4F16C0882374 -:1049200011F096E911C0772321F09EE8872F762FAA -:1049300005C0662371F096E8862F70E060E02AF0EB -:104940009A95660F771F881FDAF7880F96958795D7 -:1049500097F9089597F99F6780E870E060E00895FF -:104960009FEF80EC089500240A9416161706180687 -:104970000906089500240A94121613061406050663 -:104980000895092E0394000C11F4882352F0BB0FF4 -:1049900040F4BF2B11F460FF04C06F5F7F4F8F4F57 -:1049A0009F4F089557FD9058440F551F59F05F3F92 -:1049B00071F04795880F97FB991F61F09F3F79F041 -:1049C00087950895121613061406551FF2CF4695C3 -:1049D000F1DF08C0161617061806991FF1CF869545 -:1049E0007105610508940895E894BB276627772729 -:1049F000CB0197F908950E940E250C94C1240E94C2 -:104A0000B32438F00E94BA2420F0952311F00C94BE -:104A1000AA240C94B02411240C94F5240E94D224CE -:104A200070F3959FC1F3950F50E0551F629FF00101 -:104A3000729FBB27F00DB11D639FAA27F00DB11D1A -:104A4000AA1F649F6627B00DA11D661F829F2227A3 -:104A5000B00DA11D621F739FB00DA11D621F839F2A -:104A6000A00D611D221F749F3327A00D611D231F00 -:104A7000849F600D211D822F762F6A2F11249F574E -:104A800050409AF0F1F088234AF0EE0FFF1FBB1F51 -:104A9000661F771F881F91505040A9F79E3F510510 -:104AA00080F00C94AA240C94F5245F3FE4F3983E24 -:104AB000D4F3869577956795B795F795E7959F5FBA -:104AC000C1F7FE2B880F911D9695879597F908954C -:104AD0008F929F92AF92BF92CF92DF92EF92FF920E -:104AE000CF93DF93EC01688179818A819B81611585 -:104AF00071058105910521F464E279ED8BE597E07C -:104B00002DE133EF41E050E00E94F32349015A01C7 -:104B10009B01AC01A7EAB1E40E9412246B017C0165 -:104B2000ACEEB4EFA50194010E947528DC01CB0125 -:104B30008C0D9D1DAE1DBF1DB7FF03C00197A109C0 -:104B4000B04888839983AA83BB839F77DF91CF91F5 -:104B5000FF90EF90DF90CF90BF90AF909F908F909D -:104B600008950E946825089580E091E00E946825DC -:104B70000895B0E0A0E08093000190930101A0931C -:104B80000201B09303010895AEE0B0E0EAECF5E273 -:104B90000C9488280D891E898F89988D26E02C8396 -:104BA0001A83098397FF02C080E090E801979E83F3 -:104BB0008D83AE01455E5F4F698D7A8DCE01019682 -:104BC0000E94F4254D815E8157FD0AC02F813885F2 -:104BD000421753070CF49A01020F131FF8011082B9 -:104BE0002E96E4E00C94A428ABE0B0E0EAEFF5E206 -:104BF0000C947A287C013B018A01FC011782168201 -:104C0000838181FFC8C1CE0101965C01F7019381C8 -:104C1000F30193FD859193FF81913F01882309F46E -:104C200053C1853239F493FD859193FF81913F0102 -:104C3000853229F4B70190E00E94E427E7CF912C58 -:104C4000212C312CFFE1F31538F08B3211F190F467 -:104C5000803209F1833229F137FC3CC020ED280F66 -:104C60002A3050F536FE20C08AE0989E200D11248F -:104C7000922E06C08D3291F0803371F7689430F82F -:104C8000F30193FD859193FF81913F018111DACF6B -:104C900021C0689431F8689432F8F2CF689433F800 -:104CA000EFCF689434F8ECCFEAE02E9E200D11246B -:104CB000222E689435F8E4CF8E3229F436FC04C1F4 -:104CC000689436F8DDCF8C3619F4689437F8D8CF6D -:104CD0008836B1F2982F9F7D95549330E0F083365B -:104CE000A1F18337C1F1833509F063C02801F2E0F7 -:104CF0004F0E511CF801C080D180692D70E036FC48 -:104D000002C06FEF7FEFC6010E94CE274C0168946E -:104D100037F882010AC00C5F1F4FFFE3F983882434 -:104D20008394912C6501E89437F833FE2DC0522C02 -:104D30008114910471F5552009F468CFB70180E220 -:104D400090E00E94E4275A94F6CFF801808189838D -:104D50000E5F1F4FE4CF2801F2E04F0E511CF80107 -:104D6000C080D180692D70E036FC02C06FEF7FEF0C -:104D7000C6010E94D9274C018201D5CFB70180E23C -:104D800090E00E94E4272A942814190409F0B0F74F -:104D9000CECFF60137FC859137FE81916F01B701C7 -:104DA00090E00E94E42751105A94F1E08F1A910884 -:104DB000BFCF843619F0893609F077C0F80137FE85 -:104DC0006BC060817181828193810C5F1F4FF32DD5 -:104DD000FF763F2E97FF09C090958095709561955D -:104DE0007F4F8F4F9F4F689437F82AE030E0A5013E -:104DF0000E941428C82ECA188C2C432C36FE0CC0D6 -:104E0000E89440F8C91440F434FE05C032FC03C0F5 -:104E1000F32DFE7E4F2E892C44FE95C0FE01EC0D35 -:104E2000F11D8081803309F087C0242D297E422E18 -:104E3000842D8870582E43FC95C040FE8FC09C2C5A -:104E4000821418F42C0C922C981844FE91C0B701CF -:104E500080E390E00E94E42742FE09C088E790E0EA -:104E600041FE02C088E590E0B7010E94E427C91422 -:104E700008F48AC0CA94D12C9FEFC91AD90ACA0C67 -:104E8000DB1CF60182916F01B70190E00E94E427DC -:104E9000AC14BD04B1F74FCF60817181072E000CB7 -:104EA000880B990B0E5F1F4F92CFD32CE894D4F848 -:104EB0002AE030E0853739F1232D297FD22E8F3635 -:104EC00001F148F48835A9F0F701868197812B9686 -:104ED000E2E10C949628803749F08837A9F7D4FE90 -:104EE00002C06894D2F820E130E00DC06894D4F894 -:104EF000F6CF34FE03C0822F8660D82E20E132E048 -:104F000002C028E030E0F801D7FE0FC06081718157 -:104F1000828193810C5F1F4FA5010E941428C82E27 -:104F2000CA183D2CE89437F867CF6081718190E012 -:104F300080E00E5F1F4FF0CF42FC02C0839478CF19 -:104F40008394839475CF842D867809F471CFF6CF3E -:104F5000B70180E290E00E94E42783948214C0F3BA -:104F6000512C73CF522C5818821408F46ECFF8CFFE -:104F7000842D867809F47BCF8BE241FE80E247FCEA -:104F80008DE2B70190E071CFB70180E390E00E941D -:104F9000E4279A946CCF8FEF9FEF99CFFC01059097 -:104FA000615070400110D8F7809590958E0F9F1F2B -:104FB0000895FC016150704001900110D8F7809570 -:104FC00090958E0F9F1F08950F931F93CF93DF939C -:104FD000182F092FEB018B8181FD09C01FEF0FEF07 -:104FE000812F902FDF91CF911F910F91089582FF14 -:104FF00014C02E813F818C819D81281739073CF494 -:10500000E881F981CF0101969983888310838E818D -:105010009F8101969F838E83E3CFE885F985812F59 -:105020000995892BA1F3DACFFA01AA27283051F18B -:10503000203181F1E8946F936E7F6E5F7F4F8F4FC9 -:105040009F4FAF4FB1E03ED0B4E03CD0670F781F28 -:10505000891F9A1FA11D680F791F8A1F911DA11D0D -:105060006A0F711D811D911DA11D20D009F4689446 -:105070003F912AE0269F11243019305D3193DEF6EE -:10508000CF010895462F4770405D4193B3E00FD0A4 -:10509000C9F7F6CF462F4F70405D4A3318F0495D8F -:1050A00031FD4052419302D0A9F7EACFB4E0A69572 -:1050B0009795879577956795BA95C9F70097610594 -:1050C000710508959B01AC010A2E069457954795EA -:1050D00037952795BA95C9F7620F731F841F951FDF -:1050E000A01D0895B7FF0C9412240E941224821B65 -:1050F000930B08952F923F924F925F926F927F92FF -:105100008F929F92AF92BF92CF92DF92EF92FF92D7 -:105110000F931F93CF93DF93CDB7DEB7CA1BDB0B83 -:105120000FB6F894DEBF0FBECDBF09942A88398828 -:1051300048885F846E847D848C849B84AA84B9842F -:10514000C884DF80EE80FD800C811B81AA81B9813B -:10515000CE0FD11D0FB6F894DEBF0FBECDBFED014F -:10516000089513E0C8E3D3E004C0FE010E9429249F -:0C5170002196C933D107C9F7F894FFCF8E -:10517C00010000000101573D256400473D256400F6 -:10518C00463D25640048503D2575004261727261B0 -:10519C00636B73004275696C640041747461636B7A -:1051AC00001B013E0D00000000240100002A01003C -:1051BC000000000000A016CD214C4F414445520088 +:100880003C9684E0E13FF80779F708951092F4046C +:100890001092F5041092F6041092F7041092F804E6 +:1008A0001092F9041092FA041092FB041092F204D0 +:1008B0000E9432041092F104089550E0480F511D37 +:1008C00087FD5A9557FD0CC0843554F430E0260F4F +:1008D000311D67FD3A9537FD03C081E060330CF0B0 +:1008E00080E00895DC01643508F042C0403308F030 +:1008F0003FC090968C919097E62F062E000CFF0B30 +:10090000242F25952595259594E52902E00DF11DC7 +:100910001124EA5AFA4F2081342F37708230A1F423 +:10092000822F90E0032E02C0959587950A94E2F7F6 +:1009300080958170882399F081E090E001C0880F54 +:100940003A95EAF7822B13C08330A1F71C968C915D +:100950006427062E000C770B682760FDEDCF81E041 +:1009600090E001C0880F3A95EAF780958223808352 +:1009700008951092B20166E273E08CEA91E00C9463 +:100980009C148EE591E00E94791791E0811101C0DD +:1009900090E0892F0895FC0123814281618180814B +:1009A0000C945D04EF920F931F93CF93DF93EC01B0 +:1009B0000E94CB048823E1F01091CC0140E06E81CD +:1009C0008CEA91E00E94EF0F2F813885ED800C8139 +:1009D000498168818CEA91E00E94B513612F8CEA0D +:1009E00091E0DF91CF911F910F91EF900C94EB0F5D +:1009F000DF91CF911F910F91EF900895FC018491A9 +:100A000008950196FC01849108954CE3BC018EE5A4 +:100A100091E00C9451160F931F93CF93DF938C01A9 +:100A2000C091CA01D091CB0122974093B501209388 +:100A3000B6018CEA91E00E949C1440E061E08CEAEF +:100A400091E00E94EF0FB8018CEA91E00E94A5218D +:100A5000209749F0BE018CEA91E0DF91CF911F9180 +:100A60000F910C949C14DF91CF911F910F910895D9 +:100A7000242F462F66E273E00C940B05FF920F9330 +:100A80001F93CF93DF93D82F162FC42FF22E242F2E +:100A90000E945D048823C1F00091CC016F2D8CEA87 +:100AA00091E00E94EB0F2C2F412F6D2F8CEA91E0EB +:100AB0000E947C10602F8CEA91E0DF91CF911F9112 +:100AC0000F91FF900C94EB0FDF91CF911F910F913D +:100AD000FF900895EF92FF920F931F93CF93DF93B0 +:100AE000C82FD62F142FF22E0E945D048823D1F038 +:100AF000E090CC01602F8CEA91E00E94EB0F0F2D6B +:100B0000212F4D2F6C2F8CEA91E00E942B106E2D1F +:100B10008CEA91E0DF91CF911F910F91FF90EF90C0 +:100B20000C94EB0FDF91CF911F910F91FF90EF90FD +:100B30000895EF92FF920F931F93CF93DF93C82FE7 +:100B4000D62F142FF22E0E945D048823D1F0E0905E +:100B5000CC01602F8CEA91E00E94EB0F0F2D212F2A +:100B60004D2F6C2F8CEA91E00E9453106E2D8CEA71 +:100B700091E0DF91CF911F910F91FF90EF900C9436 +:100B8000EB0FDF91CF911F910F91FF90EF900895A0 +:100B9000CF92DF92FF920F931F93CF93DF93CDB746 +:100BA000DEB728970FB6F894DEBF0FBECDBF6C013D +:100BB00060E08CEA91E00E94EB0F05E024E540E064 +:100BC00060E08CEA91E00E945310F60180811F9250 +:100BD0008F9386E091E09F938F931F9288E0F82E89 +:100BE000FF928E010F5F1F4F1F930F930E944225AC +:100BF00021E044E064EA71E0C8010E940B05F601BF +:100C000081811F928F938BE091E09F938F931F922E +:100C1000FF921F930F930E94422521E048E164EA6E +:100C200071E0C8010E940B05F60182811F928F932B +:100C300080E191E09F938F931F92FF921F930F93F8 +:100C40000E94422521E040E364EA71E0C8010E946D +:100C50000B050FB6F894DEBF0FBECDBF28960FB6BA +:100C6000F894DEBF0FBECDBFDF91CF911F910F91E2 +:100C7000FF90DF90CF900895682F88E691E00E9462 +:100C80004A0F91E0811101C090E0892F0895CF9320 +:100C9000C62F682F88E691E00E94690F91E0C8177F +:100CA00008F090E0892FCF91089560E00C944706FA +:100CB00081E090E00E945506811110C083E090E031 +:100CC0000E94550681110AC090E080E00E945506FE +:100CD000811104C082E090E00C94550681E00895F3 +:100CE0000E94580681110AC084E090E00E945506D7 +:100CF000811104C085E090E00C94550681E00895D0 +:100D0000089508950F931F93CF93DF93CDB7DEB768 +:100D100028970FB6F894DEBF0FBECDBF162F00E0A8 +:100D200028E044E56BE280E00E9499051F921F9342 +:100D300085E191E09F938F931F9288E08F938E01BE +:100D40000F5F1F4F1F930F930E9442252CE244E038 +:100D500064EA71E0C8010E940B050FB6F894DEBF8B +:100D60000FBECDBF28960FB6F894DEBF0FBECDBF25 +:100D7000DF91CF911F910F9108958F929F92AF9223 +:100D8000BF92CF92DF92EF92FF920F931F93CF9378 +:100D9000DF93EC018C010C5E1F4FF12CE12C912CA8 +:100DA0006C0182E6C81A8DEFD80A5E01EBE6AE1A36 +:100DB000EDEFBE0AF80187858823D9F0F60180811E +:100DC0008F3F39F0082E000C990B41E08E159F05DE +:100DD00009F040E0B501C8010E94640DF801808867 +:100DE000882039F0911005C06085CE010E948206EE +:100DF000982CFFEFEF1AFF0A0C5E1F4F80E2E816F7 +:100E0000F104C1F6992091F001E023E04AE06CE2A0 +:100E100084E40E946A05CF55DD4F4881442331F0B8 +:100E2000440F23E06CE284E40E949905DF91CF91A6 +:100E30001F910F91FF90EF90DF90CF90BF90AF90F8 +:100E40009F908F900895CF92DF92EF92FF920F9331 +:100E50001F93CF93DF9300D000D000D0CDB7DEB783 +:100E60006B0109831A832B833C837C012CE6E21AF5 +:100E70002DEFF20AF7014081403208F03FC054E103 +:100E8000242F30E08C01549F000D111D1124F80116 +:100E9000658F2F5F3F4F529FB001539F700D1124FC +:100EA000860F971F29813A81FC01318320838B8132 +:100EB0009C81F801978B868B8C2D0E94820EF80105 +:100EC000848F81E083A3F2E0CF16D1040CF480E09C +:100ED000F80181A3F70180818F5F808381E02696EE +:100EE0000FB6F894DEBF0FBECDBFDF91CF911F913B +:100EF0000F91FF90EF90DF90CF90089580E0EFCFBB +:100F0000EF92FF920F931F93CF93DF9300D000D007 +:100F100000D0CDB7DEB77C018C010C561D4FD80137 +:100F20001C92FC01E256FD4F8FEF8083C7018B5668 +:100F30009D4F0E940E0C0E94FC0CF701749684E1F8 +:100F4000DF01982F1D929A95E9F77496E017F10743 +:100F5000B9F789E1D70151968C93519782E3529664 +:100F60008C9352978BE453968C9324E130E040E0CD +:100F700050E060E070E0CB010E9407047A8369834F +:100F800024E130E040E050E060E070E0CB010E94FE +:100F90000704262F7C836B8309811A813C814D8154 +:100FA0005E8162E070E0C7010E942307811104C0E6 +:100FB00088EA90E00E94050528E330E040E050E038 +:100FC00060E370E080E090E00E9407047A83698328 +:100FD00028E330E040E050E060E370E080E090E043 +:100FE0000E9407047C836B8380E00E94500D8D83F8 +:100FF00080E00E945A0DF701EF55FD4F10823196A7 +:101000001082329710823397108209811A812B81C6 +:101010003C814D81582F70E060E0C7010E9423079A +:10102000811110C081E990E026960FB6F894DEBFDA +:101030000FBECDBFDF91CF911F910F91FF90EF9029 +:101040000C94050526960FB6F894DEBF0FBECDBFF3 +:10105000DF91CF911F910F91FF90EF900895CF9363 +:10106000DF9300D000D000D0CDB7DEB7FC01E95649 +:10107000FD4F2081318144E150E0421B530B8B56E0 +:101080009D4FFC018081918126E230E0281B390BC5 +:101090003A8329835C834B833A815C8168E078E002 +:1010A00080E090E026960FB6F894DEBF0FBECDBF6D +:1010B000DF91CF9108953F924F925F926F927F920E +:1010C0008F929F92AF92BF92CF92DF92EF92FF9258 +:1010D0000F931F93CF93DF9300D000D000D0CDB7F4 +:1010E000DEB75C018C01912C88248A9444244A94B4 +:1010F000542C3201F80183A1882309F444C084A14F +:10110000811141C0C5010E942F0829833A834B8376 +:101110005C836D837E83F801C488D588E688F78870 +:10112000858D0E94500D382EF801858D0E945A0D34 +:1011300029813A81C21AD30A232D30E035952795AB +:10114000C20ED31E2B813C81E21AF30A90E09595E2 +:101150008795E80EF91ECC9CC001CD9C900D900D9A +:101160001124EE9C9001EF9C300D300D1124820F64 +:10117000931FB0E0A0E084159505A605B70518F407 +:10118000892C2C013D010C5E1F4F9394F0E29F12BD +:10119000B1CFF501E256FD4F808226960FB6F89446 +:1011A000DEBF0FBECDBFDF91CF911F910F91FF909A +:1011B000EF90DF90CF90BF90AF909F908F907F90F7 +:1011C0006F905F904F903F900895FC01E356FD4F64 +:1011D0002081222351F033962081211106C03196BF +:1011E0008081853010F48F5F808308955F926F92C5 +:1011F0007F928F929F92AF92BF92CF92DF92EF92A7 +:10120000FF920F931F93CF93DF9300D000D000D0B5 +:10121000CDB7DEB77C016C012FE5C21A2DEFD20AE3 +:10122000F6018081970120563D4F5901853090F598 +:10123000339780818F3F71F0F70134E18302E00D35 +:10124000F11D112481E084A3F701E356FD4F808353 +:1012500035961082F601108281E0F601908195307A +:1012600008F480E0F501808326960FB6F894DEBF7F +:101270000FBECDBFDF91CF911F910F91FF90EF90E7 +:10128000DF90CF90BF90AF909F908F907F906F90A6 +:101290005F900895F90180818823F1F2F70190E0D1 +:1012A00080E0D701AE55BD4F24A18C010F5F1F4FC9 +:1012B000222309F45AC02C91223009F056C024E1AF +:1012C000522E589E3001599E700C11246E0C7F1CBA +:1012D000F301858D0E94500D882EF301858D0E94AB +:1012E0005A0D982E509EF001519EF00D1124EE0DD6 +:1012F000FF1D0081882D90E09C0135952795280FD2 +:10130000391F032E000C440B550B682D70E090E044 +:1013100080E00E940704060FF3011689892D90E0F2 +:101320009C0135952795280F391F032E000C440B7F +:10133000550B692D70E090E080E00E9407041E824A +:101340001D82802F90E09A838983160F612F70E0B1 +:10135000212F7C836B831A813C8140E05E8170E0A9 +:1013600060E0C7010E94230777CFC801749600325E +:10137000110509F099CF70CFCF93DF93EC01C356DD +:10138000DD4F28812223D9F0DC01A156BD4F2C91DD +:101390002530C0F0FC019C0120583D4F44A1411173 +:1013A00014A27496E217F307C9F71C921882FC0185 +:1013B000E056FD4F10828F559D4FFC011082DF914A +:1013C000CF9108952F5F2C93FACFCF92DF92EF92B7 +:1013D000FF920F931F93CF93DF9300D000D000D0E4 +:1013E000CDB7DEB78C01FC01E356FD4F8081882329 +:1013F00009F1C8010E942F0829833A834B835C833B +:101400006D837E83F801680120E8C21A2DEFD20AAD +:1014100084A19F012C5E3F4F7901882339F04B81D5 +:101420005C8169817A81C9010E94880EF701EC1400 +:10143000FD0471F7F801E156FD4F108226960FB6B4 +:10144000F894DEBF0FBECDBFDF91CF911F910F91FA +:10145000FF90EF90DF90CF9008954F925F926F9240 +:101460007F928F929F92AF92BF92CF92DF92EF9234 +:10147000FF920F931F93CF93DF93CDB7DEB72897DB +:101480000FB6F894DEBF0FBECDBF8C01FC01E05655 +:10149000FD4F8081882309F457C0380120E8621A83 +:1014A0002DEF720A82E1C82E81E0D82E98E0592EE5 +:1014B000CE0101967C0124E5422E58019EE5A91A31 +:1014C0009DEFB90AF80184A10C5E1F4F8823C1F17A +:1014D000C8010E94D60E882E912C1F928F93DF9206 +:1014E000CF921F925F92FF92EF920E944225F701E6 +:1014F00001900020E9F73197EE19FF09EE0FEE0F8A +:10150000EE0F642D6E1B46E2C7010E943805F501FF +:1015100090818FEF890F0FB6F894DEBF0FBECDBF5D +:10152000981771F0893008F087E09401082E02C006 +:10153000359527950A94E2F720FF1DC0F5018083B9 +:101540000615170509F0BECF28960FB6F894DEBF32 +:101550000FBECDBFDF91CF911F910F91FF90EF9004 +:10156000DF90CF90BF90AF909F908F907F906F90C3 +:101570005F904F9008958150D3CF4F925F926F92BA +:101580007F928F929F92AF92BF92CF92DF92EF9213 +:10159000FF920F931F93CF93DF93CDB7DEB72897BA +:1015A0000FB6F894DEBF0FBECDBF8C01FC01E05634 +:1015B000FD4F8081882309F457C0380120E8621A62 +:1015C0002DEF720A82E1C82E81E0D82E98E0592EC4 +:1015D000CE0101967C0124E5422E58019EE5A91A10 +:1015E0009DEFB90AF80184A10C5E1F4F8823C1F159 +:1015F000C8010E94D60E882E912C1F928F93DF92E5 +:10160000CF921F925F92FF92EF920E944225F701C4 +:1016100001900020E9F73197EE19FF09EE0FEE0F68 +:10162000EE0F642D6E1B46E2C7010E943805F501DE +:10163000908181E0890F0FB6F894DEBF0FBECDBF59 +:10164000981771F0883008F080E09401082E02C0ED +:10165000359527950A94E2F720FF1DC0F501808398 +:101660000615170509F0BECF28960FB6F894DEBF11 +:101670000FBECDBFDF91CF911F910F91FF90EF90E3 +:10168000DF90CF90BF90AF909F908F907F906F90A2 +:101690005F904F9008958F5FD3CF0F931F93CF9399 +:1016A000DF93EC01FC01E056FD4F8081882399F126 +:1016B000FE0190E080E024A10196222341F144E163 +:1016C000489F9001499F300D1124CE01820F931F36 +:1016D0000E94D60E90E08E010E551D4FF80120811C +:1016E00002C0959587952A95E2F780FD03C0CE014B +:1016F0000E94BD0AF801808190E00E94DE0E4CE25B +:1017000068E2DF91CF911F910F910C943805749688 +:101710008032910581F6DF91CF911F910F9108954D +:10172000CF93DF93EC0184E090E00E94550688237C +:1017300029F0CE01DF91CF910C94E50884E090E090 +:101740000E943C06882329F0CE01DF91CF910C94B2 +:10175000F60885E090E00E945506882329F0CE0126 +:10176000DF91CF910C94BC0985E090E00E943C068B +:10177000882329F0CE01DF91CF910C94E50990E008 +:1017800080E00E943C06882329F0CE01DF91CF91B2 +:101790000C942D0A82E090E00E943C06882329F0F8 +:1017A000CE01DF91CF910C94BD0ADF91CF910895C6 +:1017B000EF92FF920F931F93CF93DF93EC018C0175 +:1017C0000B561D4FFC01E056FD4F6081C8010E9481 +:1017D000F40CC8010E94560CCE010E945B0801580F +:1017E00012407E018CE6E81A8DEFF80AC8010E94CB +:1017F000900E0C5E1F4F0E151F05C1F7CE010E9403 +:101800004D0BCE010E94900BCE014196DF91CF91FE +:101810001F910F91FF90EF900C94C805FC0111826D +:101820001082138212821482158283E086831782CB +:101830000895CF93DF93CDB7DEB72C970FB6F8940A +:10184000DEBF0FBECDBF1C861B86FC01228133810B +:10185000420F531F80819181680F791F78876F83B2 +:101860005A87498786E0FE013796DE01119601907E +:101870000D928A95E1F729813A814B815C816D81D6 +:101880007E8180E090E02C960FB6F894DEBF0FBE0C +:10189000CDBFDF91CF910895FC019081490FDB010D +:1018A0004C938281280F11962C930895CF93DF9348 +:1018B000EC018F81882319F01C821D821BC08E8150 +:1018C0008330D8F48F5F8E832C8188819981820F39 +:1018D000911D27FD9A9597FF80C0998388832D815C +:1018E0008A819B81820F911D27FD9A9597FF79C070 +:1018F0009B838A83DF91CF9108951E820E945806B0 +:10190000882369F190E080E00E945506882329F041 +:101910008C8187FF47C08E5F8C8381E090E00E94BE +:101920005506882329F08D8187FF41C08E5F8D8306 +:1019300083E090E00E945506882331F08D811816CF +:101940000CF03AC082508D8382E090E00E945506F0 +:10195000882329F08C8118169CF582508C8390E0A6 +:1019600080E00E94550681110BC082E090E00E9449 +:101970005506811105C08C81181634F581508C8371 +:1019800081E090E00E94550681119ECF83E090E0B7 +:101990000E945506811198CF8D811816CCF4815084 +:1019A0008D8392CF85300CF0B8CF8F5FB5CF853067 +:1019B0000CF0BECF8F5FBBCF8C3F34F28150C3CFD2 +:1019C0008C3F6CF28150CACF8823D1F28F5FD7CF82 +:1019D000882309F479CF8F5FE3CF198218821C82A4 +:1019E0007ECF1B821A8269CFFC016783089521E0B4 +:1019F000FC01218B08950895FF920F931F93CF93BD +:101A0000DF9309E215E087E591E0F801908787838D +:101A10000E94FE04F801828387E591E00E9401059F +:101A2000F801838315821482FF24F394F682CCEFAD +:101A3000D4E081E691E098878F830E94FE048A8338 +:101A400081E691E00E9401058B831D821C82FE824B +:101A50008DE091E0F801928F818F0E94FE04F801E1 +:101A6000848B8DE091E00E940105F801858B178A37 +:101A7000168AF08E83EC90E09A8F898F0E94FE0484 +:101A80008C8B83EC90E00E9401058D8B1F8A1E8A4F +:101A900083E0888FDF91CF911F910F91FF90089580 +:101AA00099E0899FF0011124E75DFA4F87819085C5 +:101AB0000C94FE0499E0899FF0011124E75DFA4F30 +:101AC000878190850C9401058F929F92AF92BF926F +:101AD000CF92DF92EF92FF920F931F93CF93DF93FA +:101AE00000D000D000D0CDB7DEB77C016B01842ED2 +:101AF000DC011F968C911F97882309F480C01996EA +:101B00009C90E92DF0E0B9E09B9E80011124D70163 +:101B10001D968C911D978111B3C01E968C918823C0 +:101B200009F480C004501B4FF801148215828823E9 +:101B300051F0D70153968C9153978F5F853008F001 +:101B400074C053968C93D7011A968D919C911B97D4 +:101B50008130910509F48AC008F484C0823091056F +:101B600009F46AC0039709F473C0F7012281338135 +:101B700040815181B801C6010E944C0CC8010E94ED +:101B8000D204811005C0D70150968C918823B9F1F9 +:101B9000F7014281538160817181C6010E94190C55 +:101BA00029833A834B835C83C980DA80AB80BC8015 +:101BB000D70150968C9101E0811101C003E0892D7D +:101BC0000E94500D182F892D0E945A0DF7019585FE +:101BD000992309F477C0282F26952695280F412FA1 +:101BE00046954695410F8695869586956A2D681B84 +:101BF0001695169516958C2D811B0E946A052696C2 +:101C00000FB6F894DEBF0FBECDBFDF91CF911F910D +:101C10000F91FF90EF90DF90CF90BF90AF909F908B +:101C20008F900895075D1A4F7FCFF701138A84853F +:101C300091E08927848787CF82E0F8018583D701E7 +:101C40001C968C91882309F490CF83E085838DCFF7 +:101C5000F7018485882309F488CF81E0D80115969F +:101C60008C9383CF81E0F8018483E8CF81E0F80191 +:101C700084831C968C91882309F477CF82E0E6CF89 +:101C8000C80184509B4F5C01EE0FFF1FE95EFE4FC1 +:101C9000818112962D913C911397280F311D87FD5C +:101CA0003A9580814D915C91480F511D87FD5A9561 +:101CB000B501C6010E944C0CC5010E94D204075D0B +:101CC0001A4F53CF682F66956A0D7B2D711D812F9A +:101CD0008695202F412F8C0D9D2D911D26960FB698 +:101CE000F894DEBF0FBECDBFDF91CF911F910F9152 +:101CF000FF90EF90DF90CF90BF90AF909F908F902C +:101D00000C943E05E82FF0E0E75BFE4F80810895DC +:101D1000FC01758364835783468381E08687089539 +:101D2000FC012685222331F140815181A185B0E05B +:101D3000AC5BBE4F8C9190E0DA01A81BB90B6481BB +:101D400075816A177B07B8F413861286B183A08366 +:101D5000322F62817381DB01A81BB90B4681578149 +:101D60004A175B07A8F482E090E093878287B383E9 +:101D7000A28326870895480F591F30E0461757075A +:101D800040F761E070E07387628751834083E0CF62 +:101D9000860F971F8417950738F443E050E0538768 +:101DA000428793838283E5CF232FE3CFDC0119960B +:101DB000EC91F0E0E15EFE4F80810895880F991F5D +:101DC000880F991FFC01E85CFE4F80819181089586 +:101DD000BC016F5F7F4F80E1FB0111928A95E9F7AB +:101DE0008EE591E00C94CE1B43E06BE671E08EE54E +:101DF00091E00E943118811106C08EEE91E00E94A0 +:101E0000E80E0C947F030895FC0188E0808389E04C +:101E1000818387E0828386E0838384E0848382E019 +:101E2000858381E186830895FF920F931F93CF935B +:101E3000DF93EC018C01095F1F4FFF24FA9462E0ED +:101E400088810E94B82088810E9422212F81892BBD +:101E500081F42F5F2F8360E088810E94B820219653 +:101E6000C017D10761F7DF91CF911F910F91FF90BC +:101E700008952223A1F32F3F11F41F82ECCFFF829C +:101E8000EACFFC01E60FF11D81E09781913009F066 +:101E900080E00895FC01E60FF11D81E097819F3FEE +:101EA00009F080E00895860F911DFC018781423082 +:101EB00038F49FEF980F81E09E3F50F080E008C01B +:101EC0008F3FE1F3642F0E941B2381E09130B1F733 +:101ED0000895860F911DFC0187818F3F09F480E0F2 +:101EE00008958EBD0DB407FEFDCF8EB508951F93E6 +:101EF000CF93DF93EC01162FF89460E08F850E945A +:101F0000F420888918161CF460E00E94F420812FC8 +:101F10000E94710F888918161CF461E00E94F42059 +:101F20007894DF91CF911F910895E6E5F5E028EFD1 +:101F300031E0DF01A9011D9241505040E1F7DC0181 +:101F400019961C9219971A961C920895CF92DF92B7 +:101F5000EF92FF920F931F93CF93DF93EC018C8549 +:101F60008F5F8C8786E5E82E85E0F82E10E0612FE4 +:101F70006064CE010E94770F60E8CE010E94770F67 +:101F800061E08F850E94F420888918161CF460E0B7 +:101F90000E94F420670104E5F60181916F010E941F +:101FA000710F0150C9F7888918161CF461E00E946E +:101FB000F4201F5FF4E5EF0EF11C1630C1F660E46B +:101FC000CE01DF91CF911F910F91FF90EF90DF90A5 +:101FD000CF900C94770FFC0160A361A30895FC01DE +:101FE00060A341A30895EF92FF920F931F93CF93A5 +:101FF000DF938C01D62FF42EE22EC0E0CE1544F4F0 +:102000004F2D4C0F6D2FC8010E947204CF5FF6CF89 +:10201000DF91CF911F910F91FF90EF900895EF9274 +:10202000FF920F931F93CF93DF938C01F62ED42F43 +:10203000E22EC0E0CE1544F46F2D6C0F4D2FC80179 +:102040000E947204CF5FF6CFDF91CF911F910F9165 +:10205000FF90EF900895EF92FF920F931F93CF930D +:10206000DF937C01162FD42FC22F0E940F104FEF49 +:10207000400F4D0F2C2F612FC7010E940F10202FF2 +:102080004D2F612FC7010E94F30F6FEF6C0F610F8F +:10209000202F4D2FC701DF91CF911F910F91FF90FE +:1020A000EF900C94F30FDF92EF92FF920F931F9338 +:1020B000CF93DF937C01D62FD22EC42F002E000C9D +:1020C000110B040F111D47FD1A958C2F0C2E000CBF +:1020D000990B8017910744F42D2D4C2F6D2FC701BC +:1020E0000E940F10CF5FF1CFDF91CF911F910F9121 +:1020F000FF90EF90DF9008959F92AF92BF92CF92A2 +:10210000DF92EF92FF920F931F93CF93DF938C0197 +:10211000E62EF42EC22F81E0D82ED21AC22EC19400 +:10212000CC0C422F4F0DC8010E9472044F2D4C1B46 +:102130006E2DC8010E9472046C2F6E0D4F2DC801C8 +:102140000E9472046E2D6C1B4F2DC8010E947204F8 +:10215000D0E0DC170CF044C0D7FC04C0C150C394DD +:10216000C394DC0CDF5F8D2F880F8F5FD80E9E2C01 +:102170009D0EBF2CBC0E4B2D692DC8010E94720410 +:10218000AE2CAD1A4B2D6A2DC8010E947204BF2CD3 +:10219000BC1A4B2D692DC8010E9472044B2D6A2D6B +:1021A000C8010E947204BF2CBD0E4B2DAE2CAC0E8C +:1021B0006A2DC8010E9472044B2DBE2CBC1A6B2DD7 +:1021C000C8010E9472049F2C9D1A492D6A2DC801D6 +:1021D0000E947204492D6B2DC8010E947204B9CF70 +:1021E000DF91CF911F910F91FF90EF90DF90CF90F3 +:1021F000BF90AF909F9008958F929F92AF92BF92A1 +:10220000CF92DF92EF92FF920F931F93CF93DF93C2 +:102210007C01162FD42EC22F81E0C82EC21AB22EF6 +:10222000B194BB0CD0E0802F8470A82E802F8270D8 +:10223000982E802F8870882E0170DC170CF04DC00E +:10224000C7FC04C0C150B394B394CB0CDF5F8D2F97 +:10225000880F8F5FC80EAA2071F04D2D4C0F612F93 +:102260006D0FC7010E9472044D2D4D0F6C2F610F31 +:10227000C7010E947204992071F04D2D4C1B612FF3 +:102280006D0FC7010E9472044D2D4D1B6C2F610F05 +:10229000C7010E947204882071F04D2D4D0F612FEF +:1022A0006C1BC7010E9472044D2D4C0F612F6D1BDA +:1022B000C7010E947204002309F4BFCF4D2D4D1BAE +:1022C000612F6C1BC7010E9472044D2D4C1B612FA6 +:1022D0006D1BC7010E947204B0CFDF91CF911F9197 +:1022E0000F91FF90EF90DF90CF90BF90AF909F90B5 +:1022F0008F9008957F928F929F92AF92BF92CF92CC +:10230000DF92EF92FF920F931F93CF93DF935C01C5 +:10231000C62E942EC22F11E0121BD22ED194DD0CAA +:1023200083E0F82ED0E0802F8170782E882483946B +:102330008E0C0270DC17ACF517FD04C0C150D394AD +:10234000D3941D0DDF5F1F0D772099F02C2F220FE6 +:10235000280D492D4C1B6C2D6D0FC5010E94F30FEC +:102360002E2D2F0D492D4D1B6C2F6C0DC5010E947C +:10237000F30F002399F02C2F220F280D492D4C1B11 +:102380006C2D6D1BC5010E94F30F2E2D2F0D492DB5 +:102390004D1B6C2D6C1BC5010E94F30FF394F3943D +:1023A000C9CFDF91CF911F910F91FF90EF90DF90F8 +:1023B000CF90BF90AF909F908F907F9008959F9205 +:1023C000AF92BF92CF92DF92EF92FF920F931F9343 +:1023D000CF93DF93EC01B62E142FD22EAE2CAA0C85 +:1023E000922E9A18CE2CC60E292D6C2D0E940F10FD +:1023F000FF24FA94F00EF10E292D4F2D6C2DCE01F5 +:102400000E940F100A191E0D202F412F6B2DCE0197 +:102410000E94F30FDB0C6FEF6D0D202F412FCE01CB +:102420000E94F30F01E02E2D412F6C2DCE010E9452 +:10243000FC108E2D8095D80E02E02E2D412F6D2D93 +:10244000CE010E94FC10FE1804E02E2D4F2D6D2DA4 +:10245000CE010E94FC1008E02E2D4F2D6C2DCE01D8 +:102460000E94FC10DF91CF911F910F91FF90EF9090 +:10247000DF90CF90BF90AF909F900895AF92BF92A2 +:10248000CF92DF92EF92FF920F931F93CF93DF9340 +:102490006C01C62FF42EA22ED02F1E2DEE0CB12EC5 +:1024A000B60E2E196B2D0E945310D150DE19F10E6D +:1024B0006FEF6C0F6A0D611BED2E01E0212F4F2D88 +:1024C000C6010E947A1102E0212F4F2D6B2DC6010B +:1024D0000E947A11DF91CF911F910F91FF90EF90A1 +:1024E000DF90CF90BF90AF9008952F923F925F9270 +:1024F0006F927F928F929F92AF92BF92CF92DF9214 +:10250000EF92FF920F931F93CF93DF93EC01F901AA +:10251000E4903196849164350CF015C10E2C000CBA +:10252000FF08062F062E000C110BF701E00FF11F1C +:102530001E161F060CF007C140330CF004C1A82F73 +:10254000C42E042E000CDD085601A80EB11C87FD18 +:10255000BA941A141B040CF0F6C02E5F3F4F5701BB +:1025600097E0A90EB11CB7FE04C05701BEE0AB0E48 +:10257000B11CB3E0B594A794BA95E1F747FF0AC040 +:10258000A42FA80FAC9CC001AD9C900D1124281B5A +:10259000390B40E08A2F0A2E000C990B840F911DF5 +:1025A00047FD9A95C19714F0A0E3A41BF8A067FD1E +:1025B00060E0E535F10514F0E4E5F0E09E2FCC8510 +:1025C000C427C62E062E000CDD08F601E01BF10B19 +:1025D0008F014F01F7E08F229924E0E8F0E002C07C +:1025E000F595E7958A94E2F77E2F17FF02C0095F01 +:1025F0001F4FF3E015950795FA95E1F7200F311F6E +:10260000542F577081E001C0880F5A95EAF745951D +:1026100045954595F601B4E54B02E00DF11D1124F9 +:10262000AF014A5A5A4FD0E02A2EAA0F3308EE249F +:10263000E394BB24D21513040CF085C0F901549027 +:10264000F1E0FF121AC06901962E8A01E72F991650 +:1026500008F057C08E2E852021F0D8018C90882A52 +:102660008C92E69531F4BFEFCB1ADB0AF601549059 +:10267000E0E893940F5F1F4FEACFF1101CC0782E53 +:1026800070946901962E8A01E72F991608F039C0D7 +:102690008E2E852021F0D8018C9087208C92E69593 +:1026A00031F4BFEFCB1ADB0AF6015490E0E89394C3 +:1026B0000F5F1F4FEACFF3E0FF122CC0782E70940B +:1026C0006901862E8A01972E8916D0F4E92DE5211D +:1026D00041F0D801EC916C2E682460FE0FC0E82B0D +:1026E000EC93969439F4BFEFCB1ADB0AF6015490C1 +:1026F000E0E89E2E83940F5F1F4FE6CFE721F0CFD7 +:10270000CE25880F19F44C5A5F4F81E0DF5F2A0D08 +:102710003B1D90CF6901962E8A01E72F991688F705 +:102720008E2E852021F0D8018C9088268C92E695FB +:1027300031F4BFEFCB1ADB0AF6015490E0E8939432 +:102740000F5F1F4FEBCFDF91CF911F910F91FF9044 +:10275000EF90DF90CF90BF90AF909F908F907F9041 +:102760006F905F903F902F9008952F923F924F92DD +:102770005F926F927F928F929F92AF92BF92CF9211 +:10278000DF92EF92FF920F931F93CF93DF9300D0CE +:1027900000D000D01F92CDB7DEB74C01462E342EAC +:1027A00069018E2D01111DC0E1101BC0C4012796C7 +:1027B0000FB6F894DEBF0FBECDBFDF91CF911F9152 +:1027C0000F91FF90EF90DF90CF90BF90AF909F90D0 +:1027D0008F907F906F905F904F903F902F900C94D0 +:1027E0007512F60154903196E490A52CB12C950108 +:1027F000295F3F4FA90133E0559547953A95E1F799 +:102800005B834A830370F12CEE2DF0E0FD83EC83B3 +:102810005A941FEF1E0D2F2D0F2C000C330B2A1571 +:102820003B050CF070C0F982F7FE03C0F7E0FF0D26 +:10283000F983298125952595259529839F2D9778BD +:1028400097FF03C09150986F9F5F20E8622E712C14 +:1028500002C0759467949A95E2F7212C4981042E61 +:10286000000C550B4E5F5F4F5F834E83222D022C71 +:10287000000C330BEC81FD812E173F070CF041C09B +:102880004A815B81429FF001439FF00D529FF00D02 +:1028900011242E813F81E20FF31FEC0DFD1DE49109 +:1028A000F0E0E621F721EF2B41F1023069F0612FD2 +:1028B00062194F2D033061F0452D4F19622D013003 +:1028C00039F0422D6F2D04C0652D6F19412F42192B +:1028D0008823A9F0382F3370398380FF03C0552D2A +:1028E000561B652F81FF03C08E2D841B482F640D5E +:1028F000430DC4010E94720489812394B7CF1982C9 +:10290000F6CFF39488CF27960FB6F894DEBF0FBEAC +:10291000CDBFDF91CF911F910F91FF90EF90DF908E +:10292000CF90BF90AF909F908F907F906F905F906F +:102930004F903F902F900895DC01FB0184918F5FB1 +:1029400014968C9314973196E491EF5F1596EC935F +:1029500015976E5F7F4F5F967C936E935E97089599 +:10296000EF920F93CF93DF93EC014E876D872F8704 +:10297000E98A088B81E0888788A319A28F8366E2A1 +:1029800073E0CE010E949C140E94D82281E00E9434 +:10299000EE2285E00E94FC228CE00E94F72261E09A +:1029A0008E850E94B82061E08D850E94B82061E08C +:1029B0008F850E94B820898918161CF461E00E9456 +:1029C000B820888918161CF461E00E94B820898913 +:1029D00018166CF460E00E94F4206AE070E080E079 +:1029E00090E00E94B61F61E089890E94F4208D85E5 +:1029F000082E000C990BFC01E65CF94FE491F0E025 +:102A0000EE0FFF1FE85AF94F259134913D8B2C8B27 +:102A1000FC01EA5DF94FE491EB8F8E85082E000CE6 +:102A2000990BFC01E65CF94FE491F0E0EE0FFF1F1B +:102A3000E85AF94F259134913B8B2A8BFC01EA5DD2 +:102A4000F94FE491EA8F8889082E000C990BFC015C +:102A5000E65CF94FE491F0E0EE0FFF1FE85AF94F02 +:102A6000259134913F8B2E8BFC01EA5DF94FE49167 +:102A7000EC8F8F85082E000C990BFC01E65CF94F5A +:102A8000E491F0E0EE0FFF1FE85AF94F25913491E1 +:102A9000398F288FFC01EA5DF94FE491ED8F61E2F7 +:102AA000CE010E94770F64E1CE010E94770F8B85E3 +:102AB00087FF02C08FE78B876B856068CE010E941D +:102AC000770F60E2CE010E94770F6CE0CE010E948A +:102AD000770FCE01DF91CF910F91EF900C94A60F5D +:102AE0004F925F926F927F928F929F92AF92BF921E +:102AF000CF92DF92EF92FF920F931F93CF93DF93CA +:102B0000EC01862EF42E102F83E586170CF485C079 +:102B10008FE284170CF481C04C814150550B049F07 +:102B2000C001059F900D1124860F911D67FD9A9598 +:102B3000181619060CF071C03D818F2D0F2C000C5A +:102B4000990B039F800D911D1124181619060CF086 +:102B500064C078A0E62E912CC22ED12C292D092CF0 +:102B6000000C330B8C8190E0281739070CF054C00F +:102B70000197E0E02817390771F0C89EF001C99E5F +:102B8000F00DD89EF00D11242E0F3F1FEE8DFF8DFE +:102B9000E20FF31FE4915F2C612C492C480C2D812E +:102BA000862D062C000C990B2817190691F18CF133 +:102BB000AE2EB12CE0FF16C0113061F4462D4F0D42 +:102BC000642DCE010E947204F501F595E79563949A +:102BD000510EE5CF012F212F452D6E2DCE010E94E4 +:102BE0005310F2CF89A198A1891771F388A31130EE +:102BF00041F4462D4F0D642DCE010E94720478A23F +:102C0000E3CF012F212F452D6E2DCE010E945310B1 +:102C1000F6CF9394E10EA2CF78A2DF91CF911F91CE +:102C20000F91FF90EF90DF90CF90BF90AF909F906B +:102C30008F907F906F905F904F9008950F93CF93F8 +:102C4000DF93EC01262F6A3049F428859D818A851F +:102C5000299F800D11248A8719861DC06D30D9F0F7 +:102C600008854A8569850E94701528853C8189857B +:102C7000239F800D112489879F81992361F0082E5D +:102C8000000C990B44E550E0239F40195109112491 +:102C900048175907DCF281E090E0DF91CF910F9166 +:102CA0000895FC01EC57FF4F718360838A579F4F53 +:102CB000445FFC01408308956F927F928F929F92B0 +:102CC000AF92BF92CF92DF92EF920F93CF93DF93A9 +:102CD0004C015C0186E8A80EB11CD5018C918823BB +:102CE00009F44AC0CCE0C81B8C3008F0C0E0F40105 +:102CF000EA5AFF4F81E080836401BEE4CB0ED11C11 +:102D000060E0C6010E94EB0F3401E3E56E0E711C1A +:102D1000D3018C9103E0080FDDE24D2F481B4C0FCF +:102D200083E0E82E24E560E0C6010E943E1261E0E7 +:102D3000C6010E94EB0FF301808103E0080F4D2FC5 +:102D4000481B4C0F24E560E0C6010E94DF11F4012E +:102D5000E95AFF4F84E080833196D3018C91C81BE0 +:102D6000C15DC083BC9660817181C6010E948221D1 +:102D7000F501808181508083DF91CF910F91EF9099 +:102D8000DF90CF90BF90AF909F908F907F906F908B +:102D90000895CF92DF92FF920F931F93CF93DF930B +:102DA000EC018C8D9D8D892B01F18E01025B1F4FF3 +:102DB00040E061E0C8010E94EF0FFE01E95AFF4FB9 +:102DC000DE01AE5ABF4F9C9185E5891B8083319609 +:102DD0001082698D613009F46DC078F0888D65309E +:102DE00008F082C06B5F811175C0DF91CF911F9198 +:102DF0000F91FF90DF90CF900895CE0185960E94AD +:102E0000231E81E0FE01EA5AFF4F808366E273E0F1 +:102E1000C8010E949C141D8E1C8EFE01EC5AFF4FAF +:102E2000108288EAF82E6E018AE0C80ED11CCE010D +:102E30000E9479178823D9F365E175E0C8010E94E3 +:102E400082216A8D7B8D4AE050E0C8010E94912268 +:102E500060E075E0C8010E9482216F2D62956F705D +:102E600070E04AE050E0C8010E947D2265EF74E006 +:102E7000C8010E94822164E0C6010E94410F8111B5 +:102E8000B4CFFA94F110D3CF60E0CE010E94961E29 +:102E900083B7817F846083BF83B7816083BF83B73B +:102EA000816083BF889583B78E7F83BF83B78E7F12 +:102EB00083BFBDCFCF58DF4F88819981AA81BB8165 +:102EC0008F709927AA27BB2767E00897A105B1054E +:102ED00008F068E7C801DF91CF911F910F91FF9033 +:102EE000DF90CF900C94AD21882309F47ECF6FE260 +:102EF000F1CF8F929F92AF92BF92CF92DF92EF92DB +:102F0000FF920F931F93CF93DF93EC017C0180E836 +:102F1000E80EF11CF70180809180A280B3800E94AE +:102F2000851F861A970AA80AB90A6E01FFE7CF0E15 +:102F3000D11CF601808190E0B0E0A0E08E01055840 +:102F40001F4F88159905AA05BB0508F04AC0F8016E +:102F500080819181A281B381892B8A2B8B2B09F4EB +:102F600040C00E94851FF6012081620F711D811DE6 +:102F7000911DF70160837183828393833F978081E2 +:102F80009181A281B3810196A11DB11D808391839E +:102F9000A283B383F80110821182128213820E94ED +:102FA000911FFE01E958FF4F6083718382839383F1 +:102FB000CE010E949A1ECE010A960E94140FCE01E5 +:102FC00048960E94031F81E0DF91CF911F910F91DE +:102FD000FF90EF90DF90CF90BF90AF909F908F9039 +:102FE0000895F80180819181A281B381892B8A2B78 +:102FF0008B2BA9F57E01F5E2EF0EF11CC7010E94B3 +:10300000DE1CC7010E94511DC7010E94151ECE0182 +:103010000E945C16CE010E94C9167E018EE4E80E65 +:10302000F11CC7010E94A60FFE01EC5AFF4F8081E0 +:10303000811103C0C7010E94950F0E94911FF801E2 +:103040006083718382839383FE01EB58FF4FC958DD +:10305000DF4F28813981621B730B7183608380E0AD +:10306000B3CF2F923F924F925F926F927F928F9247 +:103070009F92AF92BF92CF92DF92EF92FF920F9307 +:103080001F93CF93DF93CDB7DEB765970FB6F89454 +:10309000DEBF0FBECDBF6C016A8B7B8B4B83FC0107 +:1030A000EC5AFF4F10822FEF2D831C821D8A10E3F4 +:1030B0001C8A3C013AE0630E711C842F90E09F83D0 +:1030C0008E832601E3E54E0E511C4601F5E28F0E7C +:1030D000911C9601295A3F4F39872887C601885A83 +:1030E0009F4F9B878A87F601EA5AFF4FFF87EE873B +:1030F00022503109398B288B0A971C01C6010E9486 +:1031000079178823D9F364E0C3010E94410F012F8E +:10311000110F110B882399F0F201F081F1952B81A9 +:10312000F29F202D112422502D8B64E0C3010E94B8 +:10313000410F811193C0C4010E947E1E94C065E0BE +:10314000C3010E94410F8111E7CF66E0C3010E94D5 +:10315000410F8111E1CF8C81811185C044E063E092 +:10316000C3010E94530F882331F09C899F5F9C8B81 +:10317000C4010E94821E44E061E0C3010E94530F1B +:10318000882331F0EC89E150EC8BC4010E94821E4F +:10319000FC898F2F0F2E000C990B2E813F818217F7 +:1031A000930709F46BC0F7FF03C03B8131503C8BA0 +:1031B000F2018081F4E0F80F2C89829FF01911242C +:1031C000FD8B9D89090F111D97FD1A9517FF02C0F0 +:1031D0000F5F1F4FF801F595E795FA83E9830981A1 +:1031E000102FE885F9851082EA85FB85008321E0B0 +:1031F000EE85FF852083E889F9891082EA88FB88BB +:10320000B12CA12C2C89022E000C330B3D872C876E +:103210008E819F818A159B0599F1EC85FD85EA15C4 +:10322000FB0579F423E0E885F9852083F2018081AC +:10323000F02F2C89289FF00D11248F2FEA85FB8514 +:103240008083F70165917491C1010E94C821FFEF4D +:10325000AF1ABF0A22E0E20EF11CDACFC4010E94CD +:103260007A1E3C893D83C8013D89831B910937FD46 +:103270009395029764F181E08C83A3CF1C8A98CF49 +:1032800060E0C1010E94EB0FF20180814981FC895D +:10329000F89F400D1124415024E560E0C1010E94D7 +:1032A0000F1061E0C1010E94EB0FF201808103E089 +:1032B000080F4981FC898F9F400D1124425083E003 +:1032C000E82E24E560E0C1010E94DF1117CF8D8157 +:1032D00065960FB6F894DEBF0FBECDBFDF91CF91DC +:1032E0001F910F91FF90EF90DF90CF90BF90AF9024 +:1032F0009F908F907F906F905F904F903F902F9016 +:1033000008950F931F93CF93DF93EC018C01025B21 +:103310001F4FC8010E94950F6DEC74E0C8010E9418 +:103320008221C8010E94A60F83E00E94FC2286E54C +:1033300091E0EEEFFFE30995FE01EC5AFF4F10829A +:1033400068EA74E0C8010E94C821C8010E94A60F63 +:103350002A96CE010E94140F64E0CE010E94410F14 +:10336000811107C062E370E080E090E00E94B61F28 +:10337000F0CFDF91CF911F910F9108952F923F923F +:103380004F925F926F927F928F929F92AF92BF9275 +:10339000CF92DF92EF92FF920F931F93CF93DF9321 +:1033A000CDB7DEB729970FB6F894DEBF0FBECDBFFD +:1033B000998788877B836A832A013C0180E7680EAE +:1033C000711CF3018081882309F4F7C081E0E8854E +:1033D000F985EA5AFF4F8083E885F985EB5AFF4F5C +:1033E0001082E885F985EC5AFF4F1082E885F9854F +:1033F000108E8F01025B1F4F61E0C8010E94EB0F2E +:10340000888599858D5A9F4F9F838E83A884B98420 +:1034100097E5A90EB11CE884F984E8E5EE0EF11CED +:1034200088849984F2E58F0E911C888599858F5840 +:103430009F4F9D838C83288439849AE0290E311C08 +:10344000C884D984E5E2CE0ED11C888599850E9476 +:1034500079178823D1F3EA81FB81F491F983FF2363 +:1034600021F0EE81FF81F081F98327E335E040E030 +:1034700060E0C8010E9475124114510439F049817D +:10348000445F920160E0C8010E947512F50110824C +:103490008CE0F70180836A817B81C8010E948221D0 +:1034A000F4018081982F990F990F891B8D5AF5018E +:1034B0008083EE81FF818081982F990F990F891B5E +:1034C000835DF7018083EC81FD81808163E375E09A +:1034D00084FD02C06FE275E0C8010E94C821F401BA +:1034E0008081982F990F990F891B8D5AF501808340 +:1034F000F70180818F5F8083E885F98582A56BE283 +:1035000075E0811102C067E275E0C8010E94C82120 +:10351000F4018081982F990F990F891B8D5AF5011D +:103520008083F70180818F5F808363E275E0C8014B +:103530000E94C82165E0C1010E94410F882351F01B +:10354000E885F98562A56F5FC6010E94861EC601E7 +:103550000E94821E64E0C1010E94410F81111FC0C0 +:10356000F3012081422F50E070E060E0EC81FD81AA +:1035700080819181A281B38184179507A607B7073F +:1035800010F02F3F61F466E0C1010E94410F8823D3 +:1035900009F45BCF888599850E94811956CF8FEFFA +:1035A000F301808360E0C6010E94181EC6010E94DC +:1035B0007A1E81E0E885F985808F29960FB6F89408 +:1035C000DEBF0FBECDBFDF91CF911F910F91FF9056 +:1035D000EF90DF90CF90BF90AF909F908F907F90B3 +:1035E0006F905F904F903F902F90089550E040E093 +:1035F0000C94BE19E0E8F7E72591349181E0213081 +:10360000304C09F080E00895CF93DF93EC010E94E5 +:10361000FA1A9E01275A3F4FDE01A059BF4F882357 +:1036200009F440C0E6E9F7E78491F9018083E7E90E +:10363000F7E7E491EC83E8E9F7E7E491ED83E9E962 +:10364000F7E7859194919F838E83EBE9F7E7859166 +:10365000949199878887EDE9F7E7E491EBA7EEE984 +:10366000F7E7E491EAA7EFE9F7E7E491EC93E0EA02 +:10367000F7E7859194919D8F8C8FE2EAF7E785912A +:1036800094919F8F8E8FE4EAF7E78591949199A3A7 +:1036900088A3E6EAF7E7859194919BA38AA3DF913B +:1036A000CF9108958CE3F90180831C828FEF8D8385 +:1036B00020E233E03F832E8324ED33E039872887EF +:1036C00091E09BA79AA78C938CEA9DE09D8F8C8FAD +:1036D0008EED9DE09F8F8E8F84E79EE099A388A357 +:1036E0008CE39FE0DACFCF92DF92EF920F93CF93EC +:1036F000DF93EC01FC01E158FF4F82E380833497B4 +:1037000081E090E0A0E0B0E080839183A283B38366 +:103710003B978FEF8083CE010E94041BCE010E9455 +:10372000921E6FEFCE010E94961E6E018AE0C80EB7 +:10373000D11CC6010E94040FC6010E94140FCE01C5 +:1037400048960E94F91E8EE0E82E0FE020E14BE043 +:103750006DE0CE01825B9F4F0E94B014A596CE0112 +:103760000E94171C65E0C6010E94410F882351F09A +:1037700060E0CE01DF91CF910F91EF90DF90CF907D +:103780000C94861E40E067EA75E0CE01DF91CF9190 +:103790000F91EF90DF90CF900C94AB1CCF93DF9301 +:1037A000D62FC72F0E94FA1A882359F0AD2FBC2FAD +:1037B000EBE8F7E784918D933196E53987E7F807D1 +:1037C000C9F7DF91CF910895CF93DF93DC0170E0CB +:1037D000660F771F1F96ED91FC915097E60FF71F2C +:1037E0002591349190963C932E935F97F9014591E2 +:1037F000549114968C911497849F402D1124919686 +:103800004C939197F901C591D4916D2F70E04617B3 +:10381000170629F020F0F90125913491432F849F58 +:10382000402D112492964C93DF91CF91089521E081 +:10383000FC01248324E020A726E036E0308B278794 +:1038400060E00E94E41B61E070E083E00E943220AF +:10385000E1EBF0E08081887F81608083F8941092B2 +:103860008000E1E8F0E01082109285001092840060 +:1038700088E191E09093890080938800808188603E +:103880008083808181608083EFE6F0E080818260C8 +:103890008083789408950F93FC01011107C0623072 +:1038A000D9F030F4662379F0613091F00F910895EA +:1038B0006330C9F06430D1F76481649F402D1124D6 +:1038C000458F268FF3CF4B3008F04AE0468BEECF82 +:1038D000642F0F910C94E41B6481649F402D11248C +:1038E000418F228FE3CF6481649F402D1124438F49 +:1038F000248FDCCF80915A07882329F080915707C5 +:103900008093B400089580E0FBCFFC01178A158AEC +:1039100014A213A2108E10925707109258071092FB +:103920005A070C947A1C0F931F93CF93DF93EC01EB +:103930008B010E94851C1E870D871B8A1A8A81E0D5 +:10394000898389E08E8B198E1B8E1D8EDF91CF911E +:103950001F910F910895411102C00C94931C08957A +:10396000CF93DF93EC01611115C08881882391F01A +:10397000898181110FC0E9858E2F90E0880F991FF2 +:10398000EF81F885E80FF91F859194918F3F980793 +:1039900021F41882DF91CF9108959C879927880F91 +:1039A000991FEA85FB85E80FF91F65917491CE0197 +:1039B0000E94931C89858F5F8987ECCF60E00C940F +:1039C000B01C0F93CF93DF93EC01611166C0898126 +:1039D000882309F462C08D8981115FC08D859E8521 +:1039E000EA89FB89EE0FFF1FE80FF91F45915491FB +:1039F0004115510541F42989213021F51B8A1A8A84 +:103A0000FC0145915491BA01769567957695679535 +:103A1000862F40FF2EC0252F2695269526952051CE +:103A200086E0569547958A95E1F74F716F7000E0F3 +:103A3000CE010E944B1CEA89FB893196FB8BEA8BF5 +:103A4000CF010AC019828881882369F060E0CE0125 +:103A50000E94B01C8A899B89880F991FED85FE857D +:103A6000E80FF91FCECFCE01DF91CF910F910C94CB +:103A7000851C8F738C8B8C81859F802D11248D8B61 +:103A80001DA21CA21BA281E08F8B80935A07188E67 +:103A90008A899B8901969B8B8A8BDF91CF910F91AD +:103AA000089560E00C94E11CCF93DF93EC01611169 +:103AB000B3C08F89882309F4AFC08D89811105C0F7 +:103AC000CE01DF91CF910C94851C81508D8B8DA1FF +:103AD000811134C02BA13CA12F5F3F4FC901880F3A +:103AE000991FEF8DF8A1E80FF91F85919491482F48 +:103AF00047704EA3492F469546954FA3AC0164E00D +:103B0000569547956A95E1F74F739C81499F402DE3 +:103B100011244DA383FB882780F9809356073CA38B +:103B20002BA389A190E02817390740F02AA122236E +:103B300009F475C0821B91099CA38BA38DA18150B0 +:103B40008DA3888D31E0380F388F4C892FA1240F39 +:103B50008C85280F2A836B8D662361F070E0832F9C +:103B6000032E000C990B0E943B238C8D869F200D09 +:103B700011242A838A8190E0CB966BE370E00E9447 +:103B80003B238A832E892B83698D662371F0062E51 +:103B9000000C770B832F032E000C990B0E943B2304 +:103BA0008A8D869F200D11242B836D8D662389F0CD +:103BB000832F330F990B70E00E943B23CB0162E00F +:103BC00070E00E943B232E8D9B81289F900D112435 +:103BD0009B834F3341F18B818A300CF089E087FD64 +:103BE00080E08B83F894EA81F0E0EB54FA4FE491A3 +:103BF000E09359078D8198A5899F802D11249B8181 +:103C0000899F802D11249EA1899F802D112480934E +:103C10005807809357077894DF91CF910895CE018C +:103C20000E94851C8BCF1B82DDCF60E00C94541D5D +:103C3000CF93DF93EC01611103C00E94851C1982B0 +:103C4000DF91CF910895CF93DF93EC010E94851C03 +:103C50001982DF91CF91089560915807662329F169 +:103C600080915B078F5F80935B079091590789175D +:103C7000E0F081E090915A07911180E080935A071B +:103C800010925B0780915607882369F080910401A8 +:103C900093E4899F802D1124895B809304010E9405 +:103CA0001B23909357070C947A1C08951F920F9230 +:103CB0000FB60F9211242F933F934F935F936F93FF +:103CC0007F938F939F93AF93BF93EF93FF930E9444 +:103CD0002C1EFF91EF91BF91AF919F918F917F919A +:103CE0006F915F914F913F912F910F900FBE0F9069 +:103CF0001F9018956EEF75E00C94931C66EF75E0BD +:103D00000C94931C60EF75E00C94931CFC01862FBF +:103D1000660F990B668170E06F5F7F4F0E943B23B7 +:103D20008583089521E0FC012083089570E085E0FB +:103D30000C943220AF92BF92CF92DF92EF92FF921B +:103D40000F931F93CF93DF93EC0189819A812FE02A +:103D5000289F8001299F100D112485E10E941720C2 +:103D6000800F911F24E0969587952A95E1F79A8315 +:103D700089832881222391F1EC81AD80B12CD12C53 +:103D8000C12CA885B9857D0110E000E06E817F819E +:103D90009B0150E040E08617970728F0BC01A81768 +:103DA000B90708F4BD0190E080E01F921F921F92B6 +:103DB000EF930E9497226B830F900F900F900F90BC +:103DC00070E085E0DF91CF911F910F91FF90EF9010 +:103DD000DF90CF90BF90AF900C943220DF91CF91C5 +:103DE0001F910F91FF90EF90DF90CF90BF90AF9019 +:103DF0000895FC018CE39FE09383828384E08183B8 +:103E000081E084870895CF93DF93EC018C819D81BD +:103E1000892B21F18C858F7139F584E10E9417205F +:103E2000BC01990F880B990B0E94ED2326EE3FE30E +:103E30004EEC50E40E9479240E94BC239B017B83BA +:103E40006A83672BA9F084E08983FE01349680E0C1 +:103E5000419151912417350720F48983DF91CF9147 +:103E600008958F5F8430A1F78C858F5F8C87F6CFA4 +:103E70008FEF8983F9CF1F920F920FB60F92112403 +:103E80002F933F938F939F93AF93BF9380915D0741 +:103E900090915E07A0915F07B091600730915C0739 +:103EA00023E0230F2D3758F50196A11DB11D209356 +:103EB0005C0780935D0790935E07A0935F07B093C4 +:103EC00060078091610790916207A0916307B091AC +:103ED00064070196A11DB11D80936107909362074D +:103EE000A0936307B0936407BF91AF919F918F91A7 +:103EF0003F912F910F900FBE0F901F90189526E8BD +:103F0000230F0296A11DB11DD2CF2FB7F894609157 +:103F10005D0770915E0780915F07909160072FBFEA +:103F200008953FB7F8948091610790916207A0913E +:103F30006307B091640726B5A89B05C02F3F19F011 +:103F40000196A11DB11D3FBFBA2FA92F982F882719 +:103F5000BC01CD01620F711D811D911D42E0660FF4 +:103F6000771F881F991F4A95D1F70895CF92DF9246 +:103F7000EF92FF92CF93DF936B017C010E94911F20 +:103F8000EB01C114D104E104F10439F4DF91CF91C4 +:103F9000FF90EF90DF90CF9008950E94911F6C1BCF +:103FA0007D0B683E734068F381E0C81AD108E108D0 +:103FB000F108C851DC4FE5CF789484B5826084BDA8 +:103FC00084B5816084BD85B5826085BD85B581601D +:103FD00085BDEEE6F0E0808181608083E1E8F0E07D +:103FE0001082808182608083808181608083E0E8AC +:103FF000F0E0808181608083E1EBF0E0808184608B +:104000008083E0EBF0E0808181608083EAE7F0E08C +:1040100080818460808380818260808380818160F0 +:1040200080838081806880831092C10008958E30E3 +:1040300008F08E502091050190E4299F90011124F1 +:104040008770822B80937C0080917A0080648093BB +:104050007A0080917A0086FDFCCF80917800909163 +:10406000790008951F93CF93DF93182FEB0161E040 +:104070000E94B820209739F460E0812FDF91CF9122 +:104080001F910C94F420CF3FD10511F461E0F5CFDE +:10409000E12FF0E0EE5EF94FE491E33031F140F4CE +:1040A000E130B1F0E230E1F0C038D1057CF7E4CF87 +:1040B000E63029F1E73059F1E430B1F78091800022 +:1040C000806280938000D0938B00C0938A0004C0EC +:1040D00084B5806884BDC7BDDF91CF911F910895DD +:1040E00084B5806284BDC8BDF7CF809180008068B0 +:1040F00080938000D0938900C0938800EDCF809199 +:10410000B00080688093B000C093B300E5CF809189 +:10411000B00080628093B000C093B400DDCF8330E4 +:1041200081F028F4813099F08230A9F0089586302A +:10413000A9F08730C9F08430B1F4809180008F7D80 +:1041400003C0809180008F7780938000089584B5AC +:104150008F7784BD089584B58F7DFBCF8091B000AB +:104160008F778093B00008958091B0008F7DF9CF54 +:10417000CF93DF9390E0FC01EA5DF94F2491865CD8 +:10418000994FFC0184918823C9F090E0880F991F12 +:10419000FC01EE59F94FA591B491FC01E85AF94F91 +:1041A000C591D49161110DC09FB7F8948C91209561 +:1041B00082238C938881282328839FBFDF91CF910E +:1041C0000895623051F49FB7F8943C91822F809506 +:1041D00083238C93E8812E2BEFCF8FB7F894EC914B +:1041E0002E2B2C938FBFEACF1F93CF93DF93162FE5 +:1041F000282F30E0F901EE5EF94F8491F901EA5D74 +:10420000F94FD491F901E65CF94FC491CC23A1F0A8 +:1042100081110E948F20EC2FF0E0EE0FFF1FE85A73 +:10422000F94FA591B4918FB7F894EC91111108C092 +:10423000D095DE23DC938FBFDF91CF911F9108953E +:10424000DE2BF8CFCF93DF93282F30E0F901EE5E1D +:10425000F94F8491F901EA5DF94FD491F901E65CD7 +:10426000F94FC491CC23A1F081110E948F20EC2F33 +:10427000F0E0EE0FFF1FE25BF94FA591B491EC91D6 +:10428000ED2381E090E009F480E0DF91CF91089583 +:1042900080E090E0FACFCF92DF92EF92FF920F93FF +:1042A0001F93CF93DF936C01EB017B01E40EF51EAE +:1042B00010E000E0CE15DF0561F06991D601ED91C7 +:1042C000FC910190F081E02DC6010995080F191F9E +:1042D000F1CFC801DF91CF911F910F91FF90EF9027 +:1042E000DF90CF900895FB0101900020E9F731970E +:1042F000AF01461B570BDC01ED91FC910280F3816D +:10430000E02D0994EF92FF920F931F93CF93DF93C9 +:104310007C018B01D0E0C0E0F80164910F5F1F4F7A +:10432000662359F0D701ED91FC910190F081E02DC9 +:10433000C7010995C80FD91FEFCFCE01DF91CF91EB +:104340001F910F91FF90EF9008956115710511F085 +:104350000C94732190E080E00895DC01ED91FC91D4 +:104360000190F081E02D09940F931F93CF93DF9379 +:10437000EC016DE00E94AD218C016AE0CE010E944B +:10438000AD21800F911FDF91CF911F910F91089563 +:104390000F931F93CF93DF93EC010E9482218C0136 +:1043A000CE010E94B421800F911FDF91CF911F9108 +:1043B0000F9108958F929F92AF92BF92CF92DF920A +:1043C000EF92FF920F931F93CF93DF93CDB7DEB79A +:1043D000A1970FB6F894DEBF0FBECDBF6C01142FAE +:1043E000E52FCB01022F19A2223008F40AE07E014A +:1043F00021E2E20EF11C802E912CB12CA12C612F18 +:104400007E2FA50194010E944F23029F10191124B1 +:104410001A303CF5105DF70112937F01122FE32F44 +:10442000CA01232B242B252B51F790E080E0E114C7 +:10443000F10421F0B701C6010E947321A1960FB6C5 +:10444000F894DEBF0FBECDBFDF91CF911F910F91CA +:10445000FF90EF90DF90CF90BF90AF909F908F90A4 +:104460000895195CD8CFCF92DF92EF92FF920F930D +:104470001F93CF93DF93EC016A017B012115310576 +:1044800079F4E881F9810190F081E02D642FDF91CA +:10449000CF911F910F91FF90EF90DF90CF900994F3 +:1044A0002A303105E9F42AE0F7FE1AC06DE20E94D5 +:1044B000AD218C0144275527BA014C195D096E09BD +:1044C0007F092AE0CE010E94DA21800F911FDF913F +:1044D000CF911F910F91FF90EF90DF90CF900895B3 +:1044E000B701A601CE01DF91CF911F910F91FF90EF +:1044F000EF90DF90CF900C94DA219A01AB01770F07 +:10450000660B770B0C9433222115310541F4DC0145 +:10451000ED91FC910190F081E02D642F09940C94B1 +:10452000DA219A01AB0170E060E00C9484224F9292 +:104530005F926F927F92AF92BF92CF92DF92EF9293 +:10454000FF920F931F93CF93DF93CDB7DEB729016F +:104550003A019B01AC01241935094609570989899B +:104560009A89AB89BC89BC01CD016A197B098C0988 +:104570009D090E940B23A8019701241935094609BA +:1045800057090E947123CA01B9016A0D7B1D8C1D58 +:104590009D1DDF91CF911F910F91FF90EF90DF90C4 +:1045A000CF90BF90AF907F906F905F904F900895A5 +:1045B00061E08AE00E94F42061E08AE00E94B82075 +:1045C0008CB580618CBD8CB580648CBD61E08DE064 +:1045D0000E94B82061E08BE00C94B820811104C0E7 +:1045E0008CB580628CBD08958CB58F7DFBCF9CB55A +:1045F000937F892B8CBD08959CB59C7F282F2370B9 +:10460000922B9CBD9DB582FB222720F9892F8E7F9E +:10461000822B8DBD0895DB018F939F930E94902381 +:10462000BF91AF91A29F800D911DA39F900DB29F4E +:10463000900D11240895991B79E004C0991F9617D5 +:1046400008F0961B881F7A95C9F780950895AA1BD4 +:10465000BB1B51E107C0AA1FBB1FA617B70710F06D +:10466000A61BB70B881F991F5A95A9F7809590959F +:10467000BC01CD01089597FB072E16F4009407D0D6 +:1046800077FD09D00E94272307FC05D03EF49095C2 +:1046900081959F4F0895709561957F4F0895A1E290 +:1046A0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FAC +:1046B000FF1FA217B307E407F50720F0A21BB30BF7 +:1046C000E40BF50B661F771F881F991F1A9469F773 +:1046D00060957095809590959B01AC01BD01CF01CF +:1046E0000895052E97FB1EF400940E94882357FD21 +:1046F00007D00E944F2307FC03D04EF40C9488236C +:1047000050954095309521953F4F4F4F5F4F0895FD +:1047100090958095709561957F4F8F4F9F4F08952D +:104720000E94AD23A59F900DB49F900DA49F800D76 +:10473000911D112408950024A7FD00942A0F301D17 +:10474000401D501D601D701D801D901D0895EE0FB1 +:10475000FF1F0590F491E02D0994A29FB001B39F33 +:10476000C001A39F700D811D1124911DB29F700D7A +:10477000811D1124911D08950E94582488F09F578F +:1047800098F0B92F9927B751B0F0E1F0660F771F75 +:10479000881F991F1AF0BA95C9F714C0B13091F06B +:1047A0000E947224B1E008950C947224672F782F30 +:1047B0008827B85F39F0B93FCCF386957795679530 +:1047C000B395D9F73EF490958095709561957F4F9C +:1047D0008F4F9F4F0895E89409C097FB3EF4909542 +:1047E0008095709561957F4F8F4F9F4F9923A9F0CA +:1047F000F92F96E9BB279395F69587957795679559 +:10480000B795F111F8CFFAF4BB0F11F460FF1BC09C +:104810006F5F7F4F8F4F9F4F16C0882311F096E92F +:1048200011C0772321F09EE8872F762F05C06623DD +:1048300071F096E8862F70E060E02AF09A95660F96 +:10484000771F881FDAF7880F9695879597F908954F +:1048500097F99F6780E870E060E008959FEF80EC33 +:10486000089500240A9416161706180609060895D6 +:1048700000240A9412161306140605060895092E3C +:104880000394000C11F4882352F0BB0F40F4BF2BAB +:1048900011F460FF04C06F5F7F4F8F4F9F4F0895EB +:1048A00057FD9058440F551F59F05F3F71F04795E1 +:1048B000880F97FB991F61F09F3F79F087950895C6 +:1048C000121613061406551FF2CF4695F1DF08C0E5 +:1048D000161617061806991FF1CF86957105610502 +:1048E00008940895E894BB2766277727CB0197F9AA +:1048F00008950E948C240C943F240E94312438F0A7 +:104900000E94382420F0952311F00C9428240C9454 +:104910002E2411240C9473240E94502470F3959F2C +:10492000C1F3950F50E0551F629FF001729FBB27A6 +:10493000F00DB11D639FAA27F00DB11DAA1F649F42 +:104940006627B00DA11D661F829F2227B00DA11DF5 +:10495000621F739FB00DA11D621F839FA00D611D7B +:10496000221F749F3327A00D611D231F849F600D9C +:10497000211D822F762F6A2F11249F5750409AF0C5 +:10498000F1F088234AF0EE0FFF1FBB1F661F771F51 +:10499000881F91505040A9F79E3F510580F00C941C +:1049A00028240C9473245F3FE4F3983ED4F3869557 +:1049B00077956795B795F795E7959F5FC1F7FE2BBC +:1049C000880F911D9695879597F908958F929F92DC +:1049D000AF92BF92CF92DF92EF92FF92CF93DF938D +:1049E000EC01688179818A819B816115710581055E +:1049F000910521F464E279ED8BE597E02DE133EF49 +:104A000041E050E00E94712349015A019B01AC0131 +:104A1000A7EAB1E40E9490236B017C01ACEEB4EFF5 +:104A2000A50194010E94F327DC01CB018C0D9D1D93 +:104A3000AE1DBF1DB7FF03C00197A109B048888311 +:104A40009983AA83BB839F77DF91CF91FF90EF90EB +:104A5000DF90CF90BF90AF909F908F9008950E946D +:104A6000E624089580E091E00E94E6240895B0E0F5 +:104A7000A0E08093000190930101A0930201B09304 +:104A800003010895AEE0B0E0E8E4F5E20C940628F6 +:104A90000D891E898F89988D26E02C831A830983BE +:104AA00097FF02C080E090E801979E838D83AE015E +:104AB000455E5F4F698D7A8DCE0101960E94722509 +:104AC0004D815E8157FD0AC02F81388542175307FB +:104AD0000CF49A01020F131FF80110822E96E4E0E5 +:104AE0000C942228ABE0B0E0E8E7F5E20C94F8275C +:104AF0007C013B018A01FC0117821682838181FFC0 +:104B0000C8C1CE0101965C01F7019381F30193FDC9 +:104B1000859193FF81913F01882309F453C1853228 +:104B200039F493FD859193FF81913F01853229F4FA +:104B3000B70190E00E946227E7CF912C212C312C05 +:104B4000FFE1F31538F08B3211F190F4803209F166 +:104B5000833229F137FC3CC020ED280F2A3050F574 +:104B600036FE20C08AE0989E200D1124922E06C0A9 +:104B70008D3291F0803371F7689430F8F30193FD32 +:104B8000859193FF81913F018111DACF21C0689413 +:104B900031F8689432F8F2CF689433F8EFCF689424 +:104BA00034F8ECCFEAE02E9E200D1124222E6894DA +:104BB00035F8E4CF8E3229F436FC04C1689436F817 +:104BC000DDCF8C3619F4689437F8D8CF8836B1F237 +:104BD000982F9F7D95549330E0F08336A1F1833771 +:104BE000C1F1833509F063C02801F2E04F0E511C7A +:104BF000F801C080D180692D70E036FC02C06FEFF3 +:104C00007FEFC6010E944C274C01689437F882015F +:104C10000AC00C5F1F4FFFE3F98388248394912C13 +:104C20006501E89437F833FE2DC0522C81149104AD +:104C300071F5552009F468CFB70180E290E00E9439 +:104C400062275A94F6CFF801808189830E5F1F4F47 +:104C5000E4CF2801F2E04F0E511CF801C080D18052 +:104C6000692D70E036FC02C06FEF7FEFC6010E9435 +:104C700057274C018201D5CFB70180E290E00E9416 +:104C800062272A942814190409F0B0F7CECFF60150 +:104C900037FC859137FE81916F01B70190E00E944A +:104CA000622751105A94F1E08F1A9108BFCF8436D1 +:104CB00019F0893609F077C0F80137FE6BC06081C2 +:104CC0007181828193810C5F1F4FF32DFF763F2E00 +:104CD00097FF09C090958095709561957F4F8F4F94 +:104CE0009F4F689437F82AE030E0A5010E94922790 +:104CF000C82ECA188C2C432C36FE0CC0E89440F801 +:104D0000C91440F434FE05C032FC03C0F32DFE7E0E +:104D10004F2E892C44FE95C0FE01EC0DF11D8081C3 +:104D2000803309F087C0242D297E422E842D88707F +:104D3000582E43FC95C040FE8FC09C2C821418F462 +:104D40002C0C922C981844FE91C0B70180E390E09F +:104D50000E94622742FE09C088E790E041FE02C03F +:104D600088E590E0B7010E946227C91408F48AC060 +:104D7000CA94D12C9FEFC91AD90ACA0CDB1CF601C0 +:104D800082916F01B70190E00E946227AC14BD04CC +:104D9000B1F74FCF60817181072E000C880B990B02 +:104DA0000E5F1F4F92CFD32CE894D4F82AE030E066 +:104DB000853739F1232D297FD22E8F3601F148F422 +:104DC0008835A9F0F701868197812B96E2E10C9452 +:104DD0001428803749F08837A9F7D4FE02C06894B8 +:104DE000D2F820E130E00DC06894D4F8F6CF34FE5C +:104DF00003C0822F8660D82E20E132E002C028E076 +:104E000030E0F801D7FE0FC060817181828193810B +:104E10000C5F1F4FA5010E949227C82ECA183D2C77 +:104E2000E89437F867CF6081718190E080E00E5F91 +:104E30001F4FF0CF42FC02C0839478CF83948394B9 +:104E400075CF842D867809F471CFF6CFB70180E253 +:104E500090E00E94622783948214C0F3512C73CF98 +:104E6000522C5818821408F46ECFF8CF842D86780F +:104E700009F47BCF8BE241FE80E247FC8DE2B70173 +:104E800090E071CFB70180E390E00E9462279A948E +:104E90006CCF8FEF9FEF99CFFC0105906150704070 +:104EA0000110D8F7809590958E0F9F1F0895FC01F3 +:104EB0006150704001900110D8F7809590958E0F49 +:104EC0009F1F08950F931F93CF93DF93182F092FE0 +:104ED000EB018B8181FD09C01FEF0FEF812F902F18 +:104EE000DF91CF911F910F91089582FF14C02E8101 +:104EF0003F818C819D81281739073CF4E881F98135 +:104F0000CF0101969983888310838E819F810196BA +:104F10009F838E83E3CFE885F985812F0995892BBF +:104F2000A1F3DACFFA01AA27283051F1203181F11B +:104F3000E8946F936E7F6E5F7F4F8F4F9F4FAF4FA1 +:104F4000B1E03ED0B4E03CD0670F781F891F9A1FB4 +:104F5000A11D680F791F8A1F911DA11D6A0F711D68 +:104F6000811D911DA11D20D009F468943F912AE074 +:104F7000269F11243019305D3193DEF6CF0108955C +:104F8000462F4770405D4193B3E00FD0C9F7F6CF8D +:104F9000462F4F70405D4A3318F0495D31FD405255 +:104FA000419302D0A9F7EACFB4E0A69597958795EB +:104FB00077956795BA95C9F70097610571050895CA +:104FC0009B01AC010A2E0694579547953795279576 +:104FD000BA95C9F7620F731F841F951FA01D08950E +:104FE000B7FF0C9490230E949023821B930B08958B +:104FF0002F923F924F925F926F927F928F929F92E9 +:10500000AF92BF92CF92DF92EF92FF920F931F93D6 +:10501000CF93DF93CDB7DEB7CA1BDB0B0FB6F89487 +:10502000DEBF0FBECDBF09942A88398848885F84C7 +:105030006E847D848C849B84AA84B984C884DF8038 +:10504000EE80FD800C811B81AA81B981CE0FD11D1C +:105050000FB6F894DEBF0FBECDBFED01089513E08B +:10506000C8E3D3E004C0FE010E94A7232196C93300 +:08507000D107C9F7F894FFCF46 +:10507800010000000101573D256400473D256400FB +:10508800463D25640048503D257500FA00000003A0 +:10509800000400004255494C440041545441434BDC +:1050A80000435245415445002401FB0C2A01F70CEA +:1050B8003101000001000000001900640000000038 +:0E50C80000001E164B214C4F41444552000083 :04000003000006C62D :00000001FF diff --git a/Exe/POCKET.MAP b/Exe/POCKET.MAP index 8931a67..cf0c6ac 100644 --- a/Exe/POCKET.MAP +++ b/Exe/POCKET.MAP @@ -32,7 +32,7 @@ Archive member included to satisfy reference by file (symbol) /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_mulsi3.o) ../lib/libarduino.a(WMath.o) (__mulsi3) /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_udivmodqi4.o) - Obj/Building.o (__udivmodqi4) + ../lib/libgamebuino.a(Buttons.o) (__udivmodqi4) /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_udivmodhi4.o) ../lib/libgamebuino.a(Gamebuino.o) (__udivmodhi4) /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_divmodhi4.o) @@ -231,6 +231,8 @@ Discarded input sections 0x0000000000000000 0x1c Obj/System.o .text.SystemArrayCompare 0x0000000000000000 0x34 Obj/System.o + .text.SystemCollisionCheck + 0x0000000000000000 0x94 Obj/System.o .group 0x0000000000000000 0x8 Obj/Gfx.o .text 0x0000000000000000 0x0 Obj/Gfx.o .data 0x0000000000000000 0x0 Obj/Gfx.o @@ -241,26 +243,31 @@ Discarded input sections 0x0000000000000000 0x8 Obj/Gfx.o .text.GfxRenderTiles 0x0000000000000000 0xbe Obj/Gfx.o - .text.GfxPrintText - 0x0000000000000000 0xc Obj/Gfx.o + .text.GfxDrawLine + 0x0000000000000000 0x38 Obj/Gfx.o .text 0x0000000000000000 0x0 Obj/Pad.o .data 0x0000000000000000 0x0 Obj/Pad.o .bss 0x0000000000000000 0x0 Obj/Pad.o .text 0x0000000000000000 0x0 Obj/Player.o .data 0x0000000000000000 0x0 Obj/Player.o .bss 0x0000000000000000 0x0 Obj/Player.o + .text._ZN6Player24checkNewBuildingPositionEP16t_CollisionBlock + 0x0000000000000000 0x106 Obj/Player.o + .text._ZN6Player19ButtonRightReleasedEv + 0x0000000000000000 0x4 Obj/Player.o + .bss._ZZN6Player24checkNewBuildingPositionEP16t_CollisionBlockE9max_tries + 0x0000000000000000 0x1 Obj/Player.o .text 0x0000000000000000 0x0 Obj/Camera.o .data 0x0000000000000000 0x0 Obj/Camera.o .bss 0x0000000000000000 0x0 Obj/Camera.o .text 0x0000000000000000 0x0 Obj/Unit.o .data 0x0000000000000000 0x0 Obj/Unit.o .bss 0x0000000000000000 0x0 Obj/Unit.o + .text.UnitAcceptAction + 0x0000000000000000 0x2 Obj/Unit.o .text 0x0000000000000000 0x0 Obj/Menu.o .data 0x0000000000000000 0x0 Obj/Menu.o .bss 0x0000000000000000 0x0 Obj/Menu.o - .text 0x0000000000000000 0x0 Obj/Building.o - .data 0x0000000000000000 0x0 Obj/Building.o - .bss 0x0000000000000000 0x0 Obj/Building.o .text 0x0000000000000000 0x0 ../lib/libgamebuino.a(Buttons.o) .data 0x0000000000000000 0x0 ../lib/libgamebuino.a(Buttons.o) .bss 0x0000000000000000 0x0 ../lib/libgamebuino.a(Buttons.o) @@ -1188,7 +1195,6 @@ LOAD Obj/Player.o LOAD Obj/Camera.o LOAD Obj/Unit.o LOAD Obj/Menu.o -LOAD Obj/Building.o LOAD ../lib/libgamebuino.a LOAD ../lib/libarduino.a LOAD /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a @@ -1297,7 +1303,7 @@ END GROUP .rela.plt *(.rela.plt) -.text 0x0000000000000000 0x5172 +.text 0x0000000000000000 0x5078 *(.vectors) .vectors 0x0000000000000000 0x68 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/crtatmega328p.o 0x0000000000000000 __vectors @@ -1327,28 +1333,28 @@ END GROUP 0x0000000000000091 0x17 Obj/Player.o .progmem.data._ZZN6Player4InitEvE3__c 0x00000000000000a8 0x1b Obj/Player.o - .progmem.data.Peasant_SprData - 0x00000000000000c3 0xa Obj/Unit.o - 0x00000000000000c3 Peasant_SprData - .progmem.data.Peasant_Walking_SprData - 0x00000000000000cd 0xa Obj/Unit.o - 0x00000000000000cd Peasant_Walking_SprData - .progmem.data._ZL15MainMenuOptions - 0x00000000000000d7 0x8 Obj/Menu.o - .progmem.data._ZL16MainMenuOption_3 - 0x00000000000000df 0x5 Obj/Menu.o - .progmem.data._ZL16MainMenuOption_2 - 0x00000000000000e4 0x8 Obj/Menu.o - .progmem.data._ZL16MainMenuOption_1 - 0x00000000000000ec 0x11 Obj/Menu.o - .progmem.data._ZL16MainMenuOption_0 - 0x00000000000000fd 0x13 Obj/Menu.o .progmem.data.BarracksShadowSpr_Data - 0x0000000000000110 0x4a Obj/Building.o - 0x0000000000000110 BarracksShadowSpr_Data + 0x00000000000000c3 0x4a Obj/Unit.o + 0x00000000000000c3 BarracksShadowSpr_Data .progmem.data.BarracksSpr_Data - 0x000000000000015a 0x4a Obj/Building.o - 0x000000000000015a BarracksSpr_Data + 0x000000000000010d 0x4a Obj/Unit.o + 0x000000000000010d BarracksSpr_Data + .progmem.data.Peasant_SprData + 0x0000000000000157 0xa Obj/Unit.o + 0x0000000000000157 Peasant_SprData + .progmem.data.Peasant_Walking_SprData + 0x0000000000000161 0xa Obj/Unit.o + 0x0000000000000161 Peasant_Walking_SprData + .progmem.data._ZL15MainMenuOptions + 0x000000000000016b 0x8 Obj/Menu.o + .progmem.data._ZL16MainMenuOption_3 + 0x0000000000000173 0x5 Obj/Menu.o + .progmem.data._ZL16MainMenuOption_2 + 0x0000000000000178 0x8 Obj/Menu.o + .progmem.data._ZL16MainMenuOption_1 + 0x0000000000000180 0x11 Obj/Menu.o + .progmem.data._ZL16MainMenuOption_0 + 0x0000000000000191 0x13 Obj/Menu.o .progmem.data.font3x3 0x00000000000001a4 0x182 ../lib/libgamebuino.a(font3x3.o) 0x00000000000001a4 font3x3 @@ -1510,557 +1516,553 @@ END GROUP .text.SystemInit 0x000000000000088c 0x2e Obj/System.o 0x000000000000088c SystemInit - .text.SystemCollisionCheck - 0x00000000000008ba 0x94 Obj/System.o - 0x00000000000008ba SystemCollisionCheck .text._ZL21GfxIsInsideScreenAreaaahh - 0x000000000000094e 0x2a Obj/Gfx.o + 0x00000000000008ba 0x2a Obj/Gfx.o .text._ZN7Display9drawPixelEaa - 0x0000000000000978 0x8e Obj/Gfx.o - 0x0000000000000978 _ZN7Display9drawPixelEaa - .text.GfxInit 0x0000000000000a06 0x10 Obj/Gfx.o - 0x0000000000000a06 GfxInit + 0x00000000000008e4 0x8e Obj/Gfx.o + 0x00000000000008e4 _ZN7Display9drawPixelEaa + .text.GfxInit 0x0000000000000972 0x10 Obj/Gfx.o + 0x0000000000000972 GfxInit .text.GfxRefreshNeeded - 0x0000000000000a16 0x14 Obj/Gfx.o - 0x0000000000000a16 GfxRefreshNeeded + 0x0000000000000982 0x14 Obj/Gfx.o + 0x0000000000000982 GfxRefreshNeeded .text.GfxIsSpriteInsideScreenArea - 0x0000000000000a2a 0xe Obj/Gfx.o - 0x0000000000000a2a GfxIsSpriteInsideScreenArea + 0x0000000000000996 0xe Obj/Gfx.o + 0x0000000000000996 GfxIsSpriteInsideScreenArea .text.GfxDrawSprite - 0x0000000000000a38 0x58 Obj/Gfx.o - 0x0000000000000a38 GfxDrawSprite + 0x00000000000009a4 0x58 Obj/Gfx.o + 0x00000000000009a4 GfxDrawSprite .text.GfxGetWidthFromSpriteData - 0x0000000000000a90 0x6 Obj/Gfx.o - 0x0000000000000a90 GfxGetWidthFromSpriteData + 0x00000000000009fc 0x6 Obj/Gfx.o + 0x00000000000009fc GfxGetWidthFromSpriteData .text.GfxGetHeightFromSpriteData - 0x0000000000000a96 0x8 Obj/Gfx.o - 0x0000000000000a96 GfxGetHeightFromSpriteData + 0x0000000000000a02 0x8 Obj/Gfx.o + 0x0000000000000a02 GfxGetHeightFromSpriteData .text.GfxPrintText_Flash - 0x0000000000000a9e 0xc Obj/Gfx.o - 0x0000000000000a9e GfxPrintText_Flash + 0x0000000000000a0a 0xc Obj/Gfx.o + 0x0000000000000a0a GfxPrintText_Flash .text.GfxPrintTextFont - 0x0000000000000aaa 0x5a Obj/Gfx.o - 0x0000000000000aaa GfxPrintTextFont + 0x0000000000000a16 0x5a Obj/Gfx.o + 0x0000000000000a16 GfxPrintTextFont + .text.GfxPrintText + 0x0000000000000a70 0xc Obj/Gfx.o + 0x0000000000000a70 GfxPrintText .text.GfxDrawCircle - 0x0000000000000b04 0x58 Obj/Gfx.o - 0x0000000000000b04 GfxDrawCircle + 0x0000000000000a7c 0x58 Obj/Gfx.o + 0x0000000000000a7c GfxDrawCircle .text.GfxDrawRectangle - 0x0000000000000b5c 0x5e Obj/Gfx.o - 0x0000000000000b5c GfxDrawRectangle + 0x0000000000000ad4 0x5e Obj/Gfx.o + 0x0000000000000ad4 GfxDrawRectangle .text.GfxFillRectangle - 0x0000000000000bba 0x5e Obj/Gfx.o - 0x0000000000000bba GfxFillRectangle + 0x0000000000000b32 0x5e Obj/Gfx.o + 0x0000000000000b32 GfxFillRectangle .text.GfxShowResources - 0x0000000000000c18 0xe8 Obj/Gfx.o - 0x0000000000000c18 GfxShowResources + 0x0000000000000b90 0xe8 Obj/Gfx.o + 0x0000000000000b90 GfxShowResources .text.PadButtonReleased - 0x0000000000000d00 0x16 Obj/Pad.o - 0x0000000000000d00 PadButtonReleased + 0x0000000000000c78 0x16 Obj/Pad.o + 0x0000000000000c78 PadButtonReleased .text.PadButtonPressedFrames - 0x0000000000000d16 0x1c Obj/Pad.o - 0x0000000000000d16 PadButtonPressedFrames + 0x0000000000000c8e 0x1c Obj/Pad.o + 0x0000000000000c8e PadButtonPressedFrames .text.PadButtonPressed - 0x0000000000000d32 0x6 Obj/Pad.o - 0x0000000000000d32 PadButtonPressed + 0x0000000000000caa 0x6 Obj/Pad.o + 0x0000000000000caa PadButtonPressed .text.PadDirectionKeyPressed - 0x0000000000000d38 0x30 Obj/Pad.o - 0x0000000000000d38 PadDirectionKeyPressed + 0x0000000000000cb0 0x30 Obj/Pad.o + 0x0000000000000cb0 PadDirectionKeyPressed .text.PadAnyKeyPressed - 0x0000000000000d68 0x20 Obj/Pad.o - 0x0000000000000d68 PadAnyKeyPressed + 0x0000000000000ce0 0x20 Obj/Pad.o + 0x0000000000000ce0 PadAnyKeyPressed .text._ZN6PlayerC2Ev - 0x0000000000000d88 0x2 Obj/Player.o - 0x0000000000000d88 _ZN6PlayerC2Ev - 0x0000000000000d88 _ZN6PlayerC1Ev + 0x0000000000000d00 0x2 Obj/Player.o + 0x0000000000000d00 _ZN6PlayerC2Ev + 0x0000000000000d00 _ZN6PlayerC1Ev .text._ZN6PlayerD2Ev - 0x0000000000000d8a 0x2 Obj/Player.o - 0x0000000000000d8a _ZN6PlayerD2Ev - 0x0000000000000d8a _ZN6PlayerD1Ev + 0x0000000000000d02 0x2 Obj/Player.o + 0x0000000000000d02 _ZN6PlayerD2Ev + 0x0000000000000d02 _ZN6PlayerD1Ev .text._ZN6Player10showHealthEh - 0x0000000000000d8c 0x76 Obj/Player.o - 0x0000000000000d8c _ZN6Player10showHealthEh + 0x0000000000000d04 0x76 Obj/Player.o + 0x0000000000000d04 _ZN6Player10showHealthEh .text._ZN6Player11DrawHandlerEv - 0x0000000000000e02 0x128 Obj/Player.o - 0x0000000000000e02 _ZN6Player11DrawHandlerEv - .text._ZN6Player24checkNewBuildingPositionEP16t_CollisionBlock - 0x0000000000000f2a 0x10e Obj/Player.o - 0x0000000000000f2a _ZN6Player24checkNewBuildingPositionEP16t_CollisionBlock - .text._ZN6Player14createBuildingEh16t_CollisionBlock - 0x0000000000001038 0xea Obj/Player.o - 0x0000000000001038 _ZN6Player14createBuildingEh16t_CollisionBlock - .text._ZN6Player10createUnitEh16t_CollisionBlock - 0x0000000000001122 0xa2 Obj/Player.o - 0x0000000000001122 _ZN6Player10createUnitEh16t_CollisionBlock + 0x0000000000000d7a 0xcc Obj/Player.o + 0x0000000000000d7a _ZN6Player11DrawHandlerEv + .text._ZN6Player10createUnitE8t_unitid16t_CollisionBlock + 0x0000000000000e46 0xba Obj/Player.o + 0x0000000000000e46 _ZN6Player10createUnitE8t_unitid16t_CollisionBlock .text._ZN6Player4InitEv - 0x00000000000011c4 0x178 Obj/Player.o - 0x00000000000011c4 _ZN6Player4InitEv + 0x0000000000000f00 0x15e Obj/Player.o + 0x0000000000000f00 _ZN6Player4InitEv .text._ZN6Player12GetCursorPosEv - 0x000000000000133c 0x58 Obj/Player.o - 0x000000000000133c _ZN6Player12GetCursorPosEv + 0x000000000000105e 0x58 Obj/Player.o + 0x000000000000105e _ZN6Player12GetCursorPosEv .text._ZN6Player21UnitBuildingSelectionEv - 0x0000000000001394 0x268 Obj/Player.o - 0x0000000000001394 _ZN6Player21UnitBuildingSelectionEv - .text._ZN6Player19BuildingUnitActionsEv - 0x00000000000015fc 0x7c Obj/Player.o - 0x00000000000015fc _ZN6Player19BuildingUnitActionsEv + 0x00000000000010b6 0x114 Obj/Player.o + 0x00000000000010b6 _ZN6Player21UnitBuildingSelectionEv + .text._ZN6Player14ButtonAPressedEv + 0x00000000000011ca 0x22 Obj/Player.o + 0x00000000000011ca _ZN6Player14ButtonAPressedEv + .text._ZN6Player15ButtonAReleasedEv + 0x00000000000011ec 0x18c Obj/Player.o + 0x00000000000011ec _ZN6Player15ButtonAReleasedEv + .text._ZN6Player14ButtonBPressedEv + 0x0000000000001378 0x52 Obj/Player.o + 0x0000000000001378 _ZN6Player14ButtonBPressedEv + .text._ZN6Player15ButtonBReleasedEv + 0x00000000000013ca 0x90 Obj/Player.o + 0x00000000000013ca _ZN6Player15ButtonBReleasedEv + .text._ZN6Player18ButtonLeftReleasedEv + 0x000000000000145a 0x120 Obj/Player.o + 0x000000000000145a _ZN6Player18ButtonLeftReleasedEv + .text._ZN6Player28IncreaseShowActionsMenuIndexEv + 0x000000000000157a 0x120 Obj/Player.o + 0x000000000000157a _ZN6Player28IncreaseShowActionsMenuIndexEv + .text._ZN6Player11ActionsMenuEv + 0x000000000000169a 0x86 Obj/Player.o + 0x000000000000169a _ZN6Player11ActionsMenuEv .text._ZN6Player13ButtonHandlerEv - 0x0000000000001678 0x1e8 Obj/Player.o - 0x0000000000001678 _ZN6Player13ButtonHandlerEv + 0x0000000000001720 0x90 Obj/Player.o + 0x0000000000001720 _ZN6Player13ButtonHandlerEv .text._ZN6Player7HandlerEv - 0x0000000000001860 0x5c Obj/Player.o - 0x0000000000001860 _ZN6Player7HandlerEv + 0x00000000000017b0 0x6c Obj/Player.o + 0x00000000000017b0 _ZN6Player7HandlerEv .text.CameraInit - 0x00000000000018bc 0x14 Obj/Camera.o - 0x00000000000018bc CameraInit + 0x000000000000181c 0x16 Obj/Camera.o + 0x000000000000181c CameraInit .text.CameraApplyCoordinatesToCoordinates - 0x00000000000018d0 0x66 Obj/Camera.o - 0x00000000000018d0 CameraApplyCoordinatesToCoordinates + 0x0000000000001832 0x66 Obj/Camera.o + 0x0000000000001832 CameraApplyCoordinatesToCoordinates .text.CameraApplyCoordinatesToSprite - 0x0000000000001936 0x14 Obj/Camera.o - 0x0000000000001936 CameraApplyCoordinatesToSprite + 0x0000000000001898 0x14 Obj/Camera.o + 0x0000000000001898 CameraApplyCoordinatesToSprite .text.CameraHandler - 0x000000000000194a 0x132 Obj/Camera.o - 0x000000000000194a CameraHandler - .text.UnitBuildAccept - 0x0000000000001a7c 0x2 Obj/Unit.o + 0x00000000000018ac 0x13c Obj/Camera.o + 0x00000000000018ac CameraHandler + .text.CameraSetLock + 0x00000000000019e8 0x6 Obj/Camera.o + 0x00000000000019e8 CameraSetLock + .text.UnitAttackAccepted + 0x00000000000019ee 0x8 Obj/Unit.o + .text.UnitBuildAccepted + 0x00000000000019f6 0x2 Obj/Unit.o .text.UnitInit - 0x0000000000001a7e 0x54 Obj/Unit.o - 0x0000000000001a7e UnitInit + 0x00000000000019f8 0xa8 Obj/Unit.o + 0x00000000000019f8 UnitInit .text.UnitGetWidthFromID - 0x0000000000001ad2 0xc Obj/Unit.o - 0x0000000000001ad2 UnitGetWidthFromID - .text.UnitDraw - 0x0000000000001ade 0x146 Obj/Unit.o - 0x0000000000001ade UnitDraw + 0x0000000000001aa0 0x14 Obj/Unit.o + 0x0000000000001aa0 UnitGetWidthFromID .text.UnitGetHeightFromID - 0x0000000000001c24 0xc Obj/Unit.o - 0x0000000000001c24 UnitGetHeightFromID + 0x0000000000001ab4 0x14 Obj/Unit.o + 0x0000000000001ab4 UnitGetHeightFromID + .text.UnitDraw + 0x0000000000001ac8 0x23c Obj/Unit.o + 0x0000000000001ac8 UnitDraw .text.UnitGetHpFromID - 0x0000000000001c30 0x4 Obj/Unit.o - 0x0000000000001c30 UnitGetHpFromID + 0x0000000000001d04 0xc Obj/Unit.o + 0x0000000000001d04 UnitGetHpFromID .text.UnitMoveTo - 0x0000000000001c34 0x10 Obj/Unit.o - 0x0000000000001c34 UnitMoveTo + 0x0000000000001d10 0x10 Obj/Unit.o + 0x0000000000001d10 UnitMoveTo .text.UnitHandler - 0x0000000000001c44 0x78 Obj/Unit.o - 0x0000000000001c44 UnitHandler - .text.UnitSelectedOptions - 0x0000000000001cbc 0x3e Obj/Unit.o - 0x0000000000001cbc UnitSelectedOptions - .text.UnitAcceptAction - 0x0000000000001cfa 0x4e Obj/Unit.o - 0x0000000000001cfa UnitAcceptAction - .text.UnitResetMenuLevel - 0x0000000000001d48 0x6 Obj/Unit.o - 0x0000000000001d48 UnitResetMenuLevel + 0x0000000000001d20 0x8c Obj/Unit.o + 0x0000000000001d20 UnitHandler + .text.UnitGetAvailableActions + 0x0000000000001dac 0x10 Obj/Unit.o + 0x0000000000001dac UnitGetAvailableActions + .text.UnitGetActionString + 0x0000000000001dbc 0x14 Obj/Unit.o + 0x0000000000001dbc UnitGetActionString .text._Z17MenuGetPlayerNameP6Player - 0x0000000000001d4e 0x14 Obj/Menu.o - 0x0000000000001d4e _Z17MenuGetPlayerNameP6Player + 0x0000000000001dd0 0x18 Obj/Menu.o + 0x0000000000001dd0 _Z17MenuGetPlayerNameP6Player .text._Z8MainMenuv - 0x0000000000001d62 0x20 Obj/Menu.o - 0x0000000000001d62 _Z8MainMenuv - .text.BuildingInit - 0x0000000000001d82 0x52 Obj/Building.o - 0x0000000000001d82 BuildingInit - .text.BuildingGetHpFromID - 0x0000000000001dd4 0x4 Obj/Building.o - 0x0000000000001dd4 BuildingGetHpFromID - .text.BuildingSelectedOptions - 0x0000000000001dd8 0x2 Obj/Building.o - 0x0000000000001dd8 BuildingSelectedOptions - .text.BuildingGetWidthFromID - 0x0000000000001dda 0xc Obj/Building.o - 0x0000000000001dda BuildingGetWidthFromID - .text.BuildingGetHeightFromID - 0x0000000000001de6 0xc Obj/Building.o - 0x0000000000001de6 BuildingGetHeightFromID - .text.BuildingDraw - 0x0000000000001df2 0x110 Obj/Building.o - 0x0000000000001df2 BuildingDraw + 0x0000000000001de8 0x20 Obj/Menu.o + 0x0000000000001de8 _Z8MainMenuv .text._ZN7Buttons5beginEv - 0x0000000000001f02 0x20 ../lib/libgamebuino.a(Buttons.o) - 0x0000000000001f02 _ZN7Buttons5beginEv + 0x0000000000001e08 0x20 ../lib/libgamebuino.a(Buttons.o) + 0x0000000000001e08 _ZN7Buttons5beginEv .text._ZN7Buttons6updateEv - 0x0000000000001f22 0x5a ../lib/libgamebuino.a(Buttons.o) - 0x0000000000001f22 _ZN7Buttons6updateEv + 0x0000000000001e28 0x5a ../lib/libgamebuino.a(Buttons.o) + 0x0000000000001e28 _ZN7Buttons6updateEv .text._ZN7Buttons7pressedEh - 0x0000000000001f7c 0x12 ../lib/libgamebuino.a(Buttons.o) - 0x0000000000001f7c _ZN7Buttons7pressedEh + 0x0000000000001e82 0x12 ../lib/libgamebuino.a(Buttons.o) + 0x0000000000001e82 _ZN7Buttons7pressedEh .text._ZN7Buttons8releasedEh - 0x0000000000001f8e 0x12 ../lib/libgamebuino.a(Buttons.o) - 0x0000000000001f8e _ZN7Buttons8releasedEh + 0x0000000000001e94 0x12 ../lib/libgamebuino.a(Buttons.o) + 0x0000000000001e94 _ZN7Buttons8releasedEh .text._ZN7Buttons6repeatEhh - 0x0000000000001fa0 0x2c ../lib/libgamebuino.a(Buttons.o) - 0x0000000000001fa0 _ZN7Buttons6repeatEhh + 0x0000000000001ea6 0x2c ../lib/libgamebuino.a(Buttons.o) + 0x0000000000001ea6 _ZN7Buttons6repeatEhh .text._ZN7Buttons8timeHeldEh - 0x0000000000001fcc 0x10 ../lib/libgamebuino.a(Buttons.o) - 0x0000000000001fcc _ZN7Buttons8timeHeldEh + 0x0000000000001ed2 0x10 ../lib/libgamebuino.a(Buttons.o) + 0x0000000000001ed2 _ZN7Buttons8timeHeldEh .text._ZN8SPIClass8transferEh - 0x0000000000001fdc 0xc ../lib/libgamebuino.a(Display.o) - 0x0000000000001fdc _ZN8SPIClass8transferEh + 0x0000000000001ee2 0xc ../lib/libgamebuino.a(Display.o) + 0x0000000000001ee2 _ZN8SPIClass8transferEh .text._ZN7Display7commandEh - 0x0000000000001fe8 0x3c ../lib/libgamebuino.a(Display.o) - 0x0000000000001fe8 _ZN7Display7commandEh + 0x0000000000001eee 0x3c ../lib/libgamebuino.a(Display.o) + 0x0000000000001eee _ZN7Display7commandEh .text._ZN7Display5clearEv - 0x0000000000002024 0x22 ../lib/libgamebuino.a(Display.o) - 0x0000000000002024 _ZN7Display5clearEv + 0x0000000000001f2a 0x22 ../lib/libgamebuino.a(Display.o) + 0x0000000000001f2a _ZN7Display5clearEv .text._ZN7Display6updateEv - 0x0000000000002046 0x8a ../lib/libgamebuino.a(Display.o) - 0x0000000000002046 _ZN7Display6updateEv + 0x0000000000001f4c 0x8a ../lib/libgamebuino.a(Display.o) + 0x0000000000001f4c _ZN7Display6updateEv .text._ZN7Display8setColorEa - 0x00000000000020d0 0x8 ../lib/libgamebuino.a(Display.o) - 0x00000000000020d0 _ZN7Display8setColorEa + 0x0000000000001fd6 0x8 ../lib/libgamebuino.a(Display.o) + 0x0000000000001fd6 _ZN7Display8setColorEa .text._ZN7Display8setColorEaa - 0x00000000000020d8 0x8 ../lib/libgamebuino.a(Display.o) - 0x00000000000020d8 _ZN7Display8setColorEaa + 0x0000000000001fde 0x8 ../lib/libgamebuino.a(Display.o) + 0x0000000000001fde _ZN7Display8setColorEaa .text._ZN7Display13drawFastVLineEaaa - 0x00000000000020e0 0x38 ../lib/libgamebuino.a(Display.o) - 0x00000000000020e0 _ZN7Display13drawFastVLineEaaa + 0x0000000000001fe6 0x38 ../lib/libgamebuino.a(Display.o) + 0x0000000000001fe6 _ZN7Display13drawFastVLineEaaa .text._ZN7Display13drawFastHLineEaaa - 0x0000000000002118 0x38 ../lib/libgamebuino.a(Display.o) - 0x0000000000002118 _ZN7Display13drawFastHLineEaaa + 0x000000000000201e 0x38 ../lib/libgamebuino.a(Display.o) + 0x000000000000201e _ZN7Display13drawFastHLineEaaa .text._ZN7Display8drawRectEaaaa - 0x0000000000002150 0x50 ../lib/libgamebuino.a(Display.o) - 0x0000000000002150 _ZN7Display8drawRectEaaaa + 0x0000000000002056 0x50 ../lib/libgamebuino.a(Display.o) + 0x0000000000002056 _ZN7Display8drawRectEaaaa .text._ZN7Display8fillRectEaaaa - 0x00000000000021a0 0x52 ../lib/libgamebuino.a(Display.o) - 0x00000000000021a0 _ZN7Display8fillRectEaaaa + 0x00000000000020a6 0x52 ../lib/libgamebuino.a(Display.o) + 0x00000000000020a6 _ZN7Display8fillRectEaaaa .text._ZN7Display10drawCircleEaaa - 0x00000000000021f2 0x100 ../lib/libgamebuino.a(Display.o) - 0x00000000000021f2 _ZN7Display10drawCircleEaaa + 0x00000000000020f8 0x100 ../lib/libgamebuino.a(Display.o) + 0x00000000000020f8 _ZN7Display10drawCircleEaaa .text._ZN7Display16drawCircleHelperEaaah - 0x00000000000022f2 0xfc ../lib/libgamebuino.a(Display.o) - 0x00000000000022f2 _ZN7Display16drawCircleHelperEaaah + 0x00000000000021f8 0xfc ../lib/libgamebuino.a(Display.o) + 0x00000000000021f8 _ZN7Display16drawCircleHelperEaaah .text._ZN7Display16fillCircleHelperEaaaha - 0x00000000000023ee 0xca ../lib/libgamebuino.a(Display.o) - 0x00000000000023ee _ZN7Display16fillCircleHelperEaaaha + 0x00000000000022f4 0xca ../lib/libgamebuino.a(Display.o) + 0x00000000000022f4 _ZN7Display16fillCircleHelperEaaaha .text._ZN7Display13drawRoundRectEaaaaa - 0x00000000000024b8 0xbe ../lib/libgamebuino.a(Display.o) - 0x00000000000024b8 _ZN7Display13drawRoundRectEaaaaa + 0x00000000000023be 0xbe ../lib/libgamebuino.a(Display.o) + 0x00000000000023be _ZN7Display13drawRoundRectEaaaaa .text._ZN7Display13fillRoundRectEaaaaa - 0x0000000000002576 0x6e ../lib/libgamebuino.a(Display.o) - 0x0000000000002576 _ZN7Display13fillRoundRectEaaaaa + 0x000000000000247c 0x6e ../lib/libgamebuino.a(Display.o) + 0x000000000000247c _ZN7Display13fillRoundRectEaaaaa .text._ZN7Display10drawBitmapEaaPKh - 0x00000000000025e4 0x280 ../lib/libgamebuino.a(Display.o) - 0x00000000000025e4 _ZN7Display10drawBitmapEaaPKh + 0x00000000000024ea 0x280 ../lib/libgamebuino.a(Display.o) + 0x00000000000024ea _ZN7Display10drawBitmapEaaPKh .text._ZN7Display10drawBitmapEaaPKhhh - 0x0000000000002864 0x1ce ../lib/libgamebuino.a(Display.o) - 0x0000000000002864 _ZN7Display10drawBitmapEaaPKhhh + 0x000000000000276a 0x1ce ../lib/libgamebuino.a(Display.o) + 0x000000000000276a _ZN7Display10drawBitmapEaaPKhhh .text._ZN7Display7setFontEPKh - 0x0000000000002a32 0x28 ../lib/libgamebuino.a(Display.o) - 0x0000000000002a32 _ZN7Display7setFontEPKh + 0x0000000000002938 0x28 ../lib/libgamebuino.a(Display.o) + 0x0000000000002938 _ZN7Display7setFontEPKh .text._ZN7Display5beginEaaaaa - 0x0000000000002a5a 0x180 ../lib/libgamebuino.a(Display.o) - 0x0000000000002a5a _ZN7Display5beginEaaaaa + 0x0000000000002960 0x180 ../lib/libgamebuino.a(Display.o) + 0x0000000000002960 _ZN7Display5beginEaaaaa .text._ZN7Display8drawCharEaahh - 0x0000000000002bda 0x15c ../lib/libgamebuino.a(Display.o) - 0x0000000000002bda _ZN7Display8drawCharEaahh + 0x0000000000002ae0 0x15c ../lib/libgamebuino.a(Display.o) + 0x0000000000002ae0 _ZN7Display8drawCharEaahh .text._ZN7Display5writeEh - 0x0000000000002d36 0x66 ../lib/libgamebuino.a(Display.o) - 0x0000000000002d36 _ZN7Display5writeEh + 0x0000000000002c3c 0x66 ../lib/libgamebuino.a(Display.o) + 0x0000000000002c3c _ZN7Display5writeEh .text._ZN9Gamebuino5popupEPK19__FlashStringHelperh - 0x0000000000002d9c 0x16 ../lib/libgamebuino.a(Gamebuino.o) - 0x0000000000002d9c _ZN9Gamebuino5popupEPK19__FlashStringHelperh + 0x0000000000002ca2 0x16 ../lib/libgamebuino.a(Gamebuino.o) + 0x0000000000002ca2 _ZN9Gamebuino5popupEPK19__FlashStringHelperh .text._ZN9Gamebuino11updatePopupEv - 0x0000000000002db2 0xda ../lib/libgamebuino.a(Gamebuino.o) - 0x0000000000002db2 _ZN9Gamebuino11updatePopupEv + 0x0000000000002cb8 0xda ../lib/libgamebuino.a(Gamebuino.o) + 0x0000000000002cb8 _ZN9Gamebuino11updatePopupEv .text._ZN9Gamebuino14displayBatteryEv - 0x0000000000002e8c 0x160 ../lib/libgamebuino.a(Gamebuino.o) - 0x0000000000002e8c _ZN9Gamebuino14displayBatteryEv + 0x0000000000002d92 0x160 ../lib/libgamebuino.a(Gamebuino.o) + 0x0000000000002d92 _ZN9Gamebuino14displayBatteryEv .text._ZN9Gamebuino6updateEv - 0x0000000000002fec 0x170 ../lib/libgamebuino.a(Gamebuino.o) - 0x0000000000002fec _ZN9Gamebuino6updateEv + 0x0000000000002ef2 0x170 ../lib/libgamebuino.a(Gamebuino.o) + 0x0000000000002ef2 _ZN9Gamebuino6updateEv .text._ZN9Gamebuino4menuEPKPKch - 0x000000000000315c 0x2a0 ../lib/libgamebuino.a(Gamebuino.o) - 0x000000000000315c _ZN9Gamebuino4menuEPKPKch + 0x0000000000003062 0x2a0 ../lib/libgamebuino.a(Gamebuino.o) + 0x0000000000003062 _ZN9Gamebuino4menuEPKPKch .text._ZN9Gamebuino10changeGameEv - 0x00000000000033fc 0x7a ../lib/libgamebuino.a(Gamebuino.o) - 0x00000000000033fc _ZN9Gamebuino10changeGameEv + 0x0000000000003302 0x7a ../lib/libgamebuino.a(Gamebuino.o) + 0x0000000000003302 _ZN9Gamebuino10changeGameEv .text._ZN9Gamebuino11titleScreenEPK19__FlashStringHelperPKh - 0x0000000000003476 0x270 ../lib/libgamebuino.a(Gamebuino.o) - 0x0000000000003476 _ZN9Gamebuino11titleScreenEPK19__FlashStringHelperPKh + 0x000000000000337c 0x270 ../lib/libgamebuino.a(Gamebuino.o) + 0x000000000000337c _ZN9Gamebuino11titleScreenEPK19__FlashStringHelperPKh .text._ZN9Gamebuino11titleScreenEPK19__FlashStringHelper - 0x00000000000036e6 0x8 ../lib/libgamebuino.a(Gamebuino.o) - 0x00000000000036e6 _ZN9Gamebuino11titleScreenEPK19__FlashStringHelper + 0x00000000000035ec 0x8 ../lib/libgamebuino.a(Gamebuino.o) + 0x00000000000035ec _ZN9Gamebuino11titleScreenEPK19__FlashStringHelper .text._ZN9Gamebuino17settingsAvailableEv - 0x00000000000036ee 0x14 ../lib/libgamebuino.a(Gamebuino.o) - 0x00000000000036ee _ZN9Gamebuino17settingsAvailableEv + 0x00000000000035f4 0x14 ../lib/libgamebuino.a(Gamebuino.o) + 0x00000000000035f4 _ZN9Gamebuino17settingsAvailableEv .text._ZN9Gamebuino12readSettingsEv - 0x0000000000003702 0xde ../lib/libgamebuino.a(Gamebuino.o) - 0x0000000000003702 _ZN9Gamebuino12readSettingsEv + 0x0000000000003608 0xde ../lib/libgamebuino.a(Gamebuino.o) + 0x0000000000003608 _ZN9Gamebuino12readSettingsEv .text._ZN9Gamebuino5beginEv - 0x00000000000037e0 0xb6 ../lib/libgamebuino.a(Gamebuino.o) - 0x00000000000037e0 _ZN9Gamebuino5beginEv + 0x00000000000036e6 0xb6 ../lib/libgamebuino.a(Gamebuino.o) + 0x00000000000036e6 _ZN9Gamebuino5beginEv .text._ZN9Gamebuino14getDefaultNameEPc - 0x0000000000003896 0x2c ../lib/libgamebuino.a(Gamebuino.o) - 0x0000000000003896 _ZN9Gamebuino14getDefaultNameEPc + 0x000000000000379c 0x2c ../lib/libgamebuino.a(Gamebuino.o) + 0x000000000000379c _ZN9Gamebuino14getDefaultNameEPc .text._ZN5Sound7commandEhhah.part.0 - 0x00000000000038c2 0x66 ../lib/libgamebuino.a(Sound.o) + 0x00000000000037c8 0x66 ../lib/libgamebuino.a(Sound.o) .text._ZN5Sound5beginEv - 0x0000000000003928 0x68 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003928 _ZN5Sound5beginEv + 0x000000000000382e 0x68 ../lib/libgamebuino.a(Sound.o) + 0x000000000000382e _ZN5Sound5beginEv .text._ZN5Sound7commandEhhah - 0x0000000000003990 0x5e ../lib/libgamebuino.a(Sound.o) - 0x0000000000003990 _ZN5Sound7commandEhhah + 0x0000000000003896 0x5e ../lib/libgamebuino.a(Sound.o) + 0x0000000000003896 _ZN5Sound7commandEhhah .text._ZN5Sound12updateOutputEv - 0x00000000000039ee 0x16 ../lib/libgamebuino.a(Sound.o) - 0x00000000000039ee _ZN5Sound12updateOutputEv + 0x00000000000038f4 0x16 ../lib/libgamebuino.a(Sound.o) + 0x00000000000038f4 _ZN5Sound12updateOutputEv .text._ZN5Sound8stopNoteEh.part.2 - 0x0000000000003a04 0x1c ../lib/libgamebuino.a(Sound.o) + 0x000000000000390a 0x1c ../lib/libgamebuino.a(Sound.o) .text._ZN5Sound11playPatternEPKjh.part.5 - 0x0000000000003a20 0x30 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003926 0x30 ../lib/libgamebuino.a(Sound.o) .text._ZN5Sound11playPatternEPKjh - 0x0000000000003a50 0xa ../lib/libgamebuino.a(Sound.o) - 0x0000000000003a50 _ZN5Sound11playPatternEPKjh + 0x0000000000003956 0xa ../lib/libgamebuino.a(Sound.o) + 0x0000000000003956 _ZN5Sound11playPatternEPKjh .text._ZN5Sound11updateTrackEh - 0x0000000000003a5a 0x5c ../lib/libgamebuino.a(Sound.o) - 0x0000000000003a5a _ZN5Sound11updateTrackEh + 0x0000000000003960 0x5c ../lib/libgamebuino.a(Sound.o) + 0x0000000000003960 _ZN5Sound11updateTrackEh .text._ZN5Sound11updateTrackEv - 0x0000000000003ab6 0x6 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003ab6 _ZN5Sound11updateTrackEv + 0x00000000000039bc 0x6 ../lib/libgamebuino.a(Sound.o) + 0x00000000000039bc _ZN5Sound11updateTrackEv .text._ZN5Sound13updatePatternEh - 0x0000000000003abc 0xe0 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003abc _ZN5Sound13updatePatternEh + 0x00000000000039c2 0xe0 ../lib/libgamebuino.a(Sound.o) + 0x00000000000039c2 _ZN5Sound13updatePatternEh .text._ZN5Sound13updatePatternEv - 0x0000000000003b9c 0x6 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003b9c _ZN5Sound13updatePatternEv + 0x0000000000003aa2 0x6 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003aa2 _ZN5Sound13updatePatternEv .text._ZN5Sound10updateNoteEh - 0x0000000000003ba2 0x182 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003ba2 _ZN5Sound10updateNoteEh + 0x0000000000003aa8 0x182 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003aa8 _ZN5Sound10updateNoteEh .text._ZN5Sound10updateNoteEv - 0x0000000000003d24 0x6 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003d24 _ZN5Sound10updateNoteEv + 0x0000000000003c2a 0x6 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003c2a _ZN5Sound10updateNoteEv .text._ZN5Sound11stopPatternEh - 0x0000000000003d2a 0x16 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003d2a _ZN5Sound11stopPatternEh + 0x0000000000003c30 0x16 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003c30 _ZN5Sound11stopPatternEh .text._ZN5Sound11stopPatternEv - 0x0000000000003d40 0x12 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003d40 _ZN5Sound11stopPatternEv + 0x0000000000003c46 0x12 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003c46 _ZN5Sound11stopPatternEv .text._ZN5Sound14generateOutputEv - 0x0000000000003d52 0x54 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003d52 _ZN5Sound14generateOutputEv + 0x0000000000003c58 0x54 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003c58 _ZN5Sound14generateOutputEv .text.__vector_11 - 0x0000000000003da6 0x48 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003da6 __vector_11 + 0x0000000000003cac 0x48 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003cac __vector_11 .text._ZN5Sound6playOKEv - 0x0000000000003dee 0x8 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003dee _ZN5Sound6playOKEv + 0x0000000000003cf4 0x8 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003cf4 _ZN5Sound6playOKEv .text._ZN5Sound10playCancelEv - 0x0000000000003df6 0x8 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003df6 _ZN5Sound10playCancelEv + 0x0000000000003cfc 0x8 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003cfc _ZN5Sound10playCancelEv .text._ZN5Sound8playTickEv - 0x0000000000003dfe 0x8 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003dfe _ZN5Sound8playTickEv + 0x0000000000003d04 0x8 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003d04 _ZN5Sound8playTickEv .text._ZN5Sound9setVolumeEa - 0x0000000000003e06 0x18 ../lib/libgamebuino.a(Sound.o) - 0x0000000000003e06 _ZN5Sound9setVolumeEa + 0x0000000000003d0c 0x18 ../lib/libgamebuino.a(Sound.o) + 0x0000000000003d0c _ZN5Sound9setVolumeEa .text._ZN9Backlight5beginEv - 0x0000000000003e1e 0x8 ../lib/libgamebuino.a(Backlight.o) - 0x0000000000003e1e _ZN9Backlight5beginEv + 0x0000000000003d24 0x8 ../lib/libgamebuino.a(Backlight.o) + 0x0000000000003d24 _ZN9Backlight5beginEv .text._ZN9Backlight3setEh - 0x0000000000003e26 0x8 ../lib/libgamebuino.a(Backlight.o) - 0x0000000000003e26 _ZN9Backlight3setEh + 0x0000000000003d2c 0x8 ../lib/libgamebuino.a(Backlight.o) + 0x0000000000003d2c _ZN9Backlight3setEh .text._ZN9Backlight6updateEv - 0x0000000000003e2e 0xbe ../lib/libgamebuino.a(Backlight.o) - 0x0000000000003e2e _ZN9Backlight6updateEv + 0x0000000000003d34 0xbe ../lib/libgamebuino.a(Backlight.o) + 0x0000000000003d34 _ZN9Backlight6updateEv .text._ZN7Battery5beginEv - 0x0000000000003eec 0x14 ../lib/libgamebuino.a(Battery.o) - 0x0000000000003eec _ZN7Battery5beginEv + 0x0000000000003df2 0x14 ../lib/libgamebuino.a(Battery.o) + 0x0000000000003df2 _ZN7Battery5beginEv .text._ZN7Battery6updateEv - 0x0000000000003f00 0x70 ../lib/libgamebuino.a(Battery.o) - 0x0000000000003f00 _ZN7Battery6updateEv + 0x0000000000003e06 0x70 ../lib/libgamebuino.a(Battery.o) + 0x0000000000003e06 _ZN7Battery6updateEv .text.__vector_16 - 0x0000000000003f70 0x94 ../lib/libarduino.a(wiring.o) - 0x0000000000003f70 __vector_16 - .text.millis 0x0000000000004004 0x18 ../lib/libarduino.a(wiring.o) - 0x0000000000004004 millis - .text.micros 0x000000000000401c 0x4a ../lib/libarduino.a(wiring.o) - 0x000000000000401c micros - .text.delay 0x0000000000004066 0x4c ../lib/libarduino.a(wiring.o) - 0x0000000000004066 delay - .text.init 0x00000000000040b2 0x76 ../lib/libarduino.a(wiring.o) - 0x00000000000040b2 init + 0x0000000000003e76 0x94 ../lib/libarduino.a(wiring.o) + 0x0000000000003e76 __vector_16 + .text.millis 0x0000000000003f0a 0x18 ../lib/libarduino.a(wiring.o) + 0x0000000000003f0a millis + .text.micros 0x0000000000003f22 0x4a ../lib/libarduino.a(wiring.o) + 0x0000000000003f22 micros + .text.delay 0x0000000000003f6c 0x4c ../lib/libarduino.a(wiring.o) + 0x0000000000003f6c delay + .text.init 0x0000000000003fb8 0x76 ../lib/libarduino.a(wiring.o) + 0x0000000000003fb8 init .text.analogRead - 0x0000000000004128 0x36 ../lib/libarduino.a(wiring_analog.o) - 0x0000000000004128 analogRead + 0x000000000000402e 0x36 ../lib/libarduino.a(wiring_analog.o) + 0x000000000000402e analogRead .text.analogWrite - 0x000000000000415e 0xba ../lib/libarduino.a(wiring_analog.o) - 0x000000000000415e analogWrite + 0x0000000000004064 0xba ../lib/libarduino.a(wiring_analog.o) + 0x0000000000004064 analogWrite .text.turnOffPWM - 0x0000000000004218 0x52 ../lib/libarduino.a(wiring_digital.o) - .text.pinMode 0x000000000000426a 0x78 ../lib/libarduino.a(wiring_digital.o) - 0x000000000000426a pinMode + 0x000000000000411e 0x52 ../lib/libarduino.a(wiring_digital.o) + .text.pinMode 0x0000000000004170 0x78 ../lib/libarduino.a(wiring_digital.o) + 0x0000000000004170 pinMode .text.digitalWrite - 0x00000000000042e2 0x5c ../lib/libarduino.a(wiring_digital.o) - 0x00000000000042e2 digitalWrite + 0x00000000000041e8 0x5c ../lib/libarduino.a(wiring_digital.o) + 0x00000000000041e8 digitalWrite .text.digitalRead - 0x000000000000433e 0x52 ../lib/libarduino.a(wiring_digital.o) - 0x000000000000433e digitalRead + 0x0000000000004244 0x52 ../lib/libarduino.a(wiring_digital.o) + 0x0000000000004244 digitalRead .text._ZN5Print5writeEPKhj - 0x0000000000004390 0x50 ../lib/libarduino.a(Print.o) - 0x0000000000004390 _ZN5Print5writeEPKhj + 0x0000000000004296 0x50 ../lib/libarduino.a(Print.o) + 0x0000000000004296 _ZN5Print5writeEPKhj .text._ZN5Print5writeEPKc.part.1 - 0x00000000000043e0 0x1e ../lib/libarduino.a(Print.o) + 0x00000000000042e6 0x1e ../lib/libarduino.a(Print.o) .text._ZN5Print5printEPK19__FlashStringHelper - 0x00000000000043fe 0x46 ../lib/libarduino.a(Print.o) - 0x00000000000043fe _ZN5Print5printEPK19__FlashStringHelper + 0x0000000000004304 0x46 ../lib/libarduino.a(Print.o) + 0x0000000000004304 _ZN5Print5printEPK19__FlashStringHelper .text._ZN5Print5printEPKc - 0x0000000000004444 0x10 ../lib/libarduino.a(Print.o) - 0x0000000000004444 _ZN5Print5printEPKc + 0x000000000000434a 0x10 ../lib/libarduino.a(Print.o) + 0x000000000000434a _ZN5Print5printEPKc .text._ZN5Print5printEc - 0x0000000000004454 0xe ../lib/libarduino.a(Print.o) - 0x0000000000004454 _ZN5Print5printEc + 0x000000000000435a 0xe ../lib/libarduino.a(Print.o) + 0x000000000000435a _ZN5Print5printEc .text._ZN5Print7printlnEv - 0x0000000000004462 0x28 ../lib/libarduino.a(Print.o) - 0x0000000000004462 _ZN5Print7printlnEv + 0x0000000000004368 0x28 ../lib/libarduino.a(Print.o) + 0x0000000000004368 _ZN5Print7printlnEv .text._ZN5Print7printlnEPK19__FlashStringHelper - 0x000000000000448a 0x24 ../lib/libarduino.a(Print.o) - 0x000000000000448a _ZN5Print7printlnEPK19__FlashStringHelper + 0x0000000000004390 0x24 ../lib/libarduino.a(Print.o) + 0x0000000000004390 _ZN5Print7printlnEPK19__FlashStringHelper .text._ZN5Print11printNumberEmh - 0x00000000000044ae 0xb2 ../lib/libarduino.a(Print.o) - 0x00000000000044ae _ZN5Print11printNumberEmh + 0x00000000000043b4 0xb2 ../lib/libarduino.a(Print.o) + 0x00000000000043b4 _ZN5Print11printNumberEmh .text._ZN5Print5printEli - 0x0000000000004560 0x94 ../lib/libarduino.a(Print.o) - 0x0000000000004560 _ZN5Print5printEli + 0x0000000000004466 0x94 ../lib/libarduino.a(Print.o) + 0x0000000000004466 _ZN5Print5printEli .text._ZN5Print5printEii - 0x00000000000045f4 0xe ../lib/libarduino.a(Print.o) - 0x00000000000045f4 _ZN5Print5printEii + 0x00000000000044fa 0xe ../lib/libarduino.a(Print.o) + 0x00000000000044fa _ZN5Print5printEii .text._ZN5Print5printEmi - 0x0000000000004602 0x1a ../lib/libarduino.a(Print.o) - 0x0000000000004602 _ZN5Print5printEmi + 0x0000000000004508 0x1a ../lib/libarduino.a(Print.o) + 0x0000000000004508 _ZN5Print5printEmi .text._ZN5Print5printEji - 0x000000000000461c 0xc ../lib/libarduino.a(Print.o) - 0x000000000000461c _ZN5Print5printEji + 0x0000000000004522 0xc ../lib/libarduino.a(Print.o) + 0x0000000000004522 _ZN5Print5printEji .text._Z3maplllll - 0x0000000000004628 0x82 ../lib/libarduino.a(WMath.o) - 0x0000000000004628 _Z3maplllll + 0x000000000000452e 0x82 ../lib/libarduino.a(WMath.o) + 0x000000000000452e _Z3maplllll .text._ZN8SPIClass5beginEv - 0x00000000000046aa 0x2c ../lib/libarduino.a(SPI.o) - 0x00000000000046aa _ZN8SPIClass5beginEv + 0x00000000000045b0 0x2c ../lib/libarduino.a(SPI.o) + 0x00000000000045b0 _ZN8SPIClass5beginEv .text._ZN8SPIClass11setBitOrderEh - 0x00000000000046d6 0x12 ../lib/libarduino.a(SPI.o) - 0x00000000000046d6 _ZN8SPIClass11setBitOrderEh + 0x00000000000045dc 0x12 ../lib/libarduino.a(SPI.o) + 0x00000000000045dc _ZN8SPIClass11setBitOrderEh .text._ZN8SPIClass11setDataModeEh - 0x00000000000046e8 0xa ../lib/libarduino.a(SPI.o) - 0x00000000000046e8 _ZN8SPIClass11setDataModeEh + 0x00000000000045ee 0xa ../lib/libarduino.a(SPI.o) + 0x00000000000045ee _ZN8SPIClass11setDataModeEh .text._ZN8SPIClass15setClockDividerEh - 0x00000000000046f2 0x1e ../lib/libarduino.a(SPI.o) - 0x00000000000046f2 _ZN8SPIClass15setClockDividerEh + 0x00000000000045f8 0x1e ../lib/libarduino.a(SPI.o) + 0x00000000000045f8 _ZN8SPIClass15setClockDividerEh .text.libgcc.mul - 0x0000000000004710 0x20 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_mulsi3.o) - 0x0000000000004710 __mulsi3 + 0x0000000000004616 0x20 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_mulsi3.o) + 0x0000000000004616 __mulsi3 .text.libgcc.div - 0x0000000000004730 0x18 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_udivmodqi4.o) - 0x0000000000004730 __udivmodqi4 + 0x0000000000004636 0x18 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_udivmodqi4.o) + 0x0000000000004636 __udivmodqi4 .text.libgcc.div - 0x0000000000004748 0x28 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_udivmodhi4.o) - 0x0000000000004748 __udivmodhi4 + 0x000000000000464e 0x28 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_udivmodhi4.o) + 0x000000000000464e __udivmodhi4 .text.libgcc.div - 0x0000000000004770 0x28 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_divmodhi4.o) - 0x0000000000004770 __divmodhi4 - 0x0000000000004770 _div + 0x0000000000004676 0x28 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_divmodhi4.o) + 0x0000000000004676 __divmodhi4 + 0x0000000000004676 _div .text.libgcc.div - 0x0000000000004798 0x44 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_udivmodsi4.o) - 0x0000000000004798 __udivmodsi4 + 0x000000000000469e 0x44 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_udivmodsi4.o) + 0x000000000000469e __udivmodsi4 .text.libgcc.div - 0x00000000000047dc 0x2e /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_divmodsi4.o) - 0x00000000000047dc __divmodsi4 + 0x00000000000046e2 0x2e /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_divmodsi4.o) + 0x00000000000046e2 __divmodsi4 .text.libgcc.div - 0x000000000000480a 0x10 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_negsi2.o) - 0x000000000000480a __negsi2 + 0x0000000000004710 0x10 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_negsi2.o) + 0x0000000000004710 __negsi2 .text.libgcc.mul - 0x000000000000481a 0x16 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_muluhisi3.o) - 0x000000000000481a __muluhisi3 - .text.libgcc 0x0000000000004830 0x18 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_adddi3_s8.o) - 0x0000000000004830 __adddi3_s8 - .text.libgcc 0x0000000000004848 0xc /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_tablejump2.o) - 0x0000000000004848 __tablejump2__ + 0x0000000000004720 0x16 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_muluhisi3.o) + 0x0000000000004720 __muluhisi3 + .text.libgcc 0x0000000000004736 0x18 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_adddi3_s8.o) + 0x0000000000004736 __adddi3_s8 + .text.libgcc 0x000000000000474e 0xc /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_tablejump2.o) + 0x000000000000474e __tablejump2__ .text.libgcc.mul - 0x0000000000004854 0x1e /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_umulhisi3.o) - 0x0000000000004854 __umulhisi3 + 0x000000000000475a 0x1e /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_umulhisi3.o) + 0x000000000000475a __umulhisi3 .text.avr-libc.fplib - 0x0000000000004872 0x5e /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fixunssfsi.o) - 0x0000000000004872 __fixunssfsi + 0x0000000000004778 0x5e /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fixunssfsi.o) + 0x0000000000004778 __fixunssfsi .text.avr-libc.fplib - 0x00000000000048d0 0x7a /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(floatsisf.o) - 0x00000000000048d0 __floatunsisf - 0x00000000000048d4 __floatsisf + 0x00000000000047d6 0x7a /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(floatsisf.o) + 0x00000000000047d6 __floatunsisf + 0x00000000000047da __floatsisf .text.avr-libc.fplib - 0x000000000000494a 0xc /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_inf.o) - 0x000000000000494a __fp_inf + 0x0000000000004850 0xc /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_inf.o) + 0x0000000000004850 __fp_inf .text.avr-libc.fplib - 0x0000000000004956 0x6 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_nan.o) - 0x0000000000004956 __fp_nan + 0x000000000000485c 0x6 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_nan.o) + 0x000000000000485c __fp_nan .text.avr-libc.fplib - 0x000000000000495c 0xe /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_pscA.o) - 0x000000000000495c __fp_pscA + 0x0000000000004862 0xe /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_pscA.o) + 0x0000000000004862 __fp_pscA .text.avr-libc.fplib - 0x000000000000496a 0xe /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_pscB.o) - 0x000000000000496a __fp_pscB + 0x0000000000004870 0xe /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_pscB.o) + 0x0000000000004870 __fp_pscB .text.avr-libc.fplib - 0x0000000000004978 0x22 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_round.o) - 0x0000000000004978 __fp_round + 0x000000000000487e 0x22 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_round.o) + 0x000000000000487e __fp_round .text.avr-libc.fplib - 0x000000000000499a 0x44 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_split3.o) - 0x000000000000499a __fp_split3 - 0x00000000000049aa __fp_splitA + 0x00000000000048a0 0x44 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_split3.o) + 0x00000000000048a0 __fp_split3 + 0x00000000000048b0 __fp_splitA .text.avr-libc.fplib - 0x00000000000049de 0xe /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_zero.o) - 0x00000000000049de __fp_zero - 0x00000000000049e0 __fp_szero + 0x00000000000048e4 0xe /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(fp_zero.o) + 0x00000000000048e4 __fp_zero + 0x00000000000048e6 __fp_szero .text.avr-libc.fplib - 0x00000000000049ec 0x8 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(mulsf3.o) - 0x00000000000049ec __mulsf3 + 0x00000000000048f2 0x8 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(mulsf3.o) + 0x00000000000048f2 __mulsf3 .text.avr-libc.fplib - 0x00000000000049f4 0xd2 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(mulsf3x.o) - 0x0000000000004a12 __mulsf3x - 0x0000000000004a18 __mulsf3_pse + 0x00000000000048fa 0xd2 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libm.a(mulsf3x.o) + 0x0000000000004918 __mulsf3x + 0x000000000000491e __mulsf3_pse .text.avr-libc - 0x0000000000004ac6 0xb8 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(rand.o) - 0x0000000000004b58 rand_r - 0x0000000000004b5e rand - 0x0000000000004b68 srand + 0x00000000000049cc 0xb8 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(rand.o) + 0x0000000000004a5e rand_r + 0x0000000000004a64 rand + 0x0000000000004a6e srand .text.avr-libc - 0x0000000000004b7e 0x60 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(snprintf.o) - 0x0000000000004b7e snprintf + 0x0000000000004a84 0x60 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(snprintf.o) + 0x0000000000004a84 snprintf .text.avr-libc - 0x0000000000004bde 0x3b4 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(vfprintf_std.o) - 0x0000000000004bde vfprintf + 0x0000000000004ae4 0x3b4 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(vfprintf_std.o) + 0x0000000000004ae4 vfprintf .text.avr-libc - 0x0000000000004f92 0x16 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(strnlen_P.o) - 0x0000000000004f92 strnlen_P + 0x0000000000004e98 0x16 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(strnlen_P.o) + 0x0000000000004e98 strnlen_P .text.avr-libc - 0x0000000000004fa8 0x16 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(strnlen.o) - 0x0000000000004fa8 strnlen + 0x0000000000004eae 0x16 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(strnlen.o) + 0x0000000000004eae strnlen .text.avr-libc - 0x0000000000004fbe 0x60 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(fputc.o) - 0x0000000000004fbe fputc + 0x0000000000004ec4 0x60 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(fputc.o) + 0x0000000000004ec4 fputc .text.avr-libc - 0x000000000000501e 0xbc /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(ultoa_invert.o) - 0x000000000000501e __ultoa_invert + 0x0000000000004f24 0xbc /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(ultoa_invert.o) + 0x0000000000004f24 __ultoa_invert .text.libgcc.mul - 0x00000000000050da 0x10 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_mulshisi3.o) - 0x00000000000050da __mulshisi3 - 0x00000000000050e0 __mulohisi3 + 0x0000000000004fe0 0x10 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_mulshisi3.o) + 0x0000000000004fe0 __mulshisi3 + 0x0000000000004fe6 __mulohisi3 .text.libgcc.prologue - 0x00000000000050ea 0x38 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_prologue.o) - 0x00000000000050ea __prologue_saves__ + 0x0000000000004ff0 0x38 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_prologue.o) + 0x0000000000004ff0 __prologue_saves__ .text.libgcc.prologue - 0x0000000000005122 0x36 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_epilogue.o) - 0x0000000000005122 __epilogue_restores__ - 0x0000000000005158 . = ALIGN (0x2) + 0x0000000000005028 0x36 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_epilogue.o) + 0x0000000000005028 __epilogue_restores__ + 0x000000000000505e . = ALIGN (0x2) *(.fini9) - .fini9 0x0000000000005158 0x0 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_exit.o) - 0x0000000000005158 exit - 0x0000000000005158 _exit + .fini9 0x000000000000505e 0x0 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_exit.o) + 0x000000000000505e exit + 0x000000000000505e _exit *(.fini9) *(.fini8) *(.fini8) *(.fini7) *(.fini7) *(.fini6) - .fini6 0x0000000000005158 0x16 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_dtors.o) - 0x0000000000005158 __do_global_dtors + .fini6 0x000000000000505e 0x16 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_dtors.o) + 0x000000000000505e __do_global_dtors *(.fini6) *(.fini5) *(.fini5) @@ -2073,16 +2075,16 @@ END GROUP *(.fini1) *(.fini1) *(.fini0) - .fini0 0x000000000000516e 0x4 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_exit.o) + .fini0 0x0000000000005074 0x4 /usr/local/avr/lib/gcc/avr/7.2.0/avr5/libgcc.a(_exit.o) *(.fini0) *(.hightext) *(.hightext*) - 0x0000000000005172 . = ALIGN (0x2) + 0x0000000000005078 . = ALIGN (0x2) *(.jumptables) *(.jumptables*) - 0x0000000000005172 _etext = . + 0x0000000000005078 _etext = . -.data 0x0000000000800100 0x42 load address 0x0000000000005172 +.data 0x0000000000800100 0x5e load address 0x0000000000005078 0x0000000000800100 PROVIDE (__data_start, .) *(.data) .data 0x0000000000800100 0x4 /usr/local/avr/lib/gcc/avr/7.2.0/../../../../avr/lib/avr5/libc.a(rand.o) @@ -2099,102 +2101,97 @@ END GROUP 0x0000000000800106 0xf Obj/Gfx.o .rodata._ZN6Player10showHealthEh.str1.1 0x0000000000800115 0x6 Obj/Player.o + .rodata._ZN6Player18ButtonLeftReleasedEv.str1.1 + 0x000000000080011b 0x6 Obj/Player.o + 0x3 (size before relaxing) + .rodata.UnitShadowOffsetTable + 0x000000000080011b 0x4 Obj/Unit.o + .rodata.UnitActionsTable + 0x000000000080011f 0x5 Obj/Unit.o .rodata.str1.1 - 0x000000000080011b 0xf Obj/Unit.o - .rodata.UnitActionsTable_Level1 - 0x000000000080012a 0x4 Obj/Unit.o + 0x0000000000800124 0x14 Obj/Unit.o .rodata.UnitActionsTable_Level0 - 0x000000000080012e 0x4 Obj/Unit.o + 0x0000000000800138 0xc Obj/Unit.o + .rodata.UnitSpeedTable + 0x0000000000800144 0x5 Obj/Unit.o + .rodata.UnitHPTable + 0x0000000000800149 0x5 Obj/Unit.o .rodata._ZTV7Display - 0x0000000000800132 0x8 ../lib/libgamebuino.a(Display.o) - 0x0000000000800132 _ZTV7Display + 0x000000000080014e 0x8 ../lib/libgamebuino.a(Display.o) + 0x000000000080014e _ZTV7Display .rodata._ZN9Gamebuino10changeGameEv.str1.1 - 0x000000000080013a 0x7 ../lib/libgamebuino.a(Gamebuino.o) + 0x0000000000800156 0x7 ../lib/libgamebuino.a(Gamebuino.o) *(.gnu.linkonce.r*) - 0x0000000000800142 . = ALIGN (0x2) - *fill* 0x0000000000800141 0x1 - 0x0000000000800142 _edata = . - 0x0000000000800142 PROVIDE (__data_end, .) + 0x000000000080015e . = ALIGN (0x2) + *fill* 0x000000000080015d 0x1 + 0x000000000080015e _edata = . + 0x000000000080015e PROVIDE (__data_end, .) -.bss 0x0000000000800142 0x637 - 0x0000000000800142 PROVIDE (__bss_start, .) +.bss 0x000000000080015e 0x607 + 0x000000000080015e PROVIDE (__bss_start, .) *(.bss) *(.bss*) - .bss.gb 0x0000000000800142 0x87 Obj/main.o - 0x0000000000800142 gb + .bss.gb 0x000000000080015e 0x87 Obj/main.o + 0x000000000080015e gb .bss._ZL8MouseSpr - 0x00000000008001c9 0x9 Obj/Gameplay.o + 0x00000000008001e5 0x9 Obj/Gameplay.o .bss.GamePlayers - 0x00000000008001d2 0x304 Obj/Gameplay.o - 0x00000000008001d2 GamePlayers + 0x00000000008001ee 0x2a3 Obj/Gameplay.o + 0x00000000008001ee GamePlayers .bss.timer_array - 0x00000000008004d6 0x60 Obj/System.o + 0x0000000000800491 0x60 Obj/System.o .bss.system_busy - 0x0000000000800536 0x1 Obj/System.o + 0x00000000008004f1 0x1 Obj/System.o .bss.one_second_timer - 0x0000000000800537 0x1 Obj/System.o + 0x00000000008004f2 0x1 Obj/System.o .bss.rand_seed - 0x0000000000800538 0x1 Obj/System.o + 0x00000000008004f3 0x1 Obj/System.o .bss.global_timer - 0x0000000000800539 0x8 Obj/System.o - .bss._ZZN6Player13ButtonHandlerEvE16bCancelSelection - 0x0000000000800541 0x1 Obj/Player.o - .bss._ZZN6Player24checkNewBuildingPositionEP16t_CollisionBlockE9max_tries - 0x0000000000800542 0x1 Obj/Player.o - .bss.walk_counter.2394 - 0x0000000000800543 0x1 Obj/Unit.o - .bss.mirror.2395 - 0x0000000000800544 0x1 Obj/Unit.o - .bss.PeasantWalkingSpr - 0x0000000000800545 0x9 Obj/Unit.o - .bss.PeasantSpr - 0x000000000080054e 0x9 Obj/Unit.o - .bss.menuLevel - 0x0000000000800557 0x1 Obj/Unit.o - .bss.BarracksShadowSpr - 0x0000000000800558 0x9 Obj/Building.o - .bss.BarracksSpr - 0x0000000000800561 0x9 Obj/Building.o + 0x00000000008004f4 0x8 Obj/System.o + .bss.UnitWalkingShadowSprTable + 0x00000000008004fc 0x2d Obj/Unit.o + .bss.UnitSprTable + 0x0000000000800529 0x2d Obj/Unit.o .bss._displayBuffer - 0x000000000080056a 0x200 ../lib/libgamebuino.a(Display.o) - 0x000000000080056a _displayBuffer + 0x0000000000800556 0x200 ../lib/libgamebuino.a(Display.o) + 0x0000000000800556 _displayBuffer .bss._chanNoise - 0x000000000080076a 0x1 ../lib/libgamebuino.a(Sound.o) - 0x000000000080076a _chanNoise + 0x0000000000800756 0x1 ../lib/libgamebuino.a(Sound.o) + 0x0000000000800756 _chanNoise .bss._chanOutput - 0x000000000080076b 0x1 ../lib/libgamebuino.a(Sound.o) - 0x000000000080076b _chanOutput + 0x0000000000800757 0x1 ../lib/libgamebuino.a(Sound.o) + 0x0000000000800757 _chanOutput .bss._chanOutputVolume - 0x000000000080076c 0x1 ../lib/libgamebuino.a(Sound.o) - 0x000000000080076c _chanOutputVolume + 0x0000000000800758 0x1 ../lib/libgamebuino.a(Sound.o) + 0x0000000000800758 _chanOutputVolume .bss._chanHalfPeriod - 0x000000000080076d 0x1 ../lib/libgamebuino.a(Sound.o) - 0x000000000080076d _chanHalfPeriod + 0x0000000000800759 0x1 ../lib/libgamebuino.a(Sound.o) + 0x0000000000800759 _chanHalfPeriod .bss._chanState - 0x000000000080076e 0x1 ../lib/libgamebuino.a(Sound.o) - 0x000000000080076e _chanState + 0x000000000080075a 0x1 ../lib/libgamebuino.a(Sound.o) + 0x000000000080075a _chanState .bss._chanCount - 0x000000000080076f 0x1 ../lib/libgamebuino.a(Sound.o) - 0x000000000080076f _chanCount + 0x000000000080075b 0x1 ../lib/libgamebuino.a(Sound.o) + 0x000000000080075b _chanCount .bss.timer0_fract - 0x0000000000800770 0x1 ../lib/libarduino.a(wiring.o) + 0x000000000080075c 0x1 ../lib/libarduino.a(wiring.o) .bss.timer0_millis - 0x0000000000800771 0x4 ../lib/libarduino.a(wiring.o) - 0x0000000000800771 timer0_millis + 0x000000000080075d 0x4 ../lib/libarduino.a(wiring.o) + 0x000000000080075d timer0_millis .bss.timer0_overflow_count - 0x0000000000800775 0x4 ../lib/libarduino.a(wiring.o) - 0x0000000000800775 timer0_overflow_count + 0x0000000000800761 0x4 ../lib/libarduino.a(wiring.o) + 0x0000000000800761 timer0_overflow_count *(COMMON) - 0x0000000000800779 PROVIDE (__bss_end, .) - 0x0000000000005172 __data_load_start = LOADADDR (.data) - 0x00000000000051b4 __data_load_end = (__data_load_start + SIZEOF (.data)) + 0x0000000000800765 PROVIDE (__bss_end, .) + 0x0000000000005078 __data_load_start = LOADADDR (.data) + 0x00000000000050d6 __data_load_end = (__data_load_start + SIZEOF (.data)) -.noinit 0x0000000000800779 0x0 +.noinit 0x0000000000800765 0x0 [!provide] PROVIDE (__noinit_start, .) *(.noinit*) [!provide] PROVIDE (__noinit_end, .) - 0x0000000000800779 _end = . - 0x0000000000800779 PROVIDE (__heap_start, .) + 0x0000000000800765 _end = . + 0x0000000000800765 PROVIDE (__heap_start, .) .eeprom 0x0000000000810000 0x0 *(.eeprom*) @@ -2242,7 +2239,6 @@ END GROUP .comment 0x0000000000000011 0x12 Obj/Camera.o .comment 0x0000000000000011 0x12 Obj/Unit.o .comment 0x0000000000000011 0x12 Obj/Menu.o - .comment 0x0000000000000011 0x12 Obj/Building.o .comment 0x0000000000000011 0x12 ../lib/libgamebuino.a(Buttons.o) .comment 0x0000000000000011 0x12 ../lib/libgamebuino.a(Display.o) .comment 0x0000000000000011 0x12 ../lib/libgamebuino.a(font3x3.o) diff --git a/GameStructures.h b/GameStructures.h deleted file mode 100644 index b81ca45..0000000 --- a/GameStructures.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef __GAME_STRUCTURES__HEADER__ -#define __GAME_STRUCTURES__HEADER__ - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -/* ************************************* - * Includes - * *************************************/ - - /* ************************************* - * Defines - * *************************************/ - -/* ************************************* - * Structs and enums - * *************************************/ - -typedef struct t_Camera -{ - int16_t X_Offset; - int16_t Y_Offset; - int8_t X_Speed; - int8_t Y_Speed; - uint8_t Speed_Timer; -}TYPE_CAMERA; - -typedef enum t_buildingIds -{ - BARRACKS = 0 , - TOWER , -}TYPE_BUILDING_ID; - -typedef struct t_Building -{ - uint16_t x; - uint16_t y; - uint8_t hp; - TYPE_BUILDING_ID id; - bool built; - bool selected; -}TYPE_BUILDING; - -typedef struct t_Unit -{ - uint16_t x; - uint16_t y; - uint16_t target_x; - uint16_t target_y; - uint8_t hp; - uint8_t id; - bool dir; // False = up-down; true = left-right - bool mirror; // True = down or left; true = up or right - bool walking; - bool alive; - bool selected; -}TYPE_UNIT; - -typedef struct t_CollisionBlock -{ - uint16_t x; - uint16_t y; - uint8_t w; - uint8_t h; -}TYPE_COLLISION_BLOCK; - -typedef struct t_Resource -{ - uint8_t Wood; - uint8_t Gold; - uint8_t Food; -}TYPE_RESOURCES; - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif // __GAME_STRUCTURES__HEADER__ diff --git a/Gameplay.cpp b/Gameplay.cpp index c406834..55c22d5 100644 --- a/Gameplay.cpp +++ b/Gameplay.cpp @@ -1,18 +1,19 @@ /* ************************************** * Includes * * **************************************/ - + #include "Gameplay.h" #include "MouseSpr.c" +#include "Pad.h" /* ************************************** * Defines * * **************************************/ - + /* ************************************** * Global variables * * **************************************/ - + Player GamePlayers[GAME_MAX_PLAYERS]; /* ************************************** @@ -22,8 +23,8 @@ Player GamePlayers[GAME_MAX_PLAYERS]; static const char PauseMenuOption_0[] PROGMEM = "Resume"; static const char PauseMenuOption_1[] PROGMEM = "Quit"; static TYPE_SPRITE MouseSpr; - -static const char * const PauseMenuOptions[] PROGMEM = {PauseMenuOption_0, + +static const char* const PauseMenuOptions[] PROGMEM = {PauseMenuOption_0, PauseMenuOption_1 }; /* ************************************** @@ -75,50 +76,50 @@ const byte TowerSpr[] PROGMEM = {16,32, void GameInit(void) { uint8_t i; - - for(i = 0; i < GAME_MAX_PLAYERS; i++) + + for (i = 0; i < GAME_MAX_PLAYERS; i++) { GamePlayers[i].Init(); } - + MouseSpr.Data = MouseSprData; MouseSpr.color = GFX_INVERT; MouseSpr.rotation = NOROT; MouseSpr.flip = NOFLIP; MouseSpr.x = (X_SCREEN_RESOLUTION >> 1) - 4; MouseSpr.y = (Y_SCREEN_RESOLUTION >> 1) - 4; - + GfxInit(); - + GameLoop(); } bool GamePause(void) { - if(PadButtonReleased(PAD_C) == true) + if (PadButtonReleased(PAD_C) == true) { //int8_t menu(const char* const* items, uint8_t length); uint8_t choice = gb.menu(PauseMenuOptions, 2); - - if(choice != 0) + + if (choice != 0) { return true; } } - + return false; } void GameCalculations(void) { uint8_t i; - - for(i = 0; i < GAME_MAX_PLAYERS; i++) + + for (i = 0; i < GAME_MAX_PLAYERS; i++) { GamePlayers[i].Handler(); } - - if(PadAnyKeyPressed() == true) + + if (PadAnyKeyPressed() == true) { SystemSetRandSeed(); } @@ -127,32 +128,32 @@ void GameCalculations(void) void GameGraphics(void) { uint8_t i; - + //GfxClearScreen(); - - for(i = 0; i < GAME_MAX_PLAYERS; i++) + + for (i = 0; i < GAME_MAX_PLAYERS; i++) { GamePlayers[i].DrawHandler(); } - + GfxDrawSprite(&MouseSpr); } void GameLoop(void) { - while(1) + while (1) { - if(GamePause() == true) + if (GamePause() == true) { return; } - + GameCalculations(); - - while(GfxRefreshNeeded() == false); - + + while (GfxRefreshNeeded() == false); + GameGraphics(); - + SystemIncreaseGlobalTimer(); } } diff --git a/Gameplay.h b/Gameplay.h index 513f420..98bb76d 100644 --- a/Gameplay.h +++ b/Gameplay.h @@ -6,15 +6,12 @@ * **************************************/ #include "Global_Inc.h" -#include "Gfx.h" -#include "Pad.h" -#include "Menu.h" #include "Player.h" /* ************************************** * Defines * * **************************************/ - + #define GAME_MAX_PLAYERS 1 /* ************************************** @@ -26,7 +23,7 @@ void GameInit(void); /* ************************************** * Global variables * * **************************************/ - + extern Player GamePlayers[GAME_MAX_PLAYERS]; #endif // __GAMEPLAY_H__ diff --git a/Gfx.cpp b/Gfx.cpp index ff58551..49b8a9a 100644 --- a/Gfx.cpp +++ b/Gfx.cpp @@ -1,21 +1,21 @@ /* ************************************* * Includes * *************************************/ - + #include "Gfx.h" - + /* ************************************* * Defines * *************************************/ - + /* ************************************* * Structs and enums * *************************************/ - + /* ************************************* * Local variables * *************************************/ - + static bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h); void GfxInit(void) @@ -23,20 +23,20 @@ void GfxInit(void) gb.display.persistence = false; // Clears screen automatically gb.display.setFont(font3x5); } - + void GfxDrawSprite(TYPE_SPRITE * ptrSprite) { - if(GfxIsSpriteInsideScreenArea(ptrSprite) == true) + if (GfxIsSpriteInsideScreenArea(ptrSprite) == true) { int8_t orig_color = gb.display.getColor(); - + gb.display.setColor(ptrSprite->color, GFX_WHITE); gb.display.drawBitmap( ptrSprite->x, ptrSprite->y, ptrSprite->Data, ptrSprite->rotation, ptrSprite->flip ); - + gb.display.setColor(orig_color); } } @@ -46,8 +46,8 @@ bool GfxRefreshNeeded(void) return gb.update(); } -void GfxShowKeyboard(char * str, uint8_t length) -{ +void GfxShowKeyboard(char* str, uint8_t length) +{ gb.keyboard(str, length); } @@ -60,17 +60,17 @@ void GfxClearScreen(void) bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h) { /*char strBuffer[16]; - + snprintf(strBuffer, 16, "%d", (int)(x + w)); GfxPrintText(strBuffer,48,8); - + snprintf(strBuffer, 16, "x = %d", (int)(x)); GfxPrintText(strBuffer,48,16); - + snprintf(strBuffer, 16, "w = %d", (int)(w)); GfxPrintText(strBuffer,48,24);*/ - - if( ( (x + w) >= 0) + + if ( ( (x + w) >= 0) && (x < X_SCREEN_RESOLUTION) && @@ -80,7 +80,7 @@ bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h) { return true; } - + return false; } @@ -89,13 +89,13 @@ bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE * spr) return GfxIsInsideScreenArea(spr->x, spr->y, spr->w, spr->h); } -uint8_t GfxGetWidthFromSpriteData(const uint8_t * sprData) +uint8_t GfxGetWidthFromSpriteData(const uint8_t* sprData) { - // On Gamebuino bitmaps, width is always stored on first byte. + // On Gamebuino bitmaps, width is always stored on first byte. return pgm_read_byte_near(&sprData[0]); } -uint8_t GfxGetHeightFromSpriteData(const uint8_t * sprData) +uint8_t GfxGetHeightFromSpriteData(const uint8_t* sprData) { // On Gamebuino bitmaps, height is always stored on second byte. return pgm_read_byte_near(&sprData[1]); @@ -106,61 +106,61 @@ void GfxPrintText_Flash(const __FlashStringHelper * str) gb.popup(str, 20 * 3 /* 3 seconds */); } -void GfxPrintTextFont(const char * str, const uint8_t * font, uint8_t x, uint8_t y) +void GfxPrintTextFont(const char* str, const uint8_t* font, uint8_t x, uint8_t y) { - uint8_t * orig_font = gb.display.getFont(); - + uint8_t* orig_font = gb.display.getFont(); + gb.display.cursorX = x; gb.display.cursorY = y; - + gb.display.setFont(font); - + gb.display.setColor(GFX_BLACK, GFX_WHITE); - + gb.display.print(str); - - if(orig_font != NULL) + + if (orig_font != NULL) { gb.display.setFont(orig_font); } } -void GfxRenderTiles(TYPE_CAMERA * ptrCamera) +void GfxRenderTiles(TYPE_CAMERA* ptrCamera) { gb.display.setColor(GFX_GRAY); - - if(ptrCamera == NULL) + + if (ptrCamera == NULL) { return; } - - for(int i = 0; i < Y_SCREEN_RESOLUTION; i+=8) + + for (int i = 0; i < Y_SCREEN_RESOLUTION; i+=8) { - for(int j = 0; j < X_SCREEN_RESOLUTION; j++) + for (int j = 0; j < X_SCREEN_RESOLUTION; j++) { - //if(j & 1) + //if (j & 1) //{ int x = j + ptrCamera->X_Offset; int y = i + ptrCamera->Y_Offset; - - if((x >= 0) && (y >= 0)) + + if ((x >= 0) && (y >= 0)) { gb.display.drawPixel(j + ptrCamera->X_Offset, i + ptrCamera->Y_Offset); } //} } } - - for(int i = 0; i < X_SCREEN_RESOLUTION; i+=8) + + for (int i = 0; i < X_SCREEN_RESOLUTION; i+=8) { - for(int j = 0; j < Y_SCREEN_RESOLUTION; j++) + for (int j = 0; j < Y_SCREEN_RESOLUTION; j++) { - //if(j & 1) + //if (j & 1) //{ int x = j + ptrCamera->X_Offset; int y = i + ptrCamera->Y_Offset; - - if((x >= 0) && (y >= 0)) + + if ((x >= 0) && (y >= 0)) { gb.display.drawPixel(i + ptrCamera->X_Offset, j + ptrCamera->Y_Offset); } @@ -169,14 +169,14 @@ void GfxRenderTiles(TYPE_CAMERA * ptrCamera) } } -void GfxPrintText(const char * str, uint8_t x, uint8_t y) +void GfxPrintText(const char* str, uint8_t x, uint8_t y) { GfxPrintTextFont(str, font3x5, x, y); } void GfxDrawCircle(uint16_t x, uint16_t y, uint8_t radius, int8_t color) { - if(GfxIsInsideScreenArea(x, y, radius, radius) == true) + if (GfxIsInsideScreenArea(x, y, radius, radius) == true) { int8_t orig_color = gb.display.getColor(); gb.display.setColor(color); @@ -187,44 +187,50 @@ void GfxDrawCircle(uint16_t x, uint16_t y, uint8_t radius, int8_t color) void GfxDrawRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color) { - if(GfxIsInsideScreenArea(x, y, w, h) == true) + if (GfxIsInsideScreenArea(x, y, w, h) == true) { int8_t orig_color = gb.display.getColor(); - + gb.display.setColor(color); gb.display.drawRect(x, y, w, h); gb.display.setColor(orig_color); } } +void GfxDrawLine(uint8_t x0, uint8_t x1, uint8_t y0, uint8_t y1, uint8_t color) +{ + gb.display.setColor(color); + gb.display.drawLine(x0, y0, x1, y1); +} + void GfxFillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color) { - if(GfxIsInsideScreenArea(x, y, w, h) == true) + if (GfxIsInsideScreenArea(x, y, w, h) == true) { int8_t orig_color = gb.display.getColor(); - + gb.display.setColor(color); gb.display.fillRect(x, y, w, h); gb.display.setColor(orig_color); } } -void GfxShowResources(TYPE_RESOURCES * ptrResources) +void GfxShowResources(TYPE_RESOURCES* ptrResources) { char str[8]; - + gb.display.setColor(GFX_WHITE); gb.display.fillRect(0, 0, X_SCREEN_RESOLUTION, 5); - + snprintf(str, 8, "W=%d", ptrResources->Wood); - + GfxPrintTextFont(str, font3x3, 4, 1); - + snprintf(str, 8, "G=%d", ptrResources->Gold); - + GfxPrintTextFont(str, font3x3, 24, 1); - + snprintf(str, 8, "F=%d", ptrResources->Food); - + GfxPrintTextFont(str, font3x3, 48, 1); } diff --git a/Gfx.h b/Gfx.h index 64ce920..f6a9790 100644 --- a/Gfx.h +++ b/Gfx.h @@ -6,7 +6,9 @@ * *************************************/ #include "Global_Inc.h" -#include "GameStructures.h" +#include "System.h" +#include "Player.h" +#include "Camera.h" #ifdef __cplusplus extern "C" @@ -16,7 +18,7 @@ extern "C" /* ************************************* * Defines * *************************************/ - + #define X_SCREEN_RESOLUTION 84 #define Y_SCREEN_RESOLUTION 48 @@ -28,16 +30,17 @@ extern "C" #define GFX_NOFLIP 0 #define GFX_FLIPH 1 #define GFX_FLIPV 2 -#define GFX_FLIPHV 3 +#define GFX_FLIPHV (GFX_FLIPH | GFX_FLIPV) +#define GFX_NOROT 0 #define GFX_ROTCCW 1 #define GFX_ROTCW 3 /* ************************************* * Structs and enums * *************************************/ - -typedef struct + +typedef struct t_sprite { int8_t x; int8_t y; @@ -46,31 +49,35 @@ typedef struct uint8_t rotation; uint8_t flip; uint8_t color; - const uint8_t * Data; + const uint8_t* Data; }TYPE_SPRITE; +typedef struct t_Resource TYPE_RESOURCES; +typedef struct t_Camera TYPE_CAMERA; + /* ************************************* * Global prototypes * *************************************/ - -void GfxDrawSprite(TYPE_SPRITE * ptrSprite); -void GfxDrawCircle(uint16_t x, uint16_t y, uint8_t radius, int8_t color); -void GfxDrawRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color); -void GfxFillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color); -bool GfxRefreshNeeded(void); -void GfxShowKeyboard(char * str, uint8_t length); -uint8_t GfxGetWidthFromSpriteData(const uint8_t * sprData); -uint8_t GfxGetHeightFromSpriteData(const uint8_t * sprData); -bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE * spr); -void GfxClearScreen(void); + +void GfxDrawSprite(TYPE_SPRITE * ptrSprite); +void GfxDrawCircle(uint16_t x, uint16_t y, uint8_t radius, int8_t color); +void GfxDrawRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color); +void GfxFillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color); +void GfxDrawLine(uint8_t x0, uint8_t x1, uint8_t y0, uint8_t y1, uint8_t color); +bool GfxRefreshNeeded(void); +void GfxShowKeyboard(char* str, uint8_t length); +uint8_t GfxGetWidthFromSpriteData(const uint8_t* sprData); +uint8_t GfxGetHeightFromSpriteData(const uint8_t* sprData); +bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE * spr); +void GfxClearScreen(void); #ifdef __cplusplus -void GfxPrintText_Flash(const __FlashStringHelper * str); +void GfxPrintText_Flash(const __FlashStringHelper * str); #endif // __cplusplus -void GfxPrintText(const char * str, uint8_t x, uint8_t y); -void GfxPrintTextFont(const char * str, const uint8_t * font, uint8_t x, uint8_t y); -void GfxShowResources(TYPE_RESOURCES * ptrResources); -void GfxInit(void); -void GfxRenderTiles(TYPE_CAMERA * ptrCamera); +void GfxPrintText(const char* str, uint8_t x, uint8_t y); +void GfxPrintTextFont(const char* str, const uint8_t* font, uint8_t x, uint8_t y); +void GfxShowResources(TYPE_RESOURCES* ptrResources); +void GfxInit(void); +void GfxRenderTiles(TYPE_CAMERA* ptrCamera); #ifdef __cplusplus } diff --git a/Global_Inc.h b/Global_Inc.h index fcac2eb..415fc00 100644 --- a/Global_Inc.h +++ b/Global_Inc.h @@ -12,9 +12,7 @@ #include #include #include -#include "System.h" #include "settings.c" -#include "GameStructures.h" #ifdef __cplusplus #include @@ -25,6 +23,10 @@ * Defines * *************************************/ +#define DEBUG_VAR(x) char buffer[8]; \ + snprintf(buffer, sizeof(buffer), "%d", x); \ + GfxPrintText(buffer, X_SCREEN_RESOLUTION - (strlen(buffer)<<3), Y_SCREEN_RESOLUTION - 10) + /* ************************************* * Structs and enums * *************************************/ diff --git a/Libs/libarduino/Makefile b/Libs/libarduino/Makefile index 04253ec..eb324b6 100644 --- a/Libs/libarduino/Makefile +++ b/Libs/libarduino/Makefile @@ -2,28 +2,31 @@ include ../../Makefile.cfg PROJECT=arduino LIBNAME=lib$(PROJECT).a -INCDIR=../../../include/$(PROJECT) + +INCLUDE_FOLDER=../../../include/$(PROJECT) LIBS_FOLDER=../../../lib OBJECTS= wiring.o wiring_analog.o wiring_digital.o \ wiring_pulse.o wiring_shift.o HardwareSerial.o Print.o \ Tone.o WMath.o WString.o WInterrupts.o forward.o SPI.o -default: $(OBJECTS) - avr-ar rcs $(LIBNAME) $^ - mkdir -p $(INCDIR) - cp *.h $(INCDIR)/ - mkdir -p $(LIBS_FOLDER) - mv $(LIBNAME) $(LIBS_FOLDER) - avr-size $(LIBS_FOLDER)/$(LIBNAME) +default: $(LIBNAME) + cp *.h $(INCLUDE_FOLDER)/$(PROJECT) +$(LIBNAME): $(OBJECTS) + avr-ar rcs $@ $^ + mkdir -p $(INCLUDE_FOLDER)/$(PROJECT) + mv $@ $(LIBS_FOLDER) + avr-size $(LIBS_FOLDER)/$@ + %.o: %.cpp - $(CXX) $< -o $@ $(DEFINE) $(INCLUDE) $(CC_FLAGS) + $(CXX) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) %.o: %.c - $(CC) $< -o $@ $(DEFINE) $(INCLUDE) $(CC_FLAGS) + $(CC) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) clean: - rm -f *.o + rm -f $(OBJECTS) + rm -f $(LIBS_FOLDER)/$(LIBNAME) -.PHONY: default +.PHONY: default clean diff --git a/Libs/libgamebuino/Makefile b/Libs/libgamebuino/Makefile index e1facfb..b7aa854 100644 --- a/Libs/libgamebuino/Makefile +++ b/Libs/libgamebuino/Makefile @@ -12,12 +12,14 @@ CFLAGS=-mmcu=$(MCU) $(CPU_SPEED) -Wall -Os -c -ffunction-sections -fdata-section OBJECTS= Backlight.o Battery.o Buttons.o Display.o font3x3.o \ font3x5.o font5x7.o Gamebuino.o settings.o Sound.o -default: $(OBJECTS) - avr-ar rcs $(LIBNAME).a $^ - mkdir -p $(INCLUDE_FOLDER)/$(PROJECT) +default: $(LIBNAME) cp *.h $(INCLUDE_FOLDER)/$(PROJECT) - cp settings.c $(INCLUDE_FOLDER)/$(PROJECT) - mv $(LIBNAME).a $(LIBS_FOLDER) + +$(LIBNAME): $(OBJECTS) + avr-ar rcs $@ $^ + mkdir -p $(INCLUDE_FOLDER)/$(PROJECT) + mv $@ $(LIBS_FOLDER) + avr-size $(LIBS_FOLDER)/$@ %.o: %.cpp $(CXX) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) @@ -25,7 +27,8 @@ default: $(OBJECTS) %.o: %.c $(CC) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) - clean: - rm -f *.o - rm -f $(LIBS_FOLDER)/$(LIBNAME).a + rm -f $(OBJECTS) + rm -f $(LIBS_FOLDER)/$(LIBNAME) + +.PHONY: default clean diff --git a/Libs/petit_fatfs/Makefile b/Libs/petit_fatfs/Makefile index 83ddb2d..07aaadc 100644 --- a/Libs/petit_fatfs/Makefile +++ b/Libs/petit_fatfs/Makefile @@ -11,12 +11,14 @@ LIBNAME=lib$(PROJECT).a OBJECTS=mmc.o petit_fatfs.o pff.o -default: $(OBJECTS) - avr-ar rcs $(LIBNAME) $^ +default: $(LIBNAME) + cp *.h $(INCLUDE_FOLDER)/$(PROJECT) + +$(LIBNAME): $(OBJECTS) + avr-ar rcs $@ $^ mkdir -p $(INCLUDE_FOLDER)/$(PROJECT) - cp *.h $(INCLUDE_FOLDER)//$(PROJECT) - mv $(LIBNAME) $(LIBS_FOLDER) - avr-size $(LIBS_FOLDER)/$(LIBNAME) + mv $@ $(LIBS_FOLDER) + avr-size $(LIBS_FOLDER)/$@ %.o: %.cpp $(CXX) $< -o $@ $(DEFINE) $(INCLUDE) $(CC_FLAGS) @@ -27,3 +29,5 @@ default: $(OBJECTS) clean: rm -f $(OBJECTS) rm -f $(LIBS_FOLDER)/$(LIBNAME) + +.PHONY: default clean diff --git a/Libs/tinyFAT/Makefile b/Libs/tinyFAT/Makefile index 2640178..df0650b 100644 --- a/Libs/tinyFAT/Makefile +++ b/Libs/tinyFAT/Makefile @@ -10,12 +10,14 @@ LIBNAME=lib$(PROJECT).a OBJECTS=mmc.o tinyFAT.o -default: $(OBJECTS) - avr-ar rcs $(LIBNAME) $^ - mkdir -p $(INCLUDE_FOLDER)/$(PROJECT) +default: $(LIBNAME) cp *.h $(INCLUDE_FOLDER)/$(PROJECT) - mv $(LIBNAME) $(LIBS_FOLDER) - avr-size $(LIBS_FOLDER)/$(LIBNAME) + +$(LIBNAME): $(OBJECTS) + avr-ar rcs $@ $^ + mkdir -p $(INCLUDE_FOLDER)/$(PROJECT) + mv $@ $(LIBS_FOLDER) + avr-size $(LIBS_FOLDER)/$@ %.o: %.cpp $(CXX) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) @@ -26,3 +28,5 @@ default: $(OBJECTS) clean: rm -f $(OBJECTS) rm -f $(LIBS_FOLDER)/$(LIBNAME) + +.PHONY: default clean diff --git a/Makefile b/Makefile index 148c236..abd17f8 100644 --- a/Makefile +++ b/Makefile @@ -13,11 +13,13 @@ OBJ_DIR = Obj SRC_DIR = . OBJECTS=$(addprefix $(OBJ_DIR)/,main.o Gameplay.o System.o Gfx.o Pad.o \ - Player.o Camera.o Unit.o Menu.o Building.o) + Player.o Camera.o Unit.o Menu.o ) + +DEPS = $(OBJECTS:.o=.d) build: libs $(EXE_DIR)/$(PROJECT).HEX avr-size $(EXE_DIR)/$(PROJECT).ELF - + rebuild: make clean make build @@ -28,25 +30,38 @@ libs: make -C Libs/petit_fatfs make -C Libs/tinyFAT +run: $(EXE_DIR)/$(PROJECT).ELF + $(GBSIM) $^ + +depend: $(DEPS) + +$(OBJ_DIR)/%.d: $(SRC_DIR)/%.c + $(CC) $< $(DEFINE) $(INCLUDE) -M -MF $@ + +$(OBJ_DIR)/%.d: $(SRC_DIR)/%.cpp + $(CXX) $< $(DEFINE) $(INCLUDE) -M -MF $@ + +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(OBJ_DIR)/%.d + $(CXX) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) + +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(OBJ_DIR)/%.d + $(CC) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) + +-include $(DEPS) + clean: rm *.elf -f - rm $(OBJ_DIR)/*.o -f + rm $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d -f make -C $$PWD/Libs/libarduino clean - make -C $$PWD/Libs/libgamebuino clean + make -C $$PWD/Libs/libgamebuino clean make -C $$PWD/Libs/petit_fatfs clean make -C $$PWD/Libs/tinyFAT clean - -$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp - $(CXX) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) - -$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c - $(CC) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) - + $(EXE_DIR)/$(PROJECT).ELF: $(OBJECTS) mkdir -p $(EXE_DIR) - $(LINKER) $^ -o $@ -g $(DEFINE) $(LIBS) $(INCLUDE) -flto -Xlinker -Map=$(EXE_DIR)/POCKET.MAP -Wl,-emain -Wl,--gc-sections - + $(LINKER) $^ -o $@ -g $(DEFINE) $(LIBS) $(INCLUDE) -flto -Xlinker -Map=$(EXE_DIR)/POCKET.MAP -Wl,-emain -Wl,--gc-sections + $(EXE_DIR)/$(PROJECT).HEX: $(EXE_DIR)/$(PROJECT).ELF avr-objcopy -j.text -j.data -j.bss -O ihex $^ $@ -.PHONY: all libs clean +.PHONY: all libs clean run depend diff --git a/Makefile.cfg b/Makefile.cfg index b624476..04e5900 100644 --- a/Makefile.cfg +++ b/Makefile.cfg @@ -2,12 +2,15 @@ CC=avr-gcc CXX=avr-g++ LINKER=$(CXX) -MCU=atmega328p +MCU=atmega328p CPU_SPEED=16000000UL ARDUINO_VERSION=150 AVR_TOOLCHAIN_PATH=/usr/local/avr/ +GBSIM_PATH = ~/gbsim/build + PATH := $(PATH):$(AVR_TOOLCHAIN_PATH)/bin/ +GBSIM = $(GBSIM_PATH)/gbsim DEFINE = -DARDUINO=$(ARDUINO_VERSION) -mmcu=$(MCU) -DF_CPU=$(CPU_SPEED) diff --git a/Menu.cpp b/Menu.cpp index 06d5c18..85c36ae 100644 --- a/Menu.cpp +++ b/Menu.cpp @@ -1,39 +1,41 @@ /* ************************************** * Includes * * **************************************/ - + #include "Menu.h" - +#include "Player.h" +#include "Gameplay.h" + /* ************************************** * Defines * * **************************************/ - + /* ************************************** * Local variables * * **************************************/ - + static const char MainMenuOption_0[] PROGMEM = "Single player game"; static const char MainMenuOption_1[] PROGMEM = "Multiplayer game"; static const char MainMenuOption_2[] PROGMEM = "Options"; static const char MainMenuOption_3[] PROGMEM = "Quit"; - -static const char * const MainMenuOptions[] PROGMEM = { MainMenuOption_0, + +static const char* const MainMenuOptions[] PROGMEM = { MainMenuOption_0, MainMenuOption_1, MainMenuOption_2, MainMenuOption_3 }; - + void MenuGetPlayerName(Player * ptrPlayer) { memset(ptrPlayer->getName(), 0, PLAYER_NAME_LENGTH); gb.getDefaultName(ptrPlayer->getName()); } - + void MainMenu(void) { //int8_t menu(const char* const* items, uint8_t length); - + uint8_t choice = gb.menu(MainMenuOptions, 3); - + switch(choice) { case 0: @@ -44,9 +46,9 @@ void MainMenu(void) break; break; case 2: - + break; - + default: break; } diff --git a/Menu.h b/Menu.h index ef29f4e..35c8108 100644 --- a/Menu.h +++ b/Menu.h @@ -4,15 +4,13 @@ /* ************************************** * Includes * * **************************************/ - + #include "Global_Inc.h" -#include "Player.h" -#include "Gameplay.h" /* ************************************** * Global prototypes * * **************************************/ - + void MainMenu(void); - + #endif // __MENU_HEADER__ diff --git a/MouseSpr.c b/MouseSpr.c index ac40958..4f5999a 100644 --- a/MouseSpr.c +++ b/MouseSpr.c @@ -1,13 +1,13 @@ const uint8_t PROGMEM MouseSprData[] = { 8,8, //width and height - B11111100, - B10000100, - B10001000, - B10000100, - B10100010, - B11010001, - B00001010, - B00000100, + B11111100, + B10000100, + B10001000, + B10000100, + B10100010, + B11010001, + B00001010, + B00000100, }; diff --git a/Pad.cpp b/Pad.cpp index 15a9092..6c3685d 100644 --- a/Pad.cpp +++ b/Pad.cpp @@ -7,11 +7,11 @@ /* ************************************* * Defines * *************************************/ - + /* ************************************* * Structs and enums * *************************************/ - + bool PadButtonReleased(PAD_BUTTONS btn) { return gb.buttons.released(btn); diff --git a/Pad.h b/Pad.h index 1c8cb4c..a89b308 100644 --- a/Pad.h +++ b/Pad.h @@ -4,18 +4,18 @@ /* ************************************** * Includes * * **************************************/ - + #include "Global_Inc.h" /* ************************************** * Defines * * **************************************/ - + /* ************************************** * Structs and enums * * **************************************/ //BTN_A, BTN_B, BTN_C, BTN_UP, BTN_RIGHT, BTN_DOWN, BTN_LEFT - + #ifdef __cplusplus extern "C" { @@ -32,11 +32,11 @@ typedef enum t_padbuttons PAD_UP = BTN_UP, PAD_DOWN = BTN_DOWN, }PAD_BUTTONS; - + /* ************************************** * Global prototypes * * **************************************/ - + bool PadButtonReleased(PAD_BUTTONS btn); bool PadButtonPressed(PAD_BUTTONS btn); bool PadButtonPressedFrames(PAD_BUTTONS btn, uint8_t frames); diff --git a/PeasantSpr.c b/PeasantSpr.c index 873b7f4..7e78764 100644 --- a/PeasantSpr.c +++ b/PeasantSpr.c @@ -4,27 +4,27 @@ const uint8_t PROGMEM Peasant_Walking_SprData[] = { 8,8, //width and height - 0x60, - 0xBC, - 0xC2, - 0x99, - 0xA5, - 0x67, - 0x1D, - 0x02, + 0x60, + 0xBC, + 0xC2, + 0x99, + 0xA5, + 0x67, + 0x1D, + 0x02, }; const uint8_t PROGMEM Peasant_SprData[] = { 8,8, //width and height - 0x00, - 0x3C, - 0x42, - 0x99, - 0xA5, - 0x66, - 0x18, - 0x00, + 0x00, + 0x3C, + 0x42, + 0x99, + 0xA5, + 0x66, + 0x18, + 0x00, }; diff --git a/Player.cpp b/Player.cpp index 46a6fd0..634bb9f 100644 --- a/Player.cpp +++ b/Player.cpp @@ -1,17 +1,19 @@ /* ************************************** * Includes * * **************************************/ - + #include "Player.h" - +#include "Pad.h" +#include + /* ************************************** * Defines * * **************************************/ - -#define CANCEL_SELECTION_NO_FRAMES 5 + #define ACCEPT_UNIT_BUILDING_OPTIONS_FRAMES 5 #define MAX_SELECTION_DIST 400 - +#define NO_SELECTION -1 + /* ************************************** * Local variables * * **************************************/ @@ -22,55 +24,50 @@ Player::Player(void) Player::~Player(void) { - + } void Player::Init(void) { uint8_t i; - + unit_i = 0; - bldg_i = 0; - - selectedUnit = NULL; - selectedBuilding = NULL; - + + selectedUnitCandidate = NO_SELECTION; + CameraInit(&Camera); - BuildingInit(); UnitInit(); - - for(i = 0; i < PLAYER_MAX_BUILDINGS; i++) - { - memset(&buildings[i], 0, sizeof(TYPE_BUILDING)); - } - - for(i = 0; i < PLAYER_MAX_UNITS; i++) + + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) { memset(&units[i], 0, sizeof(TYPE_UNIT)); } - - TYPE_COLLISION_BLOCK cl; - + + TYPE_COLLISION_BLOCK cb; + Resources.Wood = 25; Resources.Gold = 50; Resources.Food = 75; - - cl.x = SystemRand(0, 20); - cl.y = SystemRand(0, 20); - cl.w = BuildingGetWidthFromID(BARRACKS); - cl.h = BuildingGetHeightFromID(BARRACKS); - - if(createBuilding(BARRACKS, cl) == false) + + cb.x = SystemRand(0, 20); + cb.y = SystemRand(0, 20); + + if (createUnit(BARRACKS, cb) == false) { GfxPrintText_Flash(F("Failed to create building!")); } - - cl.x = SystemRand(48, 56); - cl.y = SystemRand(48, 56); - cl.w = UnitGetWidthFromID(PEASANT); - cl.h = UnitGetHeightFromID(PEASANT); - - if(createUnit(PEASANT, cl) == false) + + cb.x = SystemRand(48, 56); + cb.y = SystemRand(48, 56); + cb.w = UnitGetWidthFromID(PEASANT); + cb.h = UnitGetHeightFromID(PEASANT); + + showActionsMenu_counter = 0; + showActionsMenu_index = 0; + showActionsMenu = false; + anyUnitSelected = false; + + if (createUnit(PEASANT, cb) == false) { GfxPrintText_Flash(F("Failed to create unit!")); } @@ -78,68 +75,71 @@ void Player::Init(void) void Player::showHealth(uint8_t hp) { + enum + { + HP_TEXT_X = 4, + HP_TEXT_Y = Y_SCREEN_RESOLUTION - 4, + }; + char str[8]; - + GfxFillRectangle(0, Y_SCREEN_RESOLUTION - 5, X_SCREEN_RESOLUTION, 8, GFX_WHITE); - snprintf(str, 8, "HP=%u", hp); + snprintf(str, sizeof(str), "HP=%u", hp); - GfxPrintTextFont(str, font3x3, 4, Y_SCREEN_RESOLUTION - 4); + GfxPrintTextFont(str, font3x3, HP_TEXT_X, HP_TEXT_Y); } void Player::DrawHandler(void) { + enum + { + PROGRESS_BAR_X = X_SCREEN_RESOLUTION - 16, + PROGRESS_BAR_Y = Y_SCREEN_RESOLUTION - 4, + PROGRESS_BAR_W = ACCEPT_UNIT_BUILDING_OPTIONS_FRAMES << 1, + PROGRESS_BAR_H = 3, + }; + uint8_t i; bool bAnyoneSelected = false; - + //GfxRenderTiles(&Camera); - - for(i = 0; i < PLAYER_MAX_BUILDINGS; i++) + + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) { - TYPE_BUILDING * b = &buildings[i]; - - if(b->built == false) + TYPE_UNIT* u = &units[i]; + + if (u->alive == false) { continue; } - - bool selected = (b == selectedBuilding); - BuildingDraw(&Camera, b, selected); - - if( (b->selected == true) && (bAnyoneSelected == false) ) + + bool selected = false; + + if (selectedUnitCandidate != NO_SELECTION) + { + selected = (i == selectedUnitCandidate); + } + + UnitDraw(u, &Camera, selected); + + if ( (u->selected == true) && (bAnyoneSelected == false) ) { bAnyoneSelected = true; - - showHealth(b->hp); - BuildingSelectedOptions(b); - } - } - - for(i = 0; i < PLAYER_MAX_UNITS; i++) - { - TYPE_UNIT * u = &units[i]; - - if(u->alive == false) - { - continue; - } - - bool selected = (u == selectedUnit); - UnitDraw(&Camera, u, selected); - - if( (u->selected == true) && (bAnyoneSelected == false) ) - { - bAnyoneSelected = true; - + showHealth(u->hp); - UnitSelectedOptions(u); } } - - if(progress_bar != 0) - { - GfxDrawRectangle(X_SCREEN_RESOLUTION - 16, Y_SCREEN_RESOLUTION - 4, progress_bar, 2, GFX_BLACK); - } + + if (bAnyoneSelected == true) + { + GfxDrawRectangle(PROGRESS_BAR_X, PROGRESS_BAR_Y, PROGRESS_BAR_W, PROGRESS_BAR_H, GFX_BLACK); + + if (showActionsMenu_counter != 0) + { + GfxFillRectangle(PROGRESS_BAR_X, PROGRESS_BAR_Y, showActionsMenu_counter << 1, PROGRESS_BAR_H, GFX_BLACK); + } + } } bool Player::checkNewBuildingPosition(TYPE_COLLISION_BLOCK * cb) @@ -148,22 +148,23 @@ bool Player::checkNewBuildingPosition(TYPE_COLLISION_BLOCK * cb) TYPE_COLLISION_BLOCK bldgCB; bool success; static uint8_t max_tries = 0; - - for(i = 0; i < PLAYER_MAX_BUILDINGS; i++) + + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) { + TYPE_UNIT* ptrUnit = &units[i]; success = false; - - if(buildings[i].built == false) + + if (ptrUnit->building == false) { continue; } - - bldgCB.x = buildings[i].x; - bldgCB.y = buildings[i].y; - bldgCB.w = BuildingGetWidthFromID(buildings[i].id); - bldgCB.h = BuildingGetHeightFromID(buildings[i].id); - - if(SystemCollisionCheck(*cb, bldgCB) == true) + + bldgCB.x = ptrUnit->x; + bldgCB.y = ptrUnit->y; + bldgCB.w = UnitGetWidthFromID(ptrUnit->id); + bldgCB.h = UnitGetHeightFromID(ptrUnit->id); + + if (SystemCollisionCheck(*cb, bldgCB) == true) { success = false; } @@ -171,15 +172,15 @@ bool Player::checkNewBuildingPosition(TYPE_COLLISION_BLOCK * cb) { success = true; } - - if(success == false) + + if (success == false) { cb->x = SystemRand(0, 128); cb->y = SystemRand(0, 128); - - if(++max_tries < 16) - { - if(checkNewBuildingPosition(cb) == false) + + if (++max_tries < 16) + { + if (checkNewBuildingPosition(cb) == false) { return false; } @@ -194,332 +195,366 @@ bool Player::checkNewBuildingPosition(TYPE_COLLISION_BLOCK * cb) } } } - + max_tries = 0; return true; } -bool Player::createBuilding(TYPE_BUILDING_ID id, TYPE_COLLISION_BLOCK cb) +bool Player::createUnit(TYPE_UNIT_ID id, TYPE_COLLISION_BLOCK cb) { - if(checkNewBuildingPosition(&cb) == false) + if (unit_i < PLAYER_MAX_UNITS_BUILDINGS) { - return false; - } + TYPE_UNIT* ptrNewUnit = &units[unit_i]; + ptrNewUnit->id = id; + ptrNewUnit->x = cb.x; + ptrNewUnit->y = cb.y; + ptrNewUnit->hp = UnitGetHpFromID(id); + ptrNewUnit->alive = true; - if(bldg_i < PLAYER_MAX_BUILDINGS) - { - buildings[bldg_i].id = id; - buildings[bldg_i].x = cb.x; - buildings[bldg_i].y = cb.y; - buildings[bldg_i].hp = BuildingGetHpFromID(id); - buildings[bldg_i].built = true; - - bldg_i++; - - return true; - } - else - { - return false; - } - - return false; -} + ptrNewUnit->building = (id > MAX_UNIT_ID); -bool Player::createUnit(uint8_t id, TYPE_COLLISION_BLOCK cb) -{ - if(unit_i < PLAYER_MAX_UNITS) - { - units[unit_i].id = id; - units[unit_i].x = cb.x; - units[unit_i].y = cb.y; - units[unit_i].hp = UnitGetHpFromID(id); - units[unit_i].alive = true; - unit_i++; - + return true; } else { return false; } - + return false; } TYPE_COLLISION_BLOCK Player::GetCursorPos(void) { TYPE_COLLISION_BLOCK cb; - + cb.x = (X_SCREEN_RESOLUTION >> 1) - 4 - Camera.X_Offset; cb.y = (Y_SCREEN_RESOLUTION >> 1) - 4 - Camera.Y_Offset; cb.w = 8; cb.h = 8; - + return cb; } void Player::UnitBuildingSelection(void) { uint16_t i; - TYPE_UNIT * nearest_unit = NULL; uint32_t nearest_unit_dist = 0xFFFFFFFF; // Set maximum value uint32_t dist; - - for(i = 0; i < PLAYER_MAX_UNITS; i++) + + int8_t nearest_unit = NO_SELECTION; + + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) { - TYPE_UNIT * u = &units[i]; - - if( (u->alive == false) || (u->selected == true) ) + TYPE_UNIT* u = &units[i]; + + if ( (u->alive == false) || (u->selected == true) ) { continue; } - + TYPE_COLLISION_BLOCK cursor_cb = GetCursorPos(); TYPE_COLLISION_BLOCK u_cb = {u->x, u->y, UnitGetWidthFromID(u->id), UnitGetHeightFromID(u->id) }; - - uint16_t dist_x = (u_cb.x - cursor_cb.x); - uint16_t dist_y = (u_cb.y - cursor_cb.y); - + + uint16_t dist_x = (u_cb.x + (u_cb.w >> 1) - cursor_cb.x); + uint16_t dist_y = (u_cb.y + (u_cb.h >> 1) - cursor_cb.y); + dist = (dist_x * dist_x) + (dist_y * dist_y); - - if(dist < nearest_unit_dist) + + if (dist < nearest_unit_dist) { nearest_unit_dist = dist; - nearest_unit = u; + nearest_unit = (int8_t)i; } } - - TYPE_BUILDING * nearest_building = NULL; - uint32_t nearest_building_dist = 0xFFFFFFFF; // Set maximum value - - for(i = 0; i < PLAYER_MAX_BUILDINGS; i++) - { - TYPE_BUILDING * b = &buildings[i]; - - if( (b->built == false) || (b->selected == true) ) - { - continue; - } - - TYPE_COLLISION_BLOCK cursor_cb = GetCursorPos(); - TYPE_COLLISION_BLOCK u_cb = {b->x, b->y, BuildingGetWidthFromID(b->id), BuildingGetHeightFromID(b->id) }; - - uint16_t dist_x = (u_cb.x + (u_cb.w >> 1) - cursor_cb.x + 4); - uint16_t dist_y = (u_cb.y + (u_cb.h >> 1) - cursor_cb.y + 4); - - dist = (dist_x * dist_x) + (dist_y * dist_y); - - if(dist < nearest_building_dist) - { - nearest_building_dist = dist; - nearest_building = b; - } - } - - if(nearest_building_dist <= nearest_unit_dist) - { - selectedUnit = NULL; - selectedBuilding = nearest_building; - } - else - { - selectedUnit = nearest_unit; - selectedBuilding = NULL; - } - - if( (nearest_unit_dist > MAX_SELECTION_DIST) - && - (nearest_building_dist > MAX_SELECTION_DIST) ) - { - selectedUnit = NULL; - selectedBuilding = NULL; - } - - /*char buf[8]; - - snprintf(buf, 8, "%lu", nearest_building_dist); - - GfxPrintText(buf, X_SCREEN_RESOLUTION - 32, 16); - - snprintf(buf, 8, "%lu", nearest_unit_dist); - - GfxPrintText(buf, X_SCREEN_RESOLUTION - 32, 24);*/ + + selectedUnitCandidate = nearest_unit; } -void Player::BuildingUnitActions(void) +void Player::ActionsMenu(void) { - const char* pActionStr = NULL; - - for(uint8_t i = 0; i < PLAYER_MAX_BUILDINGS; i++) - { - if(buildings[i].selected == true) - { - BuildingSelectedOptions(selectedBuilding); - break; - } - } - - if(pActionStr == NULL) - { - for(uint8_t i = 0; i < PLAYER_MAX_UNITS; i++) - { - if(units[i].selected == true) - { - pActionStr = UnitSelectedOptions(selectedUnit); - break; - } - } - } - - if(pActionStr != NULL) - { - GfxPrintTextFont(pActionStr, font3x3, 48, Y_SCREEN_RESOLUTION - 4); - } + if (showActionsMenu == true) + { + for (uint8_t i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) + { + TYPE_UNIT* ptrUnit = &units[i]; + + if (ptrUnit->selected == true) + { + uint8_t availableActions = UnitGetAvailableActions(ptrUnit); + + if (!(availableActions & (1 << showActionsMenu_index) ) ) + { + IncreaseShowActionsMenuIndex(); + } + + UNIT_ACTION action = (UNIT_ACTION) (showActionsMenu_index); + + const char* str = UnitGetActionString(action); + + GfxPrintText(str, 40, Y_SCREEN_RESOLUTION - 4); + + break; + } + + } + } + } void Player::Handler(void) -{ +{ + CameraSetLock(&Camera, showActionsMenu); + CameraHandler(&Camera); - + UnitBuildingSelection(); - - for(uint8_t i = 0; i < PLAYER_MAX_UNITS; i++) + + for (uint8_t i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) { - TYPE_UNIT * ptrUnit = &units[i]; - + TYPE_UNIT* ptrUnit = &units[i]; + UnitHandler(ptrUnit); } + ActionsMenu(); + ButtonHandler(); - - BuildingUnitActions(); - + GfxShowResources(&Resources); } void Player::ButtonHandler(void) { - static bool bCancelSelection = false; - - if(PadButtonPressed(PAD_A) == true) - { - if(progress_bar < ACCEPT_UNIT_BUILDING_OPTIONS_FRAMES) - { - progress_bar++; - } - } - - if(PadButtonReleased(PAD_A) == true) - { - /*TYPE_COLLISION_BLOCK cl; - - cl.x = SystemRand(0, 32); - cl.y = SystemRand(0, 32); - cl.w = BuildingGetWidthFromID(BARRACKS); - cl.h = BuildingGetHeightFromID(BARRACKS); - - if(createBuilding(BARRACKS, cl) == false) - { - GfxPrintText_Flash(F("Failed!")); - } - else - { - GfxPrintText_Flash(F("Building built!\0")); - }*/ - - for(uint8_t i = 0; i < PLAYER_MAX_UNITS; i++) - { - TYPE_UNIT * u = &units[i]; - - if(selectedUnit == u) - { - u->selected = true; - } - } - - for(uint8_t i = 0; i < PLAYER_MAX_BUILDINGS; i++) - { - TYPE_BUILDING * b = &buildings[i]; - - if(selectedBuilding == b) - { - b->selected = true; - } - } - } - else if(PadButtonPressedFrames(PAD_A, ACCEPT_UNIT_BUILDING_OPTIONS_FRAMES) == true) - { - for(uint8_t i = 0; i < PLAYER_MAX_UNITS; i++) - { - TYPE_UNIT* u = &units[i]; - - if(u->selected == true) - { - UnitAcceptAction(u); - break; - } - } - } - else if( (PadButtonPressedFrames(PAD_B, CANCEL_SELECTION_NO_FRAMES) == true) - && - (bCancelSelection == false) ) - { - for(uint8_t i = 0; i < PLAYER_MAX_UNITS; i++) - { - TYPE_UNIT * u = &units[i]; - - u->selected = false; - } - - for(uint8_t i = 0; i < PLAYER_MAX_BUILDINGS; i++) - { - TYPE_BUILDING * b = &buildings[i]; - - b->selected = false; - } - - selectedUnit = NULL; - selectedBuilding = NULL; - - bCancelSelection = true; - showUnitBuildingOptions = true; - } - else - { - // Button A is not pressed. Reset progress bar. - progress_bar = 0; - } + if (PadButtonPressed(PAD_A) == true) + { + ButtonAPressed(); + } + else if (PadButtonReleased(PAD_A) == true) + { + ButtonAReleased(); + } + else if (PadButtonPressed(PAD_B) == true) + { + ButtonBPressed(); + } + else if (PadButtonReleased(PAD_B) == true) + { + ButtonBReleased(); + } + else if (PadButtonReleased(PAD_LEFT) == true) + { + ButtonLeftReleased(); + } + else if (PadButtonReleased(PAD_RIGHT) == true) + { + ButtonRightReleased(); + } + - if( (PadButtonReleased(PAD_B) == true) - && - (bCancelSelection == false) ) - { - if(showUnitBuildingOptions == false) - { - TYPE_COLLISION_BLOCK cursor = GetCursorPos(); - - for(uint8_t i = 0; i < PLAYER_MAX_UNITS; i++) - { - TYPE_UNIT * u = &units[i]; - - if(u->selected == true) - { - UnitMoveTo(u, cursor.x, cursor.y); - } - } - } - else - { - showUnitBuildingOptions = false; - } - } - else if( (PadButtonReleased(PAD_B) == true) - && - (bCancelSelection == true) ) - { - bCancelSelection = false; - UnitResetMenuLevel(); - } +} + +void Player::ButtonAPressed(void) +{ + // Only increase progress bar when any unit has been previously selected + if (anyUnitSelected == true) + { + if (showActionsMenu == false) + { + if (showActionsMenu_counter < ACCEPT_UNIT_BUILDING_OPTIONS_FRAMES) + { + showActionsMenu_counter++; + } + } + } +} + + +void Player::ButtonAReleased(void) +{ + if (showActionsMenu_counter < ACCEPT_UNIT_BUILDING_OPTIONS_FRAMES) + { + if (selectedUnitCandidate != NO_SELECTION) + { + // When actions menu is not active, select unit if + // a candidate is present + TYPE_UNIT* ptrUnit = &units[selectedUnitCandidate]; + + ptrUnit->selected = true; + anyUnitSelected = true; + showActionsMenu_index = 0; + } + + showActionsMenu_counter = 0; + } + else if (showActionsMenu == true) + { + uint8_t i = 0; + + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) + { + TYPE_UNIT* ptrUnit = &units[i]; + + if (ptrUnit->selected == true) + { + if (showActionsMenu_index == ACTION_CREATE_UNIT) + { + uint8_t w = UnitGetWidthFromID(ptrUnit->id); + uint8_t h = UnitGetHeightFromID(ptrUnit->id); + uint8_t new_pos_x = ptrUnit->x + SystemRand(w, w + (w >> 1)); + uint8_t new_pos_y = ptrUnit->y + SystemRand(h, h + (h >> 1)); + TYPE_COLLISION_BLOCK cb = {.x = new_pos_x, .y = new_pos_y}; + + createUnit(PEASANT, cb); + + break; + } + } + } + } + + showActionsMenu = (showActionsMenu_counter < ACCEPT_UNIT_BUILDING_OPTIONS_FRAMES)? false: true; +} + +void Player::ButtonBPressed(void) +{ + enum + { + CANCEL_SELECTION_FRAMES = 5 + }; + + if (anyUnitSelected == true) + { + if (unselectUnits_counter < CANCEL_SELECTION_FRAMES) + { + unselectUnits_counter++; + } + else + { + if (anyUnitSelected == true) + { + uint8_t i; + + // Cancel selection of all units + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) + { + TYPE_UNIT* ptrUnit = &units[i]; + + if (ptrUnit->selected == true) + { + ptrUnit->selected = false; + } + } + + // Reset accumulated counter and flags + unselectUnits_counter = 0; + anyUnitSelected = false; + showActionsMenu = false; + showActionsMenu_counter = 0; + } + } + } +} + +void Player::ButtonBReleased(void) +{ + if (anyUnitSelected == true) + { + TYPE_COLLISION_BLOCK cursor = GetCursorPos(); + uint8_t i; + + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) + { + TYPE_UNIT* ptrUnit = &units[i]; + + if (ptrUnit->selected == true) + { + UnitMoveTo(ptrUnit, cursor.x, cursor.y); + } + } + } + + // Reset accumulated counter + unselectUnits_counter = 0; +} + + +void Player::ButtonLeftReleased(void) +{ + if (showActionsMenu == true) + { + uint8_t i; + + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) + { + TYPE_UNIT* ptrUnit = &units[i]; + + if (ptrUnit->selected == true) + { + // We need to iterate over all available actions + // for current unit. + uint8_t availableActions = UnitGetAvailableActions(ptrUnit); + + DEBUG_VAR(availableActions); + + for (uint8_t j = showActionsMenu_index - 1; j != showActionsMenu_index ; j--) + { + if (j > (sizeof(uint8_t) << 3)) + { + // Maximum index: 7 + j = (sizeof(uint8_t) << 3) - 1; + } + + if (availableActions & (1 << j)) + { + showActionsMenu_index = j; + break; + } + + } + } + } + } +} + +void Player::ButtonRightReleased(void) +{ + IncreaseShowActionsMenuIndex(); +} + +void Player::IncreaseShowActionsMenuIndex(void) +{ + if (showActionsMenu == true) + { + uint8_t i; + + for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) + { + TYPE_UNIT* ptrUnit = &units[i]; + + if (ptrUnit->selected == true) + { + // We need to iterate over all available actions + // for current unit. + uint8_t availableActions = UnitGetAvailableActions(ptrUnit); + + DEBUG_VAR(availableActions); + + for (uint8_t j = showActionsMenu_index + 1; j != showActionsMenu_index ; j++) + { + if (j >= (sizeof(uint8_t) << 3) ) + { + j = 0; + } + + if (availableActions & (1 << j)) + { + showActionsMenu_index = j; + break; + } + } + } + } + } } diff --git a/Player.h b/Player.h index 2a4ffb0..858f0b7 100644 --- a/Player.h +++ b/Player.h @@ -4,29 +4,35 @@ /* ************************************** * Includes * * **************************************/ - + #include "Global_Inc.h" -#include "GameStructures.h" #include "Camera.h" -#include "Building.h" #include "Unit.h" - + /* ************************************** * Defines * * **************************************/ - + #define PLAYER_NAME_LENGTH 16 -#define PLAYER_MAX_UNITS 32 -#define PLAYER_MAX_BUILDINGS 32 +#define PLAYER_MAX_UNITS_BUILDINGS 32 /* ************************************** * Structs and enums * * **************************************/ - + +typedef struct t_Resource +{ + uint8_t Wood; + uint8_t Gold; + uint8_t Food; +}TYPE_RESOURCES; + /* ************************************** * Class definition * * **************************************/ - + +#ifdef __cplusplus + class Player { public: @@ -35,36 +41,52 @@ class Player void Init(void); void Handler(void); void DrawHandler(void); - char * getName(void) {return name;} + char* getName(void) {return name;} void setHuman(bool value) { human = value; } bool isHuman(void) {return human;} - bool createUnit(uint8_t id, TYPE_COLLISION_BLOCK cb); - bool createBuilding(TYPE_BUILDING_ID id, TYPE_COLLISION_BLOCK cb); + bool createUnit(TYPE_UNIT_ID id, TYPE_COLLISION_BLOCK cb); uint8_t getPopulation(void) {return (unit_i + 1);} - uint8_t getBuildings(void) {return (bldg_i + 1);} - + private: + // Player definition + bool human; + char name[PLAYER_NAME_LENGTH]; + TYPE_RESOURCES Resources; + + // Unit handling + TYPE_UNIT units[PLAYER_MAX_UNITS_BUILDINGS]; + uint8_t unit_i; + + // Camera handling + TYPE_CAMERA Camera; + + // Button pressed/released events + void ButtonLeftReleased(void); + void ButtonRightReleased(void); + void ButtonAPressed(void); + void ButtonAReleased(void); + void ButtonBPressed(void); + void ButtonBReleased(void); + bool checkNewBuildingPosition(TYPE_COLLISION_BLOCK * cb); void UnitBuildingSelection(void); void showHealth(uint8_t hp); void ButtonHandler(void); - void BuildingUnitActions(void); + void ActionsMenu(void); TYPE_COLLISION_BLOCK GetCursorPos(void); - - char name[PLAYER_NAME_LENGTH]; - TYPE_UNIT units[PLAYER_MAX_UNITS]; - TYPE_BUILDING buildings[PLAYER_MAX_BUILDINGS]; - TYPE_UNIT* selectedUnit; - TYPE_BUILDING* selectedBuilding; - uint8_t id; - uint8_t unit_i; - uint8_t bldg_i; - bool human; - bool showUnitBuildingOptions; - TYPE_CAMERA Camera; - TYPE_RESOURCES Resources; - uint8_t progress_bar; - //Print _serial; + + // Unit selection + bool anyUnitSelected; + int8_t selectedUnitCandidate; + uint8_t unselectUnits_counter; + + // Actions selection + bool showActionsMenu; + uint8_t showActionsMenu_counter; + uint8_t showActionsMenu_index; + void IncreaseShowActionsMenuIndex(); }; +#endif // __cplusplus + #endif //PLAYER_HEADER__ diff --git a/System.c b/System.c index 09e086a..8535eb9 100644 --- a/System.c +++ b/System.c @@ -15,7 +15,7 @@ /* ************************************* * Local Prototypes * *************************************/ - + //static void SystemCheckTimer(bool * timer, uint64_t * last_timer, uint8_t step); /* ************************************* @@ -51,7 +51,7 @@ void SystemInit(void) SystemResetTimers(); //Initial value for system_busy system_busy = false; - + #if defined(USBCON) USBDevice.attach(); #endif @@ -59,7 +59,7 @@ void SystemInit(void) void SystemSetRandSeed(void) { - if(rand_seed == false) + if (rand_seed == false) { rand_seed = true; //Set random seed using global timer as reference @@ -96,7 +96,7 @@ void SystemRunTimers(void) { /* static uint64_t last_one_second_tick; static uint64_t last_100_ms_tick; - + SystemCheckTimer(&one_second_timer, &last_one_second_tick, REFRESH_FREQUENCY); SystemCheckTimer(&hundred_ms_timer, &last_100_ms_tick, 2); * */ @@ -104,23 +104,23 @@ void SystemRunTimers(void) void SystemCheckTimer(bool * timer, uint64_t * last_timer, uint8_t step) { - if(*timer == true) + if (*timer == true) { *timer = false; *last_timer = global_timer; } - if(global_timer >= (*last_timer + step) ) + if (global_timer >= (*last_timer + step) ) { *timer = true; - } + } } void SystemWaitCycles(uint32_t cycles) { uint64_t currentTime = global_timer; - - while(global_timer < (currentTime + cycles) ); + + while (global_timer < (currentTime + cycles) ); } uint32_t SystemRand(uint32_t min, uint32_t max) @@ -133,33 +133,33 @@ bool SystemIsBusy(void) return system_busy; } -bool SystemContains_u8(uint8_t value, uint8_t * buffer, size_t sz) +bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz) { size_t i = 0; - - for(i = 0; i < sz; i++) + + for (i = 0; i < sz; i++) { - if(buffer[i] == value) + if (buffer[i] == value) { return true; } } - + return false; } bool SystemContains_u16(uint16_t value, uint16_t * buffer, size_t sz) { size_t i = 0; - - for(i = 0; i < sz; i++) + + for (i = 0; i < sz; i++) { - if(buffer[i] == value) + if (buffer[i] == value) { return true; } } - + return false; } @@ -167,15 +167,15 @@ TYPE_TIMER * SystemCreateTimer(uint32_t seconds, bool rf, void (*timer_callback) { bool success = false; uint8_t i; - - if(seconds == 0) + + if (seconds == 0) { return NULL; } - - for(i = 0; i < SYSTEM_MAX_TIMERS; i++) + + for (i = 0; i < SYSTEM_MAX_TIMERS; i++) { - if(timer_array[i].busy == false) + if (timer_array[i].busy == false) { timer_array[i].Timeout_Callback = timer_callback; timer_array[i].time = seconds; @@ -186,20 +186,20 @@ TYPE_TIMER * SystemCreateTimer(uint32_t seconds, bool rf, void (*timer_callback) break; } } - - if(success == false) + + if (success == false) { return NULL; } - + return &timer_array[i]; } void SystemResetTimers(void) { uint8_t i; - - for(i = 0; i < SYSTEM_MAX_TIMERS; i++) + + for (i = 0; i < SYSTEM_MAX_TIMERS; i++) { timer_array[i].Timeout_Callback = NULL; timer_array[i].busy = false; @@ -212,20 +212,20 @@ void SystemResetTimers(void) void SystemUserTimersHandler(void) { uint8_t i; - - for(i = 0; i < SYSTEM_MAX_TIMERS; i++) + + for (i = 0; i < SYSTEM_MAX_TIMERS; i++) { - if(timer_array[i].busy == true) + if (timer_array[i].busy == true) { - if(System1SecondTick() == true) + if (System1SecondTick() == true) { timer_array[i].time--; - - if(timer_array[i].time == 0) + + if (timer_array[i].time == 0) { timer_array[i].Timeout_Callback(); - - if(timer_array[i].repeat_flag == true) + + if (timer_array[i].repeat_flag == true) { timer_array[i].time = timer_array[i].orig_time; } @@ -259,15 +259,15 @@ void SystemTimerRemove(TYPE_TIMER * timer) bool SystemArrayCompare(unsigned short * arr1, unsigned short * arr2, size_t sz) { size_t i; - - for(i = 0; i < sz; i++) + + for (i = 0; i < sz; i++) { - if(arr1[i] != arr2[i]) + if (arr1[i] != arr2[i]) { return false; } } - + return true; } diff --git a/System.h b/System.h index ec86a2b..421183a 100644 --- a/System.h +++ b/System.h @@ -11,7 +11,6 @@ extern "C" * **************************************/ #include "Global_Inc.h" -#include "GameStructures.h" /* ************************************** * Defines * @@ -33,6 +32,14 @@ typedef struct t_Timer void (*Timeout_Callback)(void); }TYPE_TIMER; +typedef struct t_CollisionBlock +{ + uint16_t x; + uint16_t y; + uint8_t w; + uint8_t h; +}TYPE_COLLISION_BLOCK; + /* ************************************** * Global Prototypes * * **************************************/ @@ -60,7 +67,7 @@ uint64_t SystemGetGlobalTimer(void); // Returns whether critical section of code is being entered bool SystemIsBusy(void); // Returns whether indicated value is contained inside buffer -bool SystemContains_u8(uint8_t value, uint8_t * buffer, size_t sz); +bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz); // Overload for uint16_t bool SystemContains_u16(uint16_t value, uint16_t * buffer, size_t sz); // Creates a timer instance wiht a determined value and associates it to a callback @@ -80,9 +87,9 @@ bool SystemArrayCompare(unsigned short * arr1, unsigned short * arr2, size_t sz) bool SystemCollisionCheck(TYPE_COLLISION_BLOCK c1, TYPE_COLLISION_BLOCK c2); /* ************************************** - * Global Variables * + * Global Variables * * **************************************/ - + #ifdef __cplusplus } #endif diff --git a/Unit.c b/Unit.c index e0da0e6..84b7931 100644 --- a/Unit.c +++ b/Unit.c @@ -1,174 +1,221 @@ /* ************************************** * Includes * * **************************************/ - + #include "Unit.h" #include "PeasantSpr.c" - +#include "BarracksSpr.c" + /* ************************************** * Defines * * **************************************/ - -#define MAX_ACTION_LEVELS 2 - + +#define MAX_ACTIONS 3 + +/* ************************************** +* Structs and enums * +* **************************************/ + +struct t_coordinates +{ + int8_t x; + int8_t y; +}; + /* ************************************** * Local prototypes * * **************************************/ -static void UnitIncreaseMenuLevel(void); -static void UnitBuildAccept(TYPE_UNIT* ptrUnit); - +static void UnitBuildAccepted(TYPE_UNIT* ptrUnit); +static void UnitAttackAccepted(TYPE_UNIT* ptrUnit); + /* ************************************** * Local variables * * **************************************/ -static uint8_t menuLevel; +/* Tables */ +static uint8_t const UnitHPTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = 25 , + [BARRACKS] = 100 }; +static uint8_t const UnitSpeedTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = 1 , + [BARRACKS] = 0 }; -typedef struct -{ - const char* str; - void (*pAction)(TYPE_UNIT*); -}TYPE_UNIT_ACTION; +static TYPE_UNIT_ACTION const UnitActionsTable_Level0[MAX_ACTIONS] = { [ACTION_BUILD] = {"BUILD", &UnitBuildAccepted} , + [ACTION_ATTACK] = {"ATTACK", &UnitAttackAccepted} , + [ACTION_CREATE_UNIT] = {"CREATE", NULL} }; -typedef enum t_availableactions -{ - ACTION_BUILD = 0, - ACTION_ATTACK, - MAX_ACTIONS -}UNIT_AVAILABLE_ACTIONS; +static uint8_t const UnitActionsTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = ((1 << ACTION_BUILD) | (1 << ACTION_ATTACK)), + [BARRACKS] = (1 << ACTION_CREATE_UNIT) }; -/* Sprites */ -static TYPE_SPRITE PeasantSpr; -static TYPE_SPRITE PeasantWalkingSpr; - -/* Tables */ -static uint8_t const UnitHPTable[] = { [PEASANT] = 25 }; -static uint8_t const UnitSpeedTable[] = { [PEASANT] = 1 }; - -static TYPE_UNIT_ACTION const UnitActionsTable_Level0[MAX_ACTIONS] = { [ACTION_BUILD] = {"Build", NULL}, - [ACTION_ATTACK] = {"Attack", NULL} }; -static TYPE_UNIT_ACTION const UnitActionsTable_Level1[MAX_ACTIONS] = { {"Barracks", &UnitBuildAccept} }; - -static TYPE_UNIT_ACTION* const UnitActionsTable_LevelX[MAX_ACTION_LEVELS] = { &UnitActionsTable_Level0 , - &UnitActionsTable_Level1 }; - -static TYPE_SPRITE * const UnitSprTable[] = {&PeasantSpr}; -static TYPE_SPRITE * const UnitWalkingSprTable[] = {&PeasantWalkingSpr}; +// ************** +// Sprite tables +// ************** +static TYPE_SPRITE UnitSprTable[MAX_UNITS_BUILDINGS]; +static TYPE_SPRITE UnitWalkingShadowSprTable[MAX_UNITS_BUILDINGS]; +static const struct t_coordinates UnitShadowOffsetTable[MAX_BUILDING_ID - FIRST_BUILDING_ID] = { [BARRACKS - FIRST_BUILDING_ID] = {.x = -6, .y = 0} }; void UnitInit(void) { - PeasantSpr.Data = Peasant_SprData; - PeasantSpr.w = GfxGetWidthFromSpriteData(Peasant_SprData); - PeasantSpr.h = GfxGetHeightFromSpriteData(Peasant_SprData); - PeasantSpr.flip = 0; - PeasantSpr.rotation = 0; - PeasantSpr.color = GFX_BLACK; - - PeasantWalkingSpr.Data = Peasant_Walking_SprData; - PeasantWalkingSpr.w = GfxGetWidthFromSpriteData(Peasant_Walking_SprData); - PeasantWalkingSpr.h = GfxGetHeightFromSpriteData(Peasant_Walking_SprData); - PeasantWalkingSpr.flip = 0; - PeasantWalkingSpr.rotation = 0; - PeasantWalkingSpr.color = GFX_BLACK; + enum + { + BARRACKS_SHADOW_OFFSET_X = -8, + BARRACKS_SHADOW_OFFSET_Y = 0 + }; + + UnitSprTable[PEASANT].Data = Peasant_SprData; + UnitSprTable[PEASANT].w = GfxGetWidthFromSpriteData(Peasant_SprData); + UnitSprTable[PEASANT].h = GfxGetHeightFromSpriteData(Peasant_SprData); + UnitSprTable[PEASANT].flip = 0; + UnitSprTable[PEASANT].rotation = 0; + UnitSprTable[PEASANT].color = GFX_BLACK; + + UnitWalkingShadowSprTable[PEASANT].Data = Peasant_Walking_SprData; + UnitWalkingShadowSprTable[PEASANT].w = GfxGetWidthFromSpriteData(Peasant_Walking_SprData); + UnitWalkingShadowSprTable[PEASANT].h = GfxGetHeightFromSpriteData(Peasant_Walking_SprData); + UnitWalkingShadowSprTable[PEASANT].flip = 0; + UnitWalkingShadowSprTable[PEASANT].rotation = 0; + UnitWalkingShadowSprTable[PEASANT].color = GFX_BLACK; + + UnitSprTable[BARRACKS].Data = BarracksSpr_Data; + UnitSprTable[BARRACKS].w = GfxGetWidthFromSpriteData(BarracksSpr_Data); + UnitSprTable[BARRACKS].h = GfxGetHeightFromSpriteData(BarracksSpr_Data); + UnitSprTable[BARRACKS].flip = 0; + UnitSprTable[BARRACKS].rotation = 0; + UnitSprTable[BARRACKS].color = GFX_BLACK; + + UnitWalkingShadowSprTable[BARRACKS].Data = BarracksShadowSpr_Data; + UnitWalkingShadowSprTable[BARRACKS].w = GfxGetWidthFromSpriteData(BarracksShadowSpr_Data); + UnitWalkingShadowSprTable[BARRACKS].h = GfxGetHeightFromSpriteData(BarracksShadowSpr_Data); + UnitWalkingShadowSprTable[BARRACKS].flip = 0; + UnitWalkingShadowSprTable[BARRACKS].rotation = 0; + UnitWalkingShadowSprTable[BARRACKS].color = GFX_GRAY; } -void UnitDraw(TYPE_CAMERA * ptrCamera, TYPE_UNIT * ptrUnit, bool bSelected) +void UnitDraw(TYPE_UNIT* ptrUnit, TYPE_CAMERA* ptrCamera, bool bHighlighted) { uint8_t id = ptrUnit->id; TYPE_SPRITE * ptrSpr; - static uint8_t walk_counter = 0; - static bool mirror = false; - - if(ptrUnit->alive == false) + + if (ptrUnit->alive == false) { return; } - - ptrSpr = ptrUnit->walking ? UnitWalkingSprTable[id] : UnitSprTable[id]; - - ptrSpr->rotation = ptrUnit->dir ? ROTCCW : NOROT; - ptrSpr->flip = GFX_NOFLIP; - - if(ptrUnit->walking == true) - { - if(mirror == true) - { - if(ptrUnit->dir == false) - { - ptrSpr->flip = GFX_FLIPH; - } - else - { - ptrSpr->flip = GFX_FLIPV; - } - } - else - { - ptrSpr->flip = NOROT; - } - } - - if(ptrUnit->mirror == false) - { - if(ptrUnit->dir == false) - { - ptrSpr->flip |= GFX_FLIPV; - } - else - { - ptrSpr->flip |= GFX_FLIPH; - } - } - + + if (ptrUnit->building == false) + { + enum + { + WALK_FRAMES = 4 + }; + + // *************** + // Units + // *************** + + ptrSpr = ptrUnit->walking ? &UnitWalkingShadowSprTable[id] : &UnitSprTable[id]; + + ptrSpr->rotation = GFX_NOROT; + ptrSpr->flip = GFX_NOFLIP; + + if (ptrUnit->walking == true) + { + if (++ptrUnit->walk_counter > WALK_FRAMES) + { + ptrUnit->walk_counter = 0; + ptrUnit->mirror = ptrUnit->mirror ? false : true; + } + } + + switch (ptrUnit->dir) + { + case DIRECTION_UP: + ptrSpr->flip |= GFX_FLIPV; + + if (ptrUnit->mirror == true) + { + ptrSpr->flip |= GFX_FLIPH; + } + break; + + case DIRECTION_DOWN: + if (ptrUnit->mirror == true) + { + ptrSpr->flip |= GFX_FLIPH; + } + break; + + case DIRECTION_LEFT: + ptrSpr->rotation = GFX_ROTCCW; + ptrSpr->flip |= GFX_FLIPH; + + if (ptrUnit->mirror == true) + { + ptrSpr->flip |= GFX_FLIPV; + } + break; + + case DIRECTION_RIGHT: + ptrSpr->rotation = GFX_ROTCCW; + + if (ptrUnit->mirror == true) + { + ptrSpr->flip |= GFX_FLIPV; + } + break; + + default: + // Invalid direction + break; + } + } + else + { + // ******************* + // Buildings + // ******************* + + CameraApplyCoordinatesToSprite( ptrCamera, + &UnitWalkingShadowSprTable[id], + ptrUnit->x + UnitShadowOffsetTable[id - FIRST_BUILDING_ID].x, + ptrUnit->y + UnitShadowOffsetTable[id - FIRST_BUILDING_ID].y ); + + GfxDrawSprite(&UnitWalkingShadowSprTable[id]); + + ptrSpr = &UnitSprTable[id]; + } + CameraApplyCoordinatesToSprite( ptrCamera, ptrSpr, ptrUnit->x, ptrUnit->y ); - + GfxDrawSprite(ptrSpr); - - if( (bSelected == true) && (ptrUnit->selected == false) ) - { - TYPE_COLLISION_BLOCK cb; - - cb = CameraApplyCoordinatesToCoordinates(ptrCamera, ptrUnit->x, ptrUnit->y); - - GfxDrawCircle(cb.x + 3, cb.y + 3, UnitGetWidthFromID(ptrUnit->id), GFX_GRAY); - } - else if(ptrUnit->selected == true) - { - TYPE_COLLISION_BLOCK cb; - - cb = CameraApplyCoordinatesToCoordinates(ptrCamera, ptrUnit->x, ptrUnit->y); - - GfxDrawCircle(cb.x + 3, cb.y + 3, UnitGetWidthFromID(ptrUnit->id), GFX_BLACK); - } - - /*char str[2]; - - snprintf(str, 2, "%u", walk_counter); - - GfxPrintText(str, 60, 20); - - snprintf(str, 2, "%u", mirror); - - GfxPrintText(str, 60, 30);*/ - - if(++walk_counter > 4) - { - walk_counter = 0; - mirror = mirror ? false : true; - } + + if ( (bHighlighted == true) || (ptrUnit->selected == true) ) + { + TYPE_COLLISION_BLOCK cb = CameraApplyCoordinatesToCoordinates(ptrCamera, ptrUnit->x, ptrUnit->y); + int8_t colour = ptrUnit->selected? GFX_BLACK : GFX_GRAY; + uint8_t w = UnitGetWidthFromID(id); + uint8_t h = UnitGetHeightFromID(id); + + if (ptrUnit->building == true) + { + GfxDrawRectangle(cb.x - (w >> 3), cb.y - (h >> 3), w + (w >> 2), h + (h >> 2), colour); + } + else + { + GfxDrawCircle(cb.x + (w >> 1), cb.y + (h >> 1), w, colour); + } + } } uint8_t UnitGetWidthFromID(uint8_t id) { - return GfxGetWidthFromSpriteData(UnitSprTable[id]->Data); + return GfxGetWidthFromSpriteData(UnitSprTable[id].Data); } uint8_t UnitGetHeightFromID(uint8_t id) { - return GfxGetHeightFromSpriteData(UnitSprTable[id]->Data); + return GfxGetHeightFromSpriteData(UnitSprTable[id].Data); } uint8_t UnitGetHpFromID(uint8_t id) @@ -176,120 +223,70 @@ uint8_t UnitGetHpFromID(uint8_t id) return UnitHPTable[id]; } -void UnitMoveTo(TYPE_UNIT * ptrUnit, uint16_t x, uint16_t y) +void UnitMoveTo(TYPE_UNIT* ptrUnit, uint16_t x, uint16_t y) { ptrUnit->target_x = x; ptrUnit->target_y = y; ptrUnit->walking = true; } -void UnitHandler(TYPE_UNIT * ptrUnit) +void UnitAttackAccepted(TYPE_UNIT* ptrUnit) +{ + ptrUnit->selecting_attack = true; +} + +void UnitHandler(TYPE_UNIT* ptrUnit) { bool bMoving = false; - - if(ptrUnit->walking == true) + + if (ptrUnit->walking == true) { - if( (ptrUnit->x - UnitSpeedTable[ptrUnit->id]) > ptrUnit->target_x) + if ( (ptrUnit->x - UnitSpeedTable[ptrUnit->id]) > ptrUnit->target_x) { + ptrUnit->dir = DIRECTION_LEFT; ptrUnit->x -= UnitSpeedTable[ptrUnit->id]; - //ptrUnit->rotation = GFX_ROTCCW; bMoving = true; - ptrUnit->dir = true; - ptrUnit->mirror = false; } - else if( (ptrUnit->x + UnitSpeedTable[ptrUnit->id]) < ptrUnit->target_x) + else if ( (ptrUnit->x + UnitSpeedTable[ptrUnit->id]) < ptrUnit->target_x) { + ptrUnit->dir = DIRECTION_RIGHT; ptrUnit->x += UnitSpeedTable[ptrUnit->id]; - //ptrUnit->rotation = GFX_ROTCCW; bMoving = true; - ptrUnit->dir = true; - ptrUnit->mirror = true; } - - if( (ptrUnit->y - UnitSpeedTable[ptrUnit->id]) > ptrUnit->target_y) + + if ( (ptrUnit->y - UnitSpeedTable[ptrUnit->id]) > ptrUnit->target_y) { + ptrUnit->dir = DIRECTION_UP; ptrUnit->y -= UnitSpeedTable[ptrUnit->id]; - //ptrUnit->rotation = 0; bMoving = true; - ptrUnit->dir = false; - ptrUnit->mirror = false; } - else if( (ptrUnit->y + UnitSpeedTable[ptrUnit->id]) < ptrUnit->target_y) + else if ( (ptrUnit->y + UnitSpeedTable[ptrUnit->id]) < ptrUnit->target_y) { + ptrUnit->dir = DIRECTION_DOWN; ptrUnit->y += UnitSpeedTable[ptrUnit->id]; - //ptrUnit->rotation = 0; bMoving = true; - ptrUnit->dir = false; - ptrUnit->mirror = true; } - + ptrUnit->walking = bMoving; } } -const char* UnitSelectedOptions(TYPE_UNIT* ptrUnit) -{ - const TYPE_UNIT_ACTION* tUnitAction = NULL; - - switch(menuLevel) - { - case 0: - tUnitAction = &UnitActionsTable_Level0[ptrUnit->id]; - break; - case 1: - tUnitAction = &UnitActionsTable_Level1[ptrUnit->id]; - break; - - default: - return NULL; - break; - } - - return tUnitAction->str; -} - void UnitAcceptAction(TYPE_UNIT* ptrUnit) { - const TYPE_UNIT_ACTION* tUnitAction = NULL; - - switch(menuLevel) - { - case 0: - tUnitAction = &UnitActionsTable_Level0[ptrUnit->id]; - break; - case 1: - tUnitAction = &UnitActionsTable_Level1[ptrUnit->id]; - break; - - default: - return; - break; - } - - if(tUnitAction->pAction == NULL) - { - UnitIncreaseMenuLevel(); - } - else - { - tUnitAction->pAction(ptrUnit); - } + } -void UnitIncreaseMenuLevel(void) +uint8_t UnitGetAvailableActions(TYPE_UNIT* ptrUnit) { - if(menuLevel < 1) - { - menuLevel++; - } + return UnitActionsTable[ptrUnit->id]; } -void UnitBuildAccept(TYPE_UNIT* ptrUnit) +void UnitBuildAccepted(TYPE_UNIT* ptrUnit) { - + } -void UnitResetMenuLevel(void) +const char* UnitGetActionString(UNIT_ACTION action) { - menuLevel = 0; + return UnitActionsTable_Level0[action].str; } diff --git a/Unit.h b/Unit.h index 4e5d85b..55439c4 100644 --- a/Unit.h +++ b/Unit.h @@ -4,47 +4,111 @@ /* ************************************** * Includes * * **************************************/ - + #include "Global_Inc.h" -#include "Gfx.h" -#include "GameStructures.h" #include "Camera.h" #ifdef __cplusplus extern "C" { #endif //__cplusplus - + /* ************************************** * Defines * * **************************************/ - + /* ************************************** * Structs and enums * * **************************************/ - + +typedef enum t_unitdirection +{ + DIRECTION_LEFT = 0, + DIRECTION_RIGHT, + DIRECTION_UP, + DIRECTION_DOWN +}UNIT_DIRECTION; + +typedef struct t_Unit +{ + uint16_t x; + uint16_t y; + uint16_t target_x; + uint16_t target_y; + uint8_t hp; + uint8_t id; + UNIT_DIRECTION dir; + bool mirror; // True = down or left; true = up or right + bool building; + bool walking; + bool alive; + bool selected; + bool selecting_attack; + bool attacking; + uint8_t walk_counter; +}TYPE_UNIT; + typedef enum t_unitid { - PEASANT = 0 + // Walking units + PEASANT = 0, + + MAX_UNIT_ID, + + // Buildings + BARRACKS, + TOWER, + + MAX_BUILDING_ID, + + MAX_UNITS_BUILDINGS, + + FIRST_UNIT_ID = PEASANT, + FIRST_BUILDING_ID = BARRACKS }TYPE_UNIT_ID; - + +typedef struct +{ + const char* str; + void (*pAction)(TYPE_UNIT*); +}TYPE_UNIT_ACTION; + +typedef enum t_availableactions +{ + ACTION_BUILD, + ACTION_ATTACK, + ACTION_CREATE_UNIT +}UNIT_ACTION; + +typedef struct t_Camera TYPE_CAMERA; + /* ************************************** * Global prototypes * * **************************************/ - -void UnitInit(void); -uint8_t UnitGetHpFromID(uint8_t id); -uint8_t UnitGetWidthFromID(uint8_t id); -uint8_t UnitGetHeightFromID(uint8_t id); -void UnitDraw(TYPE_CAMERA * ptrCamera, TYPE_UNIT * ptrUnit, bool bSelected); -const char* UnitSelectedOptions(TYPE_UNIT* ptrUnit); -void UnitMoveTo(TYPE_UNIT * ptrUnit, uint16_t x, uint16_t y); -void UnitHandler(TYPE_UNIT * ptrUnit); -void UnitAcceptAction(TYPE_UNIT* ptrUnit); -void UnitResetMenuLevel(void); + +// Initialization and handling +void UnitInit(void); +void UnitHandler(TYPE_UNIT* ptrUnit); + +// Unit information +uint8_t UnitGetHpFromID(uint8_t id); +uint8_t UnitGetWidthFromID(uint8_t id); +uint8_t UnitGetHeightFromID(uint8_t id); +uint8_t UnitGetAvailableActions(TYPE_UNIT* ptrUnit); + +// Rendering +void UnitDraw(TYPE_UNIT* ptrUnit, TYPE_CAMERA* ptrCamera, bool bHighlighted); + +void UnitMoveTo(TYPE_UNIT* ptrUnit, uint16_t x, uint16_t y); + +void UnitAcceptAction(TYPE_UNIT* ptrUnit); +void UnitResetMenuLevel(void); + +// Selection index +const char* UnitGetActionString(UNIT_ACTION action); #ifdef __cplusplus } #endif //__cplusplus - + #endif //__UNIT_HEADER__ diff --git a/main.cpp b/main.cpp index a746a57..c302408 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,7 @@ #include "Global_Inc.h" #include "Gameplay.h" +#include "Menu.h" /* ************************************** * Global variables * @@ -12,22 +13,22 @@ Gamebuino gb; int main(){ - + init(); - + SystemInit(); - + gb.begin(); - + // Main loop - while(1) + while (1) { gb.titleScreen(F("Pocket Empires")); - + MainMenu(); } - - + + return 0; - + }