From d3801c0296dd32f430a4074932bfabf27a8ade03 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 11:30:54 +0200 Subject: [PATCH 01/11] Added cPlayer::IsGameModeXXX() and cWorld::IsGameModeXXX() functions. These are the preferred way of determining the gamemode, you should use those instead of doing manual comparisons to the gamemode value. --- source/Player.cpp | 36 +++++++++++++++++++++++++++++++++++- source/Player.h | 13 ++++++++++++- source/World.h | 11 +++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/source/Player.cpp b/source/Player.cpp index 83181dda6..5609807b0 100644 --- a/source/Player.cpp +++ b/source/Player.cpp @@ -505,7 +505,6 @@ void cPlayer::KilledBy(cEntity * a_Killer) void cPlayer::Respawn(void) { m_Health = GetMaxHealth(); - m_FoodLevel = 20; m_ClientHandle->SendRespawn(); @@ -538,6 +537,36 @@ Vector3d cPlayer::GetEyePosition(void) const +bool cPlayer::IsGameModeCreative(void) const +{ + return (m_GameMode == gmCreative) || // Either the player is explicitly in Creative + ((m_GameMode == gmNotSet) && m_World->IsGameModeCreative()); // or they inherit from the world and the world is Creative +} + + + + + +bool cPlayer::IsGameModeSurvival(void) const +{ + return (m_GameMode == gmSurvival) || // Either the player is explicitly in Survival + ((m_GameMode == gmNotSet) && m_World->IsGameModeSurvival()); // or they inherit from the world and the world is Survival +} + + + + + +bool cPlayer::IsGameModeAdventure(void) const +{ + return (m_GameMode == gmCreative) || // Either the player is explicitly in Adventure + ((m_GameMode == gmNotSet) && m_World->IsGameModeCreative()); // or they inherit from the world and the world is Adventure +} + + + + + void cPlayer::OpenWindow(cWindow * a_Window) { if (a_Window != m_CurrentWindow) @@ -1283,6 +1312,11 @@ void cPlayer::HandleFood(void) void cPlayer::ApplyFoodExhaustionFromMovement(cChunk & a_Chunk) { + if (IsGameModeCreative()) + { + return; + } + // Calculate the distance travelled, update the last pos: Vector3d Movement(GetPosition() - m_LastFoodPos); m_LastFoodPos = GetPosition(); diff --git a/source/Player.h b/source/Player.h index fed222157..69b0c3df1 100644 --- a/source/Player.h +++ b/source/Player.h @@ -73,7 +73,18 @@ public: virtual void TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ) override; - eGameMode GetGameMode(void) const { return m_GameMode; } // tolua_export + /// Returns the current gamemode. Partly OBSOLETE, you should use IsGameModeXXX() functions wherever applicable + eGameMode GetGameMode(void) const { return m_GameMode; } // tolua_export + + /// Returns true if the player is in Creative mode, either explicitly, or by inheriting from current world + bool IsGameModeCreative(void) const; + + /// Returns true if the player is in Survival mode, either explicitly, or by inheriting from current world + bool IsGameModeSurvival(void) const; + + /// Returns true if the player is in Adventure mode, either explicitly, or by inheriting from current world + bool IsGameModeAdventure(void) const; + std::string GetIP() { return m_IP; } // tolua_export float GetLastBlockActionTime() { return m_LastBlockActionTime; } // tolua_export int GetLastBlockActionCnt() { return m_LastBlockActionCnt; } // tolua_export diff --git a/source/World.h b/source/World.h index 5da7218e2..e67b06789 100644 --- a/source/World.h +++ b/source/World.h @@ -106,7 +106,18 @@ public: SetTimeOfDay(a_TimeOfDay); } + /// Returns the current game mode. Partly OBSOLETE, you should use IsGameModeXXX() functions wherever applicable eGameMode GetGameMode(void) const { return m_GameMode; } + + /// Returns true if the world is in Creative mode + bool IsGameModeCreative(void) const { return (m_GameMode == gmCreative); } + + /// Returns true if the world is in Survival mode + bool IsGameModeSurvival(void) const { return (m_GameMode == gmSurvival); } + + /// Returns true if the world is in Adventure mode + bool IsGameModeAdventure(void) const { return (m_GameMode == gmAdventure); } + bool IsPVPEnabled(void) const { return m_bEnabledPVP; } bool IsDeepSnowEnabled(void) const { return m_IsDeepSnowEnabled; } From d155c1cb0043c86c0e1e6b1f41d7b194ce368f24 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 11:52:24 +0200 Subject: [PATCH 02/11] Player food level is reset on respawn --- source/Player.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/Player.cpp b/source/Player.cpp index 5609807b0..d5cfe8bcf 100644 --- a/source/Player.cpp +++ b/source/Player.cpp @@ -505,6 +505,10 @@ void cPlayer::KilledBy(cEntity * a_Killer) void cPlayer::Respawn(void) { m_Health = GetMaxHealth(); + + // Reset food level: + m_FoodLevel = 20; + m_FoodSaturationLevel = 5; m_ClientHandle->SendRespawn(); From 0caadbb25ce9c4c3f9d51a0898af182889802784 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 11:54:37 +0200 Subject: [PATCH 03/11] Hunger-per-distance is calculated only for the XZ distance --- source/Player.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Player.cpp b/source/Player.cpp index d5cfe8bcf..2aa041ff4 100644 --- a/source/Player.cpp +++ b/source/Player.cpp @@ -1323,6 +1323,7 @@ void cPlayer::ApplyFoodExhaustionFromMovement(cChunk & a_Chunk) // Calculate the distance travelled, update the last pos: Vector3d Movement(GetPosition() - m_LastFoodPos); + Movement.y = 0; // Only take XZ movement into account m_LastFoodPos = GetPosition(); // If riding anything, apply no food exhaustion From 64845e81b3047da1df896b2b4d38f6e119af0675 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 16:01:56 +0200 Subject: [PATCH 04/11] Debuggers: added the /starve and /fl (foodlevel) commands for manipulating player food level --- MCServer/Plugins/Debuggers/Debuggers.lua | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/MCServer/Plugins/Debuggers/Debuggers.lua b/MCServer/Plugins/Debuggers/Debuggers.lua index e2523e63e..1bc625c35 100644 --- a/MCServer/Plugins/Debuggers/Debuggers.lua +++ b/MCServer/Plugins/Debuggers/Debuggers.lua @@ -33,6 +33,8 @@ function Initialize(Plugin) PluginManager:BindCommand("/dash", "debuggers", HandleDashCmd, "Switches between fast and normal sprinting speed"); PluginManager:BindCommand("/hunger", "debuggers", HandleHungerCmd, "Lists the current hunger-related variables"); PluginManager:BindCommand("/poison", "debuggers", HandlePoisonCmd, "Sets food-poisoning for 15 seconds"); + PluginManager:BindCommand("/starve", "debuggers", HandleStarveCmd, "Sets the food level to zero"); + PluginManager:BindCommand("/fl", "debuggers", HandleFoodLevelCmd, "Sets the food level to the given value"); -- Enable the following line for BlockArea / Generator interface testing: -- PluginManager:AddHook(Plugin, cPluginManager.HOOK_CHUNK_GENERATED); @@ -715,3 +717,28 @@ end + +function HandleStarveCmd(a_Split, a_Player) + a_Player:SetFoodLevel(0); + a_Player:SendMessage("You are now starving"); + return true; +end + + + + + +function HandleFoodLevelCmd(a_Split, a_Player) + if (#a_Split ~= 2) then + a_Player:SendMessage("Missing an argument: the food level to set"); + return true; + end + + a_Player:SetFoodLevel(tonumber(a_Split[2])); + a_Player:SendMessage("Food level set to " .. a_Player:GetFoodLevel()); + return true; +end + + + + From 8c61c54daeb2bf8591ab3a8110589644ea756da5 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 18:12:23 +0200 Subject: [PATCH 05/11] Set up proper ignores for ProtoProxy --- .gitignore | 3 +++ Tools/ProtoProxy/.gitignore | 4 ++++ 2 files changed, 7 insertions(+) create mode 100644 Tools/ProtoProxy/.gitignore diff --git a/.gitignore b/.gitignore index bde685901..0f5712848 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ SymSrv cloc-ignored.txt cloc.xml cloc.xsl +*.ncb +*.user +*.suo \ No newline at end of file diff --git a/Tools/ProtoProxy/.gitignore b/Tools/ProtoProxy/.gitignore new file mode 100644 index 000000000..3097f7aab --- /dev/null +++ b/Tools/ProtoProxy/.gitignore @@ -0,0 +1,4 @@ +Debug +Release +*.log +*.nbt From 00196e975a3cd4156b1d675d192c875535d7e5f0 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 18:15:19 +0200 Subject: [PATCH 06/11] ProtoProxy now properly waits for both sides to establish encryption No more "End of stream" kicks in the client. Data sent while one connection is encrypted and the other is not is buffered and sent when the other link establishes encryption. --- Tools/ProtoProxy/Connection.cpp | 59 ++++++++++++++++++++++++++------- Tools/ProtoProxy/Connection.h | 10 ++++-- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/Tools/ProtoProxy/Connection.cpp b/Tools/ProtoProxy/Connection.cpp index a3d3191fc..32dfe321e 100644 --- a/Tools/ProtoProxy/Connection.cpp +++ b/Tools/ProtoProxy/Connection.cpp @@ -49,13 +49,25 @@ { \ AString ToServer; \ m_ClientBuffer.ReadAgain(ToServer); \ - if (m_ServerState == csUnencrypted) \ + switch (m_ServerState) \ { \ - SERVERSEND(ToServer.data(), ToServer.size()); \ - } \ - else \ - { \ - SERVERENCRYPTSEND(ToServer.data(), ToServer.size()); \ + case csUnencrypted: \ + { \ + SERVERSEND(ToServer.data(), ToServer.size()); \ + break; \ + } \ + case csEncryptedUnderstood: \ + case csEncryptedUnknown: \ + { \ + SERVERENCRYPTSEND(ToServer.data(), ToServer.size()); \ + break; \ + } \ + case csWaitingForEncryption: \ + { \ + Log("Waiting for server encryption, queued %u bytes", ToServer.size()); \ + m_ServerEncryptionBuffer.append(ToServer.data(), ToServer.size()); \ + break; \ + } \ } \ DebugSleep(50); \ } @@ -64,13 +76,25 @@ { \ AString ToClient; \ m_ServerBuffer.ReadAgain(ToClient); \ - if (m_ClientState == csUnencrypted) \ + switch (m_ClientState) \ { \ - CLIENTSEND(ToClient.data(), ToClient.size()); \ - } \ - else \ - { \ - CLIENTENCRYPTSEND(ToClient.data(), ToClient.size()); \ + case csUnencrypted: \ + { \ + CLIENTSEND(ToClient.data(), ToClient.size()); \ + break; \ + } \ + case csEncryptedUnderstood: \ + case csEncryptedUnknown: \ + { \ + CLIENTENCRYPTSEND(ToClient.data(), ToClient.size()); \ + break; \ + } \ + case csWaitingForEncryption: \ + { \ + Log("Waiting for client encryption, queued %u bytes", ToClient.size()); \ + m_ClientEncryptionBuffer.append(ToClient.data(), ToClient.size()); \ + break; \ + } \ } \ DebugSleep(50); \ } @@ -379,6 +403,7 @@ bool cConnection::RelayFromServer(void) switch (m_ServerState) { case csUnencrypted: + case csWaitingForEncryption: { return DecodeServersPackets(Buffer, res); } @@ -419,6 +444,7 @@ bool cConnection::RelayFromClient(void) switch (m_ClientState) { case csUnencrypted: + case csWaitingForEncryption: { return DecodeClientsPackets(Buffer, res); } @@ -1543,6 +1569,9 @@ bool cConnection::HandleServerEncryptionKeyResponse(void) } Log("Server communication is now encrypted"); m_ServerState = csEncryptedUnderstood; + DataLog(m_ServerEncryptionBuffer.data(), m_ServerEncryptionBuffer.size(), "Sending the queued data to server (%u bytes):", m_ServerEncryptionBuffer.size()); + SERVERENCRYPTSEND(m_ServerEncryptionBuffer.data(), m_ServerEncryptionBuffer.size()); + m_ServerEncryptionBuffer.clear(); return true; } @@ -2459,6 +2488,7 @@ void cConnection::SendEncryptionKeyResponse(const AString & a_ServerPublicKey, c ToServer.WriteBEShort(EncryptedLength); ToServer.WriteBuf(EncryptedNonce, EncryptedLength); SERVERSEND(ToServer); + m_ServerState = csWaitingForEncryption; } @@ -2507,6 +2537,11 @@ void cConnection::StartClientEncryption(const AString & a_EncKey, const AString Log("Client connection is now encrypted"); m_ClientState = csEncryptedUnderstood; + // Send the queued data: + DataLog(m_ClientEncryptionBuffer.data(), m_ClientEncryptionBuffer.size(), "Sending the queued data to client (%u bytes):", m_ClientEncryptionBuffer.size()); + CLIENTENCRYPTSEND(m_ClientEncryptionBuffer.data(), m_ClientEncryptionBuffer.size()); + m_ClientEncryptionBuffer.clear(); + // Handle all postponed server data DecodeServersPackets(NULL, 0); } diff --git a/Tools/ProtoProxy/Connection.h b/Tools/ProtoProxy/Connection.h index 7f3a6f8bb..dafc1b36b 100644 --- a/Tools/ProtoProxy/Connection.h +++ b/Tools/ProtoProxy/Connection.h @@ -39,9 +39,10 @@ class cConnection enum eConnectionState { - csUnencrypted, // The connection is not encrypted. Packets must be decoded in order to be able to start decryption. - csEncryptedUnderstood, // The communication is encrypted and so far all packets have been understood, so they can be still decoded - csEncryptedUnknown, // The communication is encrypted, but an unknown packet has been received, so packets cannot be decoded anymore + csUnencrypted, // The connection is not encrypted. Packets must be decoded in order to be able to start decryption. + csEncryptedUnderstood, // The communication is encrypted and so far all packets have been understood, so they can be still decoded + csEncryptedUnknown, // The communication is encrypted, but an unknown packet has been received, so packets cannot be decoded anymore + csWaitingForEncryption, // The communication is waiting for the other line to establish encryption }; eConnectionState m_ClientState; @@ -72,6 +73,9 @@ protected: Decryptor m_ClientDecryptor; Encryptor m_ClientEncryptor; + AString m_ClientEncryptionBuffer; // Buffer for the data to be sent to the client once encryption is established + AString m_ServerEncryptionBuffer; // Buffer for the data to be sent to the server once encryption is established + /// Set to true when PACKET_PING is received from the client; will cause special parsing for server kick bool m_HasClientPinged; From 4746d2251c6204118e710c818d78b89c356a7427 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 19:15:03 +0200 Subject: [PATCH 07/11] Implemented basic eating support. Food is now properly consumed and it takes 1.5 sec. --- source/ClientHandle.cpp | 20 +++++------ source/ClientHandle.h | 8 ++--- source/Items/ItemFood.h | 66 ++++++++++++++++++------------------ source/Items/ItemHandler.cpp | 15 ++++---- source/Items/ItemHandler.h | 17 +++++----- source/Player.cpp | 58 +++++++++++++++++++++++++++++++ source/Player.h | 13 +++++++ 7 files changed, 134 insertions(+), 63 deletions(-) diff --git a/source/ClientHandle.cpp b/source/ClientHandle.cpp index 155eac38a..a15facc6e 100644 --- a/source/ClientHandle.cpp +++ b/source/ClientHandle.cpp @@ -555,11 +555,8 @@ void cClientHandle::HandleLeftClick(int a_BlockX, int a_BlockY, int a_BlockZ, ch cItemHandler * ItemHandler = cItemHandler::GetItemHandler(m_Player->GetEquippedItem()); if (ItemHandler->IsFood()) { - if (PlgMgr->CallHookPlayerEating(*m_Player)) - { - // A plugin doesn't agree with the action. The plugin itself is responsible for handling the consequences (possible inventory mismatch) - return; - } + m_Player->AbortEating(); + return; } else { @@ -569,7 +566,7 @@ void cClientHandle::HandleLeftClick(int a_BlockX, int a_BlockY, int a_BlockZ, ch return; } } - LOGINFO("%s: Status SHOOT / EAT not implemented", __FUNCTION__); + LOGINFO("%s: Status SHOOT not implemented", __FUNCTION__); return; } @@ -804,15 +801,14 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, c } else if (ItemHandler->IsFood()) { - cItem Item; - Item.m_ItemType = Equipped.m_ItemType; - Item.m_ItemCount = 1; - if (ItemHandler->EatItem(m_Player, &Item)) + m_Player->StartEating(); + if (PlgMgr->CallHookPlayerEating(*m_Player)) { - ItemHandler->OnFoodEaten(World, m_Player, &Item); - m_Player->GetInventory().RemoveOneEquippedItem(); + // A plugin won't let us eat, abort (send the proper packets to the client, too): + m_Player->AbortEating(); return; } + return; } else { diff --git a/source/ClientHandle.h b/source/ClientHandle.h index a06aca39f..9cf1a3326 100644 --- a/source/ClientHandle.h +++ b/source/ClientHandle.h @@ -281,6 +281,9 @@ private: /// Buffer for received messages to be processed in the Tick thread AStringList m_PendingMessages; + + static int s_ClientCount; + int m_UniqueID; @@ -307,14 +310,11 @@ private: /// Processes the messages in m_PendingMessages; called from the Tick thread void ProcessPendingMessages(void); - + // cSocketThreads::cCallback overrides: virtual void DataReceived (const char * a_Data, int a_Size) override; // Data is received from the client virtual void GetOutgoingData(AString & a_Data) override; // Data can be sent to client virtual void SocketClosed (void) override; // The socket has been closed for any reason - - static int s_ClientCount; - int m_UniqueID; }; // tolua_export diff --git a/source/Items/ItemFood.h b/source/Items/ItemFood.h index d4c0a012a..4ec2f7a36 100644 --- a/source/Items/ItemFood.h +++ b/source/Items/ItemFood.h @@ -4,53 +4,53 @@ #include "ItemHandler.h" -class cItemFoodHandler : public cItemHandler + + + +class cItemFoodHandler : + public cItemHandler { + typedef cItemHandler super; + public: cItemFoodHandler(int a_ItemType) - : cItemHandler(a_ItemType) + : super(a_ItemType) { } - virtual bool IsFood() override + + virtual bool IsFood(void) override { return true; } - virtual FoodInfo GetFoodInfo() override + + virtual FoodInfo GetFoodInfo(void) override { switch(m_ItemType) { - case E_ITEM_BREAD: - return FoodInfo(5, 6.f); - case E_ITEM_COOKIE: - return FoodInfo(2, 0.4f); - case E_ITEM_MELON_SLICE: - return FoodInfo(2, 1.2f); - case E_ITEM_RAW_CHICKEN: - return FoodInfo(2, 1.2f, 30); - case E_ITEM_COOKED_CHICKEN: - return FoodInfo(6, 7.2f); - case E_ITEM_RAW_BEEF: - case E_ITEM_RAW_PORKCHOP: - return FoodInfo(3, 1.8f); - case E_ITEM_STEAK: - case E_ITEM_COOKED_PORKCHOP: - return FoodInfo(8, 12.8f); - case E_ITEM_RAW_FISH: - return FoodInfo(2, 1.2f); - case E_ITEM_COOKED_FISH: - return FoodInfo(5, 6.f); - case E_ITEM_RED_APPLE: - return FoodInfo(4, 2.4f); - case E_ITEM_GOLDEN_APPLE: - return FoodInfo(4, 9.6f); - case E_ITEM_ROTTEN_FLESH: - return FoodInfo(4, 0.8f, 80); - case E_ITEM_SPIDER_EYE: - return FoodInfo(2, 3.2f, 100); + case E_ITEM_BREAD: return FoodInfo(5, 6); + case E_ITEM_COOKIE: return FoodInfo(2, 0.4); + case E_ITEM_MELON_SLICE: return FoodInfo(2, 1.2); + case E_ITEM_RAW_CHICKEN: return FoodInfo(2, 1.2, 30); + case E_ITEM_COOKED_CHICKEN: return FoodInfo(6, 7.2); + case E_ITEM_RAW_BEEF: return FoodInfo(3, 1.8); + case E_ITEM_RAW_PORKCHOP: return FoodInfo(3, 1.8); + case E_ITEM_STEAK: return FoodInfo(8, 12.8); + case E_ITEM_COOKED_PORKCHOP: return FoodInfo(8, 12.8); + case E_ITEM_RAW_FISH: return FoodInfo(2, 1.2); + case E_ITEM_COOKED_FISH: return FoodInfo(5, 6); + case E_ITEM_RED_APPLE: return FoodInfo(4, 2.4); + case E_ITEM_GOLDEN_APPLE: return FoodInfo(4, 9.6); + case E_ITEM_ROTTEN_FLESH: return FoodInfo(4, 0.8, 80); + case E_ITEM_SPIDER_EYE: return FoodInfo(2, 3.2, 100); } + LOGWARNING("%s: Unknown food item (%d), returning zero nutrition", __FUNCTION__, m_ItemType); return FoodInfo(0, 0.f); } -}; \ No newline at end of file +}; + + + + diff --git a/source/Items/ItemHandler.cpp b/source/Items/ItemHandler.cpp index d99457029..acb6b6371 100644 --- a/source/Items/ItemHandler.cpp +++ b/source/Items/ItemHandler.cpp @@ -4,6 +4,7 @@ #include "../Item.h" #include "../World.h" #include "../Player.h" +#include "../FastRandom.h" // Handlers: #include "ItemBed.h" @@ -465,15 +466,17 @@ bool cItemHandler::EatItem(cPlayer * a_Player, cItem * a_Item) { FoodInfo Info = GetFoodInfo(); - if(Info.FoodLevel > 0 || Info.Saturation > 0.f) + if ((Info.FoodLevel > 0) || (Info.Saturation > 0.f)) { bool Success = a_Player->Feed(Info.FoodLevel, Info.Saturation); - if(Success && Info.PoisionChance > 0) + + // If consumed and there's chance of foodpoisoning, do it: + if (Success && (Info.PoisonChance > 0)) { - MTRand r1; - if((r1.randInt(100) - Info.PoisionChance) <= 0) - { //Unlucky guy :D - //TODO: Make player ill + cFastRandom r1; + if ((r1.NextInt(100, a_Player->GetUniqueID()) - Info.PoisonChance) <= 0) + { + a_Player->FoodPoison(300); } } diff --git a/source/Items/ItemHandler.h b/source/Items/ItemHandler.h index 0c141dea0..f7985327a 100644 --- a/source/Items/ItemHandler.h +++ b/source/Items/ItemHandler.h @@ -38,16 +38,17 @@ public: struct FoodInfo { - FoodInfo(short a_FoodLevel, float a_Saturation, char a_PoisionChance = 0) + int FoodLevel; + double Saturation; + int PoisonChance; // 0 - 100, in percent. 0 = no chance of poisoning, 100 = sure poisoning + + FoodInfo(int a_FoodLevel, double a_Saturation, int a_PoisonChance = 0) : + FoodLevel(a_FoodLevel), + Saturation(a_Saturation), + PoisonChance(a_PoisonChance) { - FoodLevel = a_FoodLevel; - Saturation = a_Saturation; - PoisionChance = a_PoisionChance; } - short FoodLevel; - float Saturation; - char PoisionChance; //0 - 100 - }; + } ; /// Returns the FoodInfo for this item. (FoodRecovery, Saturation and PoisionChance) virtual FoodInfo GetFoodInfo(); diff --git a/source/Player.cpp b/source/Player.cpp index 2aa041ff4..c177b8cf4 100644 --- a/source/Player.cpp +++ b/source/Player.cpp @@ -20,6 +20,7 @@ #include "OSSupport/Timer.h" #include "MersenneTwister.h" #include "Chunk.h" +#include "Items/ItemHandler.h" #include "Vector3d.h" #include "Vector3f.h" @@ -58,6 +59,7 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) , m_SprintingMaxSpeed(0.13) , m_IsCrouched(false) , m_IsSprinting(false) + , m_EatingFinishTick(-1) { LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d", a_PlayerName.c_str(), a_Client->GetIPString().c_str(), @@ -189,6 +191,11 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk) { m_World->CollectPickupsByPlayer(this); + if ((m_EatingFinishTick >= 0) && (m_EatingFinishTick <= m_World->GetWorldAge())) + { + FinishEating(); + } + HandleFood(); } @@ -349,6 +356,57 @@ void cPlayer::FoodPoison(int a_NumTicks) +void cPlayer::StartEating(void) +{ + // Set the timer: + m_EatingFinishTick = m_World->GetWorldAge() + EATING_TICKS; + + // Send the packets: + m_World->BroadcastPlayerAnimation(*this, 5); + m_World->BroadcastEntityMetadata(*this); +} + + + + + +void cPlayer::FinishEating(void) +{ + // Reset the timer: + m_EatingFinishTick = -1; + + // Send the packets: + m_ClientHandle->SendEntityStatus(*this, ENTITY_STATUS_EATING_ACCEPTED); + m_World->BroadcastPlayerAnimation(*this, 0); + m_World->BroadcastEntityMetadata(*this); + + // consume the item: + cItem Item(GetEquippedItem()); + Item.m_ItemCount = 1; + cItemHandler * ItemHandler = cItemHandler::GetItemHandler(Item.m_ItemType); + if (!ItemHandler->EatItem(this, &Item)) + { + return; + } + ItemHandler->OnFoodEaten(m_World, this, &Item); + GetInventory().RemoveOneEquippedItem(); +} + + + + + +void cPlayer::AbortEating(void) +{ + m_EatingFinishTick = -1; + m_World->BroadcastPlayerAnimation(*this, 0); + m_World->BroadcastEntityMetadata(*this); +} + + + + + void cPlayer::SendHealth(void) { if (m_ClientHandle != NULL) diff --git a/source/Player.h b/source/Player.h index 69b0c3df1..093c35b44 100644 --- a/source/Player.h +++ b/source/Player.h @@ -28,6 +28,7 @@ public: { MAX_HEALTH = 20, MAX_FOOD_LEVEL = 20, + EATING_TICKS = 30, ///< Number of ticks it takes to eat an item } ; // tolua_end @@ -164,6 +165,15 @@ public: // tolua_end + /// Starts eating the currently equipped item. Resets the eating timer and sends the proper animation packet + void StartEating(void); + + /// Finishes eating the currently equipped item. Consumes the item, updates health and broadcasts the packets + void FinishEating(void); + + /// Aborts the current eating operation + void AbortEating(void); + virtual void KilledBy(cEntity * a_Killer) override; void Respawn(void); // tolua_export @@ -296,6 +306,9 @@ protected: bool m_IsCrouched; bool m_IsSprinting; + /// The world tick in which eating will be finished. -1 if not eating + Int64 m_EatingFinishTick; + virtual void Destroyed(void); From f4ffd35ddc46f2160c25858c6021c9704faecee7 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 19:16:49 +0200 Subject: [PATCH 08/11] Added PNG versions of the MCServer icon. Extracted from the icon.ico, these are to be used for logos, avatars etc. --- VC2008/icon_128.png | Bin 0 -> 26758 bytes VC2008/icon_256.png | Bin 0 -> 66137 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 VC2008/icon_128.png create mode 100644 VC2008/icon_256.png diff --git a/VC2008/icon_128.png b/VC2008/icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..87d939a045f555569c87136136d8122b9faacc22 GIT binary patch literal 26758 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 literal 0 HcmV?d00001 diff --git a/VC2008/icon_256.png b/VC2008/icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..9a77a490f773a862299c1db7c334a2fb9fa86ddc GIT binary patch literal 66137 zcmV)EK)}C=P)cPZ>|5|d!KX9y)9t@ z61@FtzjN=eYk3Uz3;e%g1K7IUZPyFoJ_pTmSkE_R@mBV;seBaaw z{w2SH&w8Hm_`J#xt{zv9Z=}QXjo}ldD^h*={lEO9k92BNLAN~HH`al2U_k8weKKz04KmWz|7eDi1KKb=Szx3TW$3OcYzxRoM@saQQ z(2sxUU4QX`$IjgMiu>0aD{d(!glGusW4Hb04}S3GfBJoY z>Eidj`n8+P5Z0P2h9l!(R&dp1_y#<#F4#A~!DMBMqEzRz`g@PQ;fAo8gxB5s>hpJc zN&IMMqxni!)?YT8rd#PeqdYGt%L-5@|3n3d)b|S$g}DiWj3$E-_4|FAj3z}opJPMh z>I?*vDVW)i{1_+Uq4B~e#*@ZpJ-_kz|MweD{WcpKpZ~}&{^4+GxQ;3D?I{1_pPj46 zf63whX%FD)arE%SA8))G(HHJ~^ILE7Z@GDE`@P?N_akq3^TqGK`@S=O^WtqAKVtmi z`vX6J&2%)mb~>IlvotUG`|=%Q_=kM%Q9AMR*`b*acg^JR3XS%5XgV4YQ$7VAnK1BS z=zEaotlt+wm=r8fq zS8f8R2%z36|4?`_B}tE>s6jyxF(+dBEehr;BGmmnS0T^rg5S&dI`c!HMxU9_CLeq8 z`N_w_(EF`__X|%y{e?d~T+moZ83Gtw!P?1H4dGAuxXJ+j6b_Y!1tcPly0nzzzK74X z{V03+ZTD{86UN?yNz;F2mgUzm!9@JZ8o5W2A5i3lSsa8E1);~k8zwpm17dzE2{j$JZ>fX+imv`2k)t z)>d-p8N8u9;-SEdxH6yRzdN7jk3aeO!6%>m;^AkXe|B`~(o>^_%i9xkLRT5WpZsyv z1o#s;taHo(Zk#Gy(%M6>zu39uwlgpP*6+FJEswqBmcMexeP{p9H8*$vsuvXB!m9mU z^I5vd#NqSza=sR1FNh7N2Qm*>g<$oa!qBk9Hu72#zj6Sz>U}0oC1$qc`P&I!Fs76V zJS~_2aRbnx`yT&{--|+r>KlAF6b4|58Gm8MoGfGI0Q4?u2si*Pzzm^i^RGAX_#fTa z3g2_%Ev;|6;pX-?-}{=)8&7X1jqX}BV-2N$xIY(-r)D0A58gB+BRAcC>W6*b`?etTUy-NgOi(0Y z9Jcb%Zxo>)7d{g>6O0%8q1OqTrW<#t7q_VuB`l$Rk??ai2PQ0#XS0IlDI_W=D;Fo= zbV@WHHH7ganIV1ZfpfV%1Zfr!zj3KI?c{8(MG~6;Jd@O zy@DmV?{zv2v$fSV+h;e;*)yB8(d$tofg0{HfrGeJYZk)vj8IILvYJ00(|FjYVgHbZ zgCR{OGfJ803-!o}89_Dk0MeeNIUDyWh54K!{yFCBh4{SH2#QK$r^5aQbEA<2)NX~; zX~)!Tu$d4?JoZ4S7N!p2gn}W{0>vfZ{~GI!&ic*kr%pfC?sY!!vX^gv>n(SldE~BF zp1bLhH(m73oa^+T_{@AxIQ!tNv#NGxypRc!$<0el7&oZZO{l>H#r8j|-L$w$PB&(9 zN@p2OMpGIduuVT4Q9d6r@lTkR)5YN|ta89(51C=bEX4yD^ZcEuI0}m_^aGaqVT%boA?87p1O+ny=7hV~~-fK5D<2%RW@ilvUqhL0hF(IT( z5ODJsxzd+)hO_z()Gk}{P@|bJLQ0tU<7P}DOV%J}=HPqk=(qREvrN={)*M*Uv$UVU zxd#HCP@b~T6echi;x?tkt{viQGs;XH%`6$+>f^_Io{mkJM#QfXi{L;AAJX5Q9-NMj zaS$AiInAbX8jmM58c*dlV_Nrvn0z)h0zUDx@qIT&(GUm>p_qC4EE679MvbOF$}{@n z{@(P{Y)U--+n?V3>};Ao@rlPT_m`GQ*d-o?wS=n-;VU?a&J0IX*imhd0K$v z#RfM_OpD6^r+Tgg?<0&C2t#Og5=cfG^jYdN!DoDZNKM)7GD`LO8375hs-Mj%n~sM8 z#U?ckzC)8|J_d!`I~NO>UJz>#dQ5zVPgb)5{!3>}7c({(=H+LN`pfk<)!9XzpE2Rj zCVkcn29)x5*z_0XQIK&oYXyF#;-`E92RP!ZkD1-2Mo$b2s2{BXLBcs5L#rjglQDh@9~^?CIEM^ zY0HIBJ?51eY7vJq&q*V0Hd@=88|{1Ao#>sfc;%V*-}UlSZ++yA*S_kFZ@GTshKs#< zryGu*{Nmw^771TLN&Zz(k~{ufYXHF1=c?8pkr1rPhp%|$=EY`j`~Hoy?Faa?5Aepm zEt{vY!fSKYH4VaY*qmenuP{Nt)Xt;?8K315f6fR2mR_vdj2lP12)AWS;4GCcr0V3TM{w^~ig(~UQ+dAHrUe*OIq zo__4j?>PUx7jJF;H^!U)NI}Ez9FIo#&nC08Y@P*){m<84I2F&ugH=U2n;ka*h z`-imK@6*9>!o)e3IJ%;1eM`AjkUIrJZ$6^IDx`r|Y7G`jBVtt_Rs(|PV`0u4e^&=C6i3ySx<-F4XVz z!crdaTD`m}`AZ=iT(EIW{4uM#y(ZhbEJY8;1D4t&Cg!=s>5X*>ifFS0h$CdxxDkca zX~fiw*kquDrG6lOvMetav_L3h_HXMIG5=r&QMn<^cQv z%?@h@4Q5WT@fFB~L$M4*&I{^U=VcjXU`8^X<;)agof~x*6grba#-h;RH_!JFWysmQ z`tsr4;ECyA_v24}Vds;Vo*ez|3(pOo`qJn7%S7+F`L$Z&pSk1Dlm;M}dKG`V3u<=! zTi$-r+<0;Q>^HyT;;X*v`|kX}gRedRH}8MV*}rlAn$BNpG{Q$&lH4#F&AW5WphE&p zVL>kvI7b>?%KK_s%xIjBdD9Jr_@Qp=hSYz~Q3gmXq*kw)&}O$uTb+c~+CH@t!-U0W zXo&{|pIdQb9c8|a(}RIbS$ZBaLG2C4bT}Hb)SszVp~kF8_EM>Vt?c}y7^TPo{rSaqtX#tkL+aiR4AZ@5B-T zF~<1}awoIPyCSrR5P#q?Q5Vc?=M!NtX_l4dL#0_1D$PC9aZNrak@9mCFL zW|aX;cvtQfs5>KygG-eAzrD9>J`u;!$3FMO&hI_{<^GG0|EH&y^B7=(D9_KoFOURVqYetzJgYm(Q!`Nlin_uY5BoeDgz0mv0_T=65jh zZwTN`cS{a0H3TWl1lCy1Gz(bDCuICK1rcoIme|yV`026|-sgk@Hc-H}bIhM>COv`6 zw)i!HZ4ID}qjFL`Rsb?0IoZZ$<};h;Bmy&M0yGgdf`k&@w2+!kCC>|MJ6qoYm`CKn zA;%=lqYaqwA?=HNQW3s{1S>y)#^*hW1k9Ll#!SI|)+B~ZP^HfyRct^YzKtqc;QRst zGoBPQ9P#(Zx!@48++rByxuDTF8c=2>bp%+g@2qdo=Jshib?z*!pW3AEdRu@_L8uqc zgrJGYp%i7lQ<_glG#VUGe}9(_4-RNB9EtQ-2cZ!ysRA@w2c!qzL`G;}sZIt|^TeIv4_Tpn%_tOp(PsHbic1caqn$x$ypT*L1$)j=N7k^s0w0 zoV(}#Z7+)b{?lJNn7I8{BYml*_>F{8{JLfUwY+#)s5-nB=f#`5(cSl)x$V(6-1vrf zzweG8y!*a0KX&?T>w`>K-!_|N_pmyDiZ_B|&j`uuEk3#8?|DUA38BBZ{PCXjU zd{(awA%d0Vx+?-E{y1#19o}K0Zt?1}q-Ej_nMj+-8msdgEJ1txew*#sn0%}1vK7IS zooF)m`4!Os3FHZYhfP+R^41xT3mQ*yv0vw@#{DJy$6_d9$=>i2d4WRw=UHg- zYcudz>iZP=UTG`4@_#Z%c8WkuNd6fy!5{K~22j`Gn5%q)qS_B9bJ}N>dUr4qQv+s4 zjI=_wr$?jA5`7^|pu!EQZ^O5!Lf=!ofQIiqT03=$PF*-hn`ci`d#%I79$LF07ycAQ zzA%AKkBPJk_%P2?s%gvP!5)qJS7~h)dSwV-R}5e& zYt9n^SR?p{UVA3GaBb(NhaWxl$XnlW;Ro-&xBGYQeEIqhZEPhU;Qjw9CiHE#9b+(H z10Ruf7QsOt1iY*)upo5;UpFZT9qMeB>CZBT(qUyOOVoQL%FbEx&M9F*k@%3nk)+A0 z2fP;N7SFwNQl&Iz3A;b+)0M-0x?-aPQ*ekJwyiIxQ)AUjUdR}t(35cB2HWCWYb{!D zH^m_rO5%@(&YVeM2P)Tr$&v8pZ?{_1>vmWIHu?92wV9yA+ohRm6&5-muV6F{{tWE? zRsz!^u+X=!8hewwDazh{{mZ)Vz4q45J8!#p{oy-a zwYhUGT+hAJUA{=@=%LfL#%8y!fqscgu~heV|h!LxbxBJE+T z@_6GIQpytsC51K?YWiAYAb@=`A+QPC-vYWRz%U@)SjCM(0os_FJ+ErAniR01N0S*H zj;GY;*O&>Y$Lew`R-*Sk=de@Ds{Xhd)+?BSv34_M?PW3&&{4|7pJ9F+mE!Z66@@(E zF>(i54Qll|)a`WzAT);aZZKemF=3+DB0|Dwe81Y1AZR=T?hEY+s4C1Gq7s2iezFl4 zCAFIAV#Mo@Y{v#O!A3JtbXT2e)*=&ie1_Cc0QM?XxHX%PG+=XSoK9K0OUvCOLExg0 z+4V!^PC;Zwe3vIihv{eiy!p}n7m80l`G-4S{M6%5E$1daavX)@H)t#N|EQ;Hl*)*?$ z&o&&Z&mItCOi)Q|q)3LRcazvQxs7c!QO!v>M{%dkJet*eOt6ca7B$Ua z0W?LjegHbb(K%1Y{ERc19}!rEez-6;Oo1fM9AsRWJoQO4$@a($orB6Tg zhtK@>moFWB>C%&*eox|6Skw z;Oo!-)f?_=|K07Intzoi{2k-b{4So;4Lhz}y|c1>M&Wl6v-Oq<6U2_!$&2}nI!qYw zxVuNOfE+7@Fbog?5@^OFR^vtkb!<&Tnlekl1{W>PY6X=?885yKRRyB(K?*?io=r1x zLRGo=c9Yo6C8S(vl1$>E;6{_$NsC`u9p#M>2|rlkg+@bYxE4ZO6W)l2)-l(grc|&- z6E=B+vAyaG`cA1=F$XH~pz=bR=CGo90}l=kX@B>S2CS6AA(<6{ERACB9mCQXyZS_c zF3hRlpNQ9e|8PiyF;sp}V)QPGu@HJQWSxzQLL`y+YBmK{TGz`2*9pHoa*dRzXWv** z;G!n7aMU6(G6avAKWj5yv_?sLgNeUwO(C0}T(iJrk7B$shn_@4t{e>M*%xQ2T%*-ni&EAQ4i6S9C6zSwwbl^6RvLgCppAJ|$0M)5zLg}w z#d}}9eRmWEkM!1(dwCz-Iv&s4cpro`h4(j~=96qz@Z@_ck?_y2)uLnj77|~w=j?(M z_1jhIweV@-@Ka5V1z?BO`NGE7Wuy6lY7aqEKq!bCm%({3T(0|+FD~t@GNtRT^&&|}LQdgb@S$n+k zVb3F0p4DKwcCLJWmVg9a*H3u zEIT}^qfkVpaVAD#H4o1{3n~*uDgeY1QA`4eKa4za?j=n?pw(fBwE~D}|DaF%Y=#W^ zXVfgH1ct6Mh(8pK&B%$dJ89+^FD+;%xpnmfs*Ot7wM4X3vU@h2PcctLIves**jz1Cu z5Idfy%Syn7s;}St?%Sh_w{2Z}^Q~L=U3q5j;qF>=A20fylUdrq`{`UayC)`;Xrhvh zfw82Je7u2Xd7*@F3Esg?OC(!;_{MqbGv35Zu&E;9@=R5Bs;iu3kikli97D${GoeD8 z;0<16Bfic+7=RToE2qhLm9q=5SA_B!afjkYOPqT|u1LnJwW%a1?DecbOnyou-iUKB z2eO3chU^?&Fg@(^AcL;gL3E%c#6Icw)ut{Pk*Rsn3rk3unj**vXmluPb!iM|;NdRK zCX*6jXl!JnWU^xC>oR*Dz%^|qsxA}$j5VqQUek#Xo@0Qk4mS(V>_ONLsm@T19fERY ztjwBZs+W0}hujN27qw4kJ1_z*&v zVbY*RtNUyicR#bgGye2+mOlPlzj5g^{K*#||CKK;n+3iFVdY;9DCsLQ0aiQiN8 zPx3r@nlo$D2a=r9w9?)#uAR`ra(`oOYN(lr6Bn}s$|w75rtdM`4%B()B=#~PXw6EI zfPUB|52i%2Cfb1N!+vgWR-#rTkhpoX$s09{#3`C(7P9NemKg%lcbiP~EoK^xxFPmE@&gjyq>(rg zBe?3Uc2jO{svA`<%%iRfjpb)9U%=uPmJdjOgcGL|77Q~ryHcb)j}M6@DX;%bwJ-4l zSM3mGomc?Or+u0Xc4>6DL&L)Znz0#(jSP2bV3hU9|Axx>#yC-Rxg9lWjhT8UZV9l< zlReYWQ_Rl5jk3O=vYtWM62ccSnLxIUR#IxVZC*wwIEq4Dh$gq#XD^8IFzMt;dyAPI zTf<(`&9dU=q!m5dYDeF7>s@ER1Etem^~iNMJoJW(-uC(K!SDah^M7Pe(nh*H z+G|a=%M$5fCoo)Cz`W6OoQ5}!WXjbgtt0q?Tnv~U7qq#l#PjM&`;?^DJe4#H%KoSP2t76EKjOV4TZ5T*H;2n0Y=3U5cfKq6LBQW7bXrL6JtZ{AJ95)I-p^ z22yY(W+vL~wyC+c$xM2~Faz)aPI4tw_r`R_E((w%SkhSvmXYx@HF-$dzIIciN5f(K&H$ytNdm<&G>{PO5^Q0!H-|!B5L<7 zDm*ysIBb5l-I%%XCdNiiSOT#<>Zh#T&#XG8YWxvNYd5D51Qt9D~Sk>}R8mW604Ge=O6_`XKfpbKmG z&of8Ywp=!S5B5IhHuN(74$Pnlzovri7iQ<2v!zF^D3hBcVT+0H%;q|s-R$w4GXrdf zyw-54>SxO+XSKETVXglJIR;XTu}B3s0@Em$FmPU)MHYUlKA=qZP0Smtv)QK2?M>P| zyUF{zL#-~)UBj1TD!VTX3set$Q500)2j(S*pc&7G;lW^cYg!EMV*dNh*WV_fq<7tZ z-^PP?+`n-;ihX7Xjlql0j3!hKf8kik03Lqb`QF2C*uML%@4D_=9(&XFU%TzD-jCdP zbNh#Q9p4s&=JwHGy0v$C&+G5+7n8wID%r9WFnppogU4#I8TM!9U~fhTdu(IwPifd^ zb!?VtY;0*gr4Wx%f{$ZXZ`&bt*O}lqnTYtc)eZ$ZDw_m2Z>X@Fo7C*}E0dZy@YCtS)zX zleC~R2Y$)4@E$hOCU2xuTkEv3-etmX*gSUYlnRY70&Fh9CK#=J1qTx{@fy7F%_g4> zPwM+Sa~ed7>mp zKr9ZZKc2{EKrVQlu*yB+4L)IpJAs*#XR@Ke3`(tL;r3SSc)pkwU<5I=1FQO~BTvSBPM>1!XsyG<7+IgFjvd-2)&T2;^kg^`L*KK$2sJ(DQ#M1`#6TId!nwlW zr()9-egZg0;TVg4Jkkv}o;2kGiKil(b{n_sSRx*(X8+EHqjjl!A+d9t0|# z0X{x5!^wenINmekX}?JGnb02=Yd*`PJT1;d4gc=A8NB_5mv!HN-L0Ls-SUdw1NXl6 z)af(ly2CI0{@#`27=XO#2g+RnBBbt+V77n!KYG#em-^i;5NKtC6Ri?)xJkueTJkIR^izEq0Lh)@iv+~ z0Z}QL3Wwq>?B+6R^My$2+N8=-`2GK+b;;g+!NVVvM*QAVduTa;~@^EFcVG@87A5-PNbOr-mA`LN!3@db(R z0cqgyJvgE-%}w`RuiRrrp%@8NhXcwJ#Z5Y0X5!6Ih+gv)+(5n3KkaI^Vx4hsTw^d| z=DdHI4%z$#Fo{&VC=arzLL&)rX?>K*9>-0x{@e99D-yroT zmTHm@zv04n?C4L-yJf9$GgimR2 zm1+Wt+cc2Odcv| zZl66b>ZQR~Q%D)QBn{=vP`V4w%uK;9?ubFSJRdzK*mh!5oJ}Py@q$997$15Srs?9H zA-$z*5g^$il}ttaxYoNrn`kb<3~~7RyfhWQB6qe6;aLZ0oqu3&P7$e*Bq&$Rv?v)f z*0{-gtb_asi&9rDL_eb=q8`NQA;@_$HYSr_QqMl&>L&$a0MwXF7TFfoS! z)+hq1C>H!da=F5WjId#0e>GY4>owOzA|8$gEbYgTLkppjYEsqf3n_&M1tFf^+@LdC zYphM=G(Mb&15RT68WLC_0QVTxwUCg4$~%)P&GaS0a!zVXR$jvPd%MYRM>LoMTvH+8 zycH@hIrUUjRH$=vmd#W7eroFjy14!-M_}pyfa8$0kT#nkp@&SojNn7b@=Bteyay!V zSVD#cLRJNE3@%!``pb2N3B*5PMl)juzu9ZkR);q+GiHgQpczR$7vGrxo@yuf70$fF z!>O2j-CjbCBox|o_=&|eF!EjB+Q_hvhs+3ec;ipm6bYsIX!ZHy8A4&rOZ9y~8yq9` znfJ;(cUosPx2SNs0Ab1^Y2`SKS{M1{ers%;5Wp)RZfu zIjg=_`=cjWYn1a`ys)!RS6Hh?0T_J3vv`Rb>sh$B+*-=fqCpF5r0a0nY8f?F2XfYQ zyqy>O|LuSO!C(F{Qk79Q#IgxcoZfCGSvr3&FLV#;2QQ-8xjdpTKRc#_Lqns9dL!b* zv#JqU376ZrDQqT|;;fpVLM5Cot9(t583CkPt{Om=ixWnPRX2wFKI}GRy=}1c-)J|e z1zbF9429Ia&lEE2s(d-GvUB(uwWa3snG}E+k6n4HnTDHeT-TW*ZYHb#cSe$GU}pnx z0|o@ORWi>^MIh4b#?F|cQ2o-R0n-`Jhipe5&|d$5b_N5jnEhOO{ zdl^Vbz<$Rd{#-S^2@r(>jm?C>x9B)(;%y%3P{Yzj{#a6KeVB@V!sR%u?;V_pw@ zLYrqe;<@uA#XQZ7C1NUjHdZ>gsZLS=8=%~6mH?oEwRTgO626y<=3QlSy5%v*!;TL zA{y@VLS3HI@K8fD$h2!T15pn*S}i)=>(JS?4ikP$QcESToJjiDwV9xh*1EJwjC$T9OihBRGkY&1qIRP%=j{SjZq5RFG_h+IuLd!C)lFI@|~Fe5lT97@jssMS^` zQ=i{^es4g}v9yB&QmP`szOh6ic^mxGOit8W_Rs@e=f!CDAXI1*Sch+=j+TzZ5CV(m zP}8{W_X^ce+c6Va(xEQDCO|vdFlQxHeA0$3v4r(__U+${hWY$1^9kTc+QMW_$zGIE zXV&Z+qloL=lb`e4vwpE+L9kRlDr5J&SEgvMF@53eh!a@rE@Wv)ArpMWXJ8syc$N=1 z4FllKi*hg?d=9Ju{PZV2^7MbEni5fGM1pj@@s^%{dOQ5p!`<;Co^LY8BrxD6QaPER zL3D+6?!^s{wznH}$IG_p%ywI{%B0ebC9*P?+}+In2i*CH)!M^xDs}QYe4WsaIkynl za$pPJwHgQS(h1wb;}M!|40w|bl;DYKaqh*#X)AIM5D?<(aZFn%B7w@YmaAxph$?3m z)t&?PE|1-sBPdO0hZ?ohV0&(MSzWZ{!^k~S>`iQ3zR^7JgcK3 zN7n&_kL8B12*M@wH5z1UKC7bk1>c&ma6^oS8SNd+SWEIqLq&@Zd+H1eFc!*%Q&VIa z%w+fS;PwB*5C8JV=olY>`@OjDHJkr>GM>D{n2G`5XmmSLOJ3E_%4VGmrqWsd{B>Qr zc+)yvdmWHwkz5U`H^LX-dYGVTsvHq&k={_L3=T9%zBtT;OM8B`lDT!FWl{--r0Y() zn0_vv(kX9dNzIjBcj{sDteFa6i)I%Yv9SvGcRL%%g$H+qCIihwbDH!9xX)B#S6l4W9_{jdas@!NI0dTzc9G^Qjy5O%jTXY>dk*>DLzb{(W?dHg|z-42qot0 z;tc$d9Kx*h8=&0xbV4b#pV?Sq;Z@~dH5-Ib16QP@Sp0q=)tYDugkZ7ggp^0bJi$)K zoYz1>Re3NY*A7c&VAIHmY$f62R)Fk2Q2>}{06h;a9NPJ(G)+6Ut=E0uEM7xes~g#q zQ(IR;)PCdk#%f4-NuFdKrDzBnI0v%St1SH@lX1>k6z{>I_E(S$BRJUWeu+Xrn{;Zs z#dPW~FaZ8}x4%Dn;P3zSU;Z4u6a#qmYft~w;9&RzJgF4};LAvs6-%szd~w)slQ~U> zQ<2KB4G}@O{>C2NaPtOrH@ZC7kT;apk#mb)(S_r*#x8`BNr?S9p+X;2Tp{{Y+gv+} zJ-VK*M0FuG=TWR;f{+b@u<2)L(D{Gbpt9g<#K_8Nej!u~sr2&*`u~WCozcH+9bI_qR__f^1YZ z4U;Ynr`E17M8oNi=CnJQNd{q361^kbqnlX?&W3F>4Y5)- zln|>rYzwPV9X|)ou9b4%C{>0v=QH5zdA9KCNs2-p`i3xVr_JMLLV(8P%s!{yA9Dqr z3!{)?lo$tMuiK5K1F{2wwL;u7Hhh^4>A{02hSEk7Ew`~Px1bJY{V)EH-?~gS zNwusi%L-qAQ|I3CX!e+Ku6_GyByad(xbOv8FyzH!p{%27IGoe7m-_U%|GYzA{L(Is zn0p}%g4lj21FL7xdDX^3;fTqQ2K@s%*x%D^EoLmKJh?Nk%9|(QM9JJk!bmRQ z4GHPk0-5ey;@>h+AUr^Ck=7YQEo9YtJ~LYUGP9my<0Njik;{Z1sB|nnn!I5;QHy%4 zmcy=WNYf21$CVX|9$Y2_tD{NnKY(Jy-_GU?%55Y31SX=g#9P7qs*sk4jL8@&!(Gt? zkQ*TVb#j$Zjt|!7&rlT?z&uY=fP;`a43nbCo3|ll%c_wcJ)DOdvkd9gZWgrGVJ6mX zF!3~{M^uBt&cAEcSLMTdtYZ5e+MEGIEg7Ue>jrGkvW=(iKI|o>&W#=IABZ8vM2`<>I@o0`Vvo7q zfp)mfHNggUJsMohW)neR>7qF&mwL1{_Kh}GBgq2H3Qe;Wn+<-7KpjA#-D%E?FR)#< z|JqT)#M+j#g`Rbi#;e_UkaY(lZt`cO4xsU@q*K*1WTw$%A_1|3=#l#$OS-IQH-;~j zew%y^TnCy#;rtAkQ@#hr)}E5HwMSu)$fED4)Yk24GpJ;Rez6PfpJiEw(=nzJsk4}e+6V3 zT1LCU#Gm9+fW@OKb5oLrm;eREm}r+DB}Qee2oQ`jv?$BP89B{sCV*8JB{u;Y6`tSD zfe<|zDW0;n)}>RY)@f^NjoR&oI*;r75w#eSSb#{eEwmzG%Rw%<>|U% z#F5F2crX}?BNL5JCun>Mv&1$`L5VdWDdEgS4F@!Wl`9y9|4J9AbS%tZg8dA*aFLZ7 zB~0bR!GL!5uF&qm6&kT1L@2iv#gYcTcof0_^5x7+9&`x6Q73Z0>eOlW-EaNVAOHA= z?AnzKU|AQE_}~MtKlAqf-ss=fJt>%|h*jdG-CEcb#@hMt1FYIBV|32392XObFx#m! z>vaA?mo_(f<1|4?s@@k?2XZl6cV8zpu;C&AQo22X!;YszUbtz6$$yCexqDa#Vv2&M zWZ^jpx2o`p(-;&jCb@wEi9O(Zqd;d@GQ~n=M@3b)-z;5&3VR(-F#_ae(isT(3|X31 zYV|SdX(i=6fs@7!w)K-HZ`MFG6)9CmtMLWZWmPQ{i~uqw3sl@i*sLiINtJ>{<)}Pz z4JC*|P;soGuvCLHaia~VU?kpld~ex_x|~gk1GNcE3K*2z}P-STRb+K#8D zNt4f>XTYp&f{q>|HCEJ$GE)aii7KJg!1_<%i znTFLEgu!LQ{>YzC$N%&neDK%)>v9nGSg8TTEpL;8;`_3!PyR$M39czTGsFU2WRLCh6}<|t?`yK_#Gt(>ETjiMz3=G+IY(hUS$ zluHv26pEZl;)ks?WBeNPvQuO%5-#>wCG`aFkBYx7w(+5&0x@PvoOwON(B-+~yD_!b z)@c3oDcU%5in?2y)atgV-C?QLVhtfy4}$`!3M(Xx&9hLocZP7~v@fB`0c%>r>4bkD zi$p>JQ>_Q!m0frWYm~cO4WKp=?i@(CbDuQ@R*k3HwMcp)iWX?Z?1Bd9N{+cciV{*} zjZZrI^amnUaUet|@p@qX$))C2CY!^_!$F4(x^{#2Ky!myOdLqd1*#G?coB2g5*1qU zNJDH@KL#9Wrsdd&Lv^g7H9#N@L|7QaRq~QE2XeCE)BRdSYPb4^HOj=+msmUsS)WDn#TXlGW(~C-#1oY8U{w&#M6%EyaEA`o`_Ot>E#=I9+F=Ej$fb z3U(TmUDXRwyD@CG!KA9YRy#l-l033-AH`JpRx5zR0#Sq0XB%>EY#}D!lq8QxGRu_9 z>OC+Xf$zcH4whfa%G`A^T40hzO-ct6QAon3NLbu(GDB2Au?;TyXj$8G zWoh691Fi#()HNPA@cw}Jjz%M~t+U)YGFQ2A^*;f;Wa3{V3pP(8FkZ4H*a1(OsY!XEc^WOO^->{))2?t>5eIXLF=#U`A=&za)Mfl}M z$k33+Jzd)4c%0JCi(`83S+=|Jn0R6v=a5^ z?zrlxNV>w(gYc&!@qyq=Ettq77uGSgZ<_^C566rLuP<`?k*SuD&HOt`_zRtca20rU2!&6@6+DS9^2O=DJVi@N(bI*O;OyA*8dVo zUVjL`3hGd@Dh>vzCCGETzg7&y%?m0xRJQh5c)U(LkG8-lLvq01eS9 zkBri30Co@LfGp3@MQMljnfOx{f}Sl+h&rA7d$XT;;xh-oM@t&OG6Rqiw7Nl&wES;n z25`YBg(=U4nwmoq+*lD;R)$xAsThH#YOBp#9w$eenwi^rbKC z@&ZmIehg@1ENOaFs$}qNqw@|r`}D^iZ+1`W4QTy4i+uB9D;n&AooF67;?9NBH&CDh zKoigAIFvJ2l$#hZ(IjfCTH4s)*De4(K*GNhYa;PkB>jwS3vbPhsE}Vy8^8g41U?5R z9G+t|g^lV<`Lw|yQmIjdL>*I@BQLNSY}RuO?=-sdKKJ}(y7bKR^z4^kq=Umlfh9Y} zuyV6osjbdXUmTz)hSB3^Xhn&_mOW1#n60QO6^jDvFUc%?T3mf-a)J_NOzh{+ouTWl zIY;NVPf6-DFaU7_MPa&P!X&M>I5oAha=K8;3)g5ep?5o4^AHY0*xA14keE3&LXDLh z<1!ST&&Ve5u*9A+)0+%-Xg1oFv|V95h%hl@oKDrDoM*1YnSZ2m6Dk{JY+oz7(&h;Q z7l7yxueHx7a|JC%O6ugJqAYbMpHEX=_ep9bvLOO0XdIyrBkMP1K{H+&gN6eEwpz7z zg8IacWRonLp&C|SLa)-N5v)TKnvg1NqQsm3&ZqZ(>V+>)zJw}4br;XF2~buXz3YMQ zzZ)FR-{#e^0I=10BWPBiZerN=@I0cdayHM8gqWa0&usW(;a)@(nj`a}i(=DVrRYYE zT>F5|U(=zRZ{48n3rt{*hIpzcQ_Vb+>#f8F=$({%A&CfGWC#3^>UTInARig4sB`?^ z1V9y@k&rh5<|06uC~q-4ZuxM32CxG>EDlo?L1Q&Hl(3t&BeS5DV}w#!Yy`ay8b~b- zc^p&P**joj?`wmNEH4?uf~RNUQkCfdZ4OOIq%nyX3bB%na2zv}*5`wE+-znb*WKi7 zvh^f;6A3V`gKx3mk6AL=K)mq0qe02u9*vnCKmu53z2 z79`CS4lGvZhqI|9Bgumro8+@{4Eg{L;3AtE@hZfE`871?JQOQH#`BJ4ChADknV9kY z4@N_}a=_|&e?a|7DlvK~oFR_470_Wf4oB3?@n*2?4@WdQ7}0Pr7V|5&VFuMKmY=Ay zmjkP@pphxgCjTt81xf~1ZQJ7yqoF;1emJS{>e~u(S`pin&!F zvo?cKQ$fq0xoaJ_!s@t;d_@lSM`K$9V{zoJ%-m5103X0ew15RkUyx*^BK(X^4Bm_! z5IB%oNup7IU(lAz&zj~{T|-@X$>n+R(o>^<{Ni(yzC&zu}#Ei<890{6DCoR92 z$)R!&PDCu~&NdKzWQ(mv67~$rb*ki)nn{AVE7arT*@r#0KEHbko8k)%B21XUv{<47 z^p!+f_`-e$&cHDHAyMPDdwN2m9;Owc%>|7Ufl%^Y4f_` zB7vQ_>3#O&zjoz;-}%(u5SV~^)!<_pz`d_s|LgmElOH!yWwFu#LO+oTuqQGAckx0; zFwG`fDR)V_Ad0z4Q;AhORd0EN zIG&zary4>!9oEkgjv9|<5=ki4u9bVMrUDkiXa$4cXs$_HvY}-D!Fg7-7F(9grT1TY z1?V)#0rCO5V*BMbHMB~wIbp6XV*@}a5Us2LTwca%A_BCMQfSDu3&f!} z9P~w_b7(q;`L91xJ*oo2_oO0nTTBcfO^cb$Q*isjX&TGVR^#|u>%U800Nh6=#7|{K zZ@mt>3ZXLAs)<3%c@uVNnQrim`=cuY5OU7~?I$vkWX^8(60$v7t^CqrA(vmgEJA64 z0Th-2RJV{##q;@VAO6?RJ@&%0%MssIy=}M(sNJm(9=&o&-UO%V8Fl@_@TCl zuE*r-<)2aQrpLDHX0JmVeD>OHTc%25@-8la)MH%{5)hIRkb-;y=%j@$bI}3vqMq4j zmM>we!x$+*fhL_O1iIM?B||a}G`GS!*eyDZXqjzS5y3)g3wBugZglxt9W?z6ZR&Jk zd-+xKusG*c(MljMC&PVd(><9m;iAciXfBEoIL@i)9KwK1BmBG9Kcp9ScW8(0`~j=R zX|DT6QI5wM8in=dhmvETdo5;W3C*&QudC4&=|Cio5u3eO{8&$JXBZ2PrSn{@X2 z^K|ywbF^`Ki@F=@6t`M}lmvalIhfnB?q(ThErawWe3#}8Celz$hDMm$_iARZc=J;U zL$B0oCF?L=`NWX^(3C^zB9#cZtP?f`D+0;Cp!3=LjE1Ad>yw(>>7um_(4-lU(ocQj z*LMD|Rrfxg0h~*=(k%ZTI1yYV0B-_}5%^yr1E^h47e1^dMM$$P%K(nLdE7=jaxFt; zA(HBErUV%s?u=>Y%Okq{?2v6kI3MAK_SIKFn#cj7M{f0*wXW13*g`4n#OD9=g#kQ5 zU4S;9z#@RS(lnzo3zD>68-ODXc+8tUky2m+F1I1J5Mp2gB4L;oSYok)*nAN>^EP=L z>m53WaiAitRR6Uw;#y(KFrZRZcFascHYA@Ba1rdohDY_~@qNv*OeE8?u$6hp`fOZN zj9fDKrX%&9Poz!vsFZ+ka-rS=nra{}4#}hb6TfCa6yoe1OhmTBw=_|YXmL<-Hn#-B0=wx z0mxo2f*^!g_?6Fm`pSoC1C2FpcTZn$s~`X!NlI}@P00}~A za3YO{hcxP6mOKndeyZUG$_v&cKGbg%TS1Zxl3Rdv$i0Gg_&WRJzEls^+K?+u9{Y+t ziZWf3TN16e8A|)`MuR$=YqZANL8G_E8V@ijA5o4BQCh+P;5fnn+~6CHAlleWKH%l1i}*Y830&5f67P{`{HhLB^L$&vNwe0J zCAvKRubu(m5}NwSli*i*+mqp(cAgv1<>zK}xUY60w1OnjO`~`Y-Do;4uS^t~@b&ur zk)-6JIAj4PP>%nE8u@NOM7BnvwgE?qbLK^(yPH2tIrOgcmYBkx; zZ?n1zh6=qdm8wF=!?I27#9Tr%n53CRYUa|5v4SM8o?l}l0hutZ>F|JU`#v+YDKq*J zYkqy{@QXP`@|r6_<{HhoK}g45{$Vms>B{p5^z4^jq{}a`4G+yDux7^6kysqUsxhI` z5&QtFfL7!+h$Q4_gy_-ZqRp?sn2Zl5709YwGc6S#_$wFyn;8>nI%Dd0P_s5@Qlqs& zNo$=or3RY-Y>;N@&wldpr+W+~JF!N4fvNj}73hfO9Ie_iNEu z*m85E`bv#`8&l2ar5F6jHwv=vt>!>=VO&b#K#N77%gi4!5e&K1yGOcfSUMKfW0OlaVXe?RBW(g| z$IbT{j54u{eP3IFOUh~#mYrw{>!&~=Qe^T?Z4s5aFJmSZiai<{b-Dp4lemH(>cZE? zp=k0koeK^hU4yf%s!xD<$3G;TX~I^fO;6J*C&4w)Xtflg-IVlRm(8ajFBCIDL6y^M zIoq^zIt1o_h*D`&%1^*w)m&J7PpuTq>{cQph*(JEB8(SOXW>{yGg2XX6q&WH*zgan z(#C@!?OnbsK7c0rIIz0k>2+BmCQ9_iNTle1&BZIv@6pclS7_KD2yhB;>qfiUn@0wF zg5cAHwdKER6df4-W;c=Y@4iimmuHzee>{*AQL_S!t z3h2_4`#Z;t`N$nynBexix59H5njhZZ9lgPah_DWO3>&rKfWkvGz%xD_4?Fpz9LlK! zUzM*kJ9=H%yxvO03`wdcQaX=LXdxYL0q4}srv3mV6`jA(rkj}&tZxMxwv#f@Hr;b& zh{+i)S`J!DKqF9jwW?{yRcRJdW#v7^~RdCo!pjgc-x8=HFy`$J`t3w;7PeU)D z=Po@@`@5_;%%)bWvj4DcNt+))kBVydG>*W_l*^M`K-!z?OcQ1wljg*Um{g+D({piT9iH`H903`9@sOT*>VOXRM&d34 z+797HGyBXNbMbV?`+)pz2y)aCQyrl@&^b+l38>XzB@uNbc@h#|=@Y(K)>KIpfxFEl7rK^h&fM8hUwHGfubp7|2#(#Cb+&C7XonVDc9prxu9#?h)s zLP$0=hnP6Zi|r0rlbTFd`ZkU~ijpaUv7+lTP?ul?a0F^3Ah6H{*Hhvsb5mclV)`SW zzYj1DGyWHzeO|(7$QX1Lnw5VP;(Lmd&atMQYFMl14i%`OElN_EpYT|LO^FoZ+--1mIDboMC)wuKCDORul{#2CIlV( z%@b}~b?K>>bvB~@RMu+AZ^nP0{99TUnj#Z>@RxE%UapTS5RSHS0sDZnSn zru#0-$!JRU;mB4GMk(}JYUA3+19jYA%YF$)flCRRY@)^?P=*$IE=(6@7faN*(UlM$ zT9czoFiZkL#*u3%0*$I6*Fb*%k|X^C3j`+YSZInM(GzaIzMw>+Q~Gh12!ARrs`6lpYmv_Z-HL5pgm@0yS2Y9 z949dVvBiw=o^Wa0Z6SfplTd-f~|vgq{ko=_s)(d5r9soORY{*3W);VJf6YKv8xA87HFwB>{#0yCJ722cY<7-{P-bu1U+ zh^*C0@9gX-&j+iF2%K~n1^%EV_9F(lL@Rr*)Zkmke@2Wk&sx64+rs<;nM7c7@os=r?$6J2&9 zCVkk?X!pfAUAYWeOG0L^N3+FpgUiM=Oa9K&ig z(yym^ERM>uRhkz6)4jOlsTOHz!<`T$%{Z1`66ZI2bP70#Ml7Cj?X7q`aH+bey%(%4 zpuJNg<;PmBdKl5&U7zcaRp?dT`oj8&z)+4pIf=>8OqBS<`8qXh-gxrt+B_&b%I*q< ztv5TXG69)+4B2cLS3WD3q$Z7H3z!u})fGzoD(K@dIWji&leDSUHVSRUJ=W-c@8^H! zxBj_&ZUwJ7kpaBo{$z46e|8qRA>wJwJ))>!h56@LAHKp=F9liL3q3CmN4I z>7Co=Su$r-#d;P(cdQ1(6TY^-#;+Zzi-*qvYwx`K(#<#s%QYJu zv_)~NCk)ldbwY7KC2`A^S<}WZdG6Z4Y5X4&KW4!Im@B|f+k6568TeY?-uE);kI0Io zyt;YK>u65TGAQ^frfdeF`xBcT^Vviy62nOx9IM+Jsq2Su=qg7s`YXVvv%Ckao(nlE z>F1-Vrk*>-uel!VGZbIJ{8LmD6v`YBfg3F`0AVsR z|LywU3O3oi@p$&hPk;33e?`X--Ej;+1o!rZRy&{P?`H`f*BGc)%b70{nQ$Q+(ptWf zaLnMHBJ$GrBM#HHvKeS8BSu#(D{I@<6{rEtNl)4PHlcaRLv4}uAQDXrGF!;

Q7ahF0^7HXuEj$1koFDH&eW-CLwrP~Ito}&xVWFo!*=@@P2H%~Q2{kSDVsUS3^4n?#5CJ36J_-XC4PY>n;vKn!HV3@7hT_XWs&)`86%PTk zXNC%})$&c?D**$p{vy~AGZ~G4={G<2>@U#@3;>Sf_@sPrJjr&a8TENbbt})OIpPD* zzb?in7p`O_KkQEe&;zBVB-=_sK*x;jk9HKsR!b=)>j9Vb3OB<4vU`*g)z=c@_<8U0 zKJC1)N1yxMr)lFws9ZGa9L=YCQXbI61zXCR1z-L;3%MYZug<$Z_ zQB+<1a8D*sP!NbTj8T+Z(rns{I<==ya>k3a5hC!YVPdO}f}x@!aiSGytTXQ9d9oFh zSZm>@qL3MKg9q7Q`?wAB(A1ombi6+3l3xVn2xlp98M~+@=-F;QZekbBjF)l&os`g| zH3B>-*orc0C?GPG!nSiMk$znG`J}^Jk}7U5Agd2P3sl7}%7~GD9-g~mY0Eli;EGX~ zy$qbc1BqNxB`BR~hsn((*CKf?q=QCao)%7nL2ef*BMi-`0*?b+MxM;lTDjL{9tj z&kpIu7a}SAxp^w2(`Q5KtpzH%axSgcBKss40)1 ziSh+4!d(g93gMxL$>o#9y%P=Ly=S69msoi38;O>~c5}2G%ZId|%@i;MEJT*Oa4JhF z6rV7fpyPRo6u3~XQXh%cRpD@(jU|$S=!8Z<3~Ne-bT-1AK^tkHAS#<8LA~B1=_N|! zBCE&!!!hkK;g3fn5i&_*O?^4Xc^8k_AgaV$2jDTEfZ!NTSlZ9}(!)_=X+}e+Quu|A z+a||dlbn4(&YGIBR2>ailC$)m4G#tQR@EKAi>tY~bhpAbvZX~Joc<2xJlBX&E@kyi zp@`Y%jvE$^l?=c}kLdS)`^Dk4H?8fcZLMlIUd2{MDI>VzO*ItpXcl?h5n-oQi*w`) z?B4z$+$t06N;Cr7mgzW&U2gy5R>IoX%e<-ZG+s(!BNaWc%9n+(GNJA2aP6JyrCdftMTv+|nuyZ}TwN%<(ZW=@ocN1su) zt1mJBg6D5Gny|L8Sje=xFEhSmO_E)X8(*jGYZ~p5keCq$cj?j#7G%Xj386OIH}b?$ z@_uT@J?b{sS7^Q{{>el96w}#yWX;U)hc8v?EYX0?4SKC%-hJFMRR$>D1|G=(-zD(fR8(skh#gxzzfH z4ya=F9P4P4jWXp0o)5`nQ%bDl5S7_ewBm7N6W>6pni~2KG&b5=X}HPvwUVi|wkFWh z;lZI`>C^el+VCrqvFz&%jb33gU~K6BN4h5h{ud*6z%1v{9lef*wU{t6LxU;8TToy7 z)U~Czy@f@uebbtDt1i4?Z7v-SvxN5I8A7<|5WV`NE05!aSEYA3d?!~o=Kyr@TQ zh{DBkb+VBp6f+}0w-;A>slGsZp_lghFWp-30|>Psb`bbgnC@gUH1yRJ{FM6dOjM|# zlNFJcf?g4Q_{x~h(YrbZ?n(DoBO#w>pLtQv&Tltq`}`)|aMKw&v%N-fBh>ge;@N;& zvpPx+;b$Wo3r??GD+XzG6x9++AVZQa~0oaN|qv3=;_rxXo;^&{Ety4X^=K9lg;Tou!s53W` z&aeU%HC5T`qeHhPu`>0gh$LpBM+Bg~zQ)qMM=^-rD7dD`70$fu$0)3p@c$F{rpuBf z%XyebF14SnyQimTpSxkXfCz{pK~W|_d;tB|KfRb9fhNgJKV&9qp^T(t27?F?3vq$F z%)Qey-F^D3wO8dDa`%YHH6kmkP6LXW>eGEHGcqDF+{4$;hp3B>rV~ceA;8Yn{Q~Cm zC4;F(d0u%V_SG%yLHIX{dWfVlN>as~2})UH_gzM~M^aTaS%nH~qaOf>L$9sth=&I4 z2o*lA>LSwLJyjdAqx-IotrC$?aWMoFc1B<$$HfMQfQ?6^nI zhuMxO#5EFeRT{K}o9hR7kDs6a)fhg1g_6PNLu3j=#w?%_b-5Ew`7pAskJ$C6K2*z* z318zQ6su#UTq8LsPfijeGfV;$m(TJ25vmbxz;wgd`ngU3>yG6x?}H?P5qSB4sx6=n zyMT3)aG0G-*A=x#+v8}cHN-lD5r(NraZDqDE3+DHOUy!muggg@@$HXc3jrD z)GhClM)m1kd#Os7Qc;=dhEt?X-2uVq&CNqk)oLt^3+A_ijq(qF`v2SzAFcs`R$GSz zz%iC|azEgBwvrfl<=ZaZsZ7U|T;JZKiYy|BGF+~2vtMgOSe0y(=?W<-xuXhf@f1^m zxtD@INXjN=Af!<*Tw3j+PAf#HTLIS{D#PhM&f)cUF}!&j!P!}Ws=*LG{d5SIS0OVZ zl@L{m?;LzJ9dr3Ga;*h{4xc3T2}O9o4@m?b)lj79KZPv@#`s3fUG9Z9XN&ph`vm@tR46S;sO&2jA#-KG%uB z9Ed(=kfNBs4|Emewlpn^KaZD4O*}@dk)ElVk16@>i&@*~2o*`d#<=U5x%wt`K*amU z0(si}zVIiuI;vA68y|5omW!n70XR(sz|-RvAC7v2nAE;->1U$-Z>iB)%S{6P7(pY_ ztlhEFjg&h@#S{RCpq|#$)9hd)xh^_M&{bfJF18nV>a%587$gjpgtc6x@c5X*uYa|J z=PyF|^s^y+^w9vOvw;2Q3`9B_arm|8l}Rpz?ZvD&axkhuob7j<1mxqr^dZJT^V)6_ z_DSzHREoXK1u$xx8k@EkP@TT<5GJE@7EQ_HLZ4Jad=Dw~M~2J*gq9NXlix^dm7vZ% zL3^Y$cH%(riMw6tD_gIz#8m8Q&n==Rx!k=>VZOQJxC~CK7iFyj&$AgU_5ENWTM3o@ z-7?rXu>jS0CNaFGWZL3Q8yO zJCq3i?EhWCzx_9l@YjEZr%ycL@ZQLNV8`#|3!rkld;q5o? z;QIR|EanM=kC>t!uJ@=4cqnfLMaG?vpTkGzpTVo=pTSjl1><}SzEsjoUew2_-~W_1 zZyF7e2>$HM=MUi{sxW7xS~%JP_i%BURCNfb(CJ4PXYhlMUm&yG!X{d3V`d%3&Dbz% zO&B__k48x)!kj9-n<`XdlK@OSfr`f6M~T>O2{<%*d#KODMnC}zB&-G3{>u{;OHZH| z!UK~}Uc27aPpe-OO~^CTB7LKfXQ!0l(gk&nKb};QgGw?^%uzrnheW?a#4Bn&s5vN! zL+YTY>aeYAW8}g<_Jm451|4>{&ERK0Tf(n?wS`YUo57ENatU93eGZqG3Y=6S9hLf^ z*=#0Lk|55=s4UEq(U@a&5;N>*~hmWKRhdUPLb2RgqO_xUW;6 z+s)Ju1!M2v_khfHzXXwP57<$f6YyG#qvoFLEZAIwxF}wM>d@&DfQc=6^LkIU93Gj& z<*7`m_F06wPZBvi7+vVJ?JszP`h?$4Nh2dA#_N7%EuFK`SLf-jOIU-)Rg4HtW*Cgw z#b?Ao`=reVIqr;7CqTgZ_;?aB1i3-^ZR>^IeY>`&>5DcRO9hhR3KsBx{BN(}fB2U_ z=bzvHX34}q90sfl8$yhunBlK(-o1z0>l=lCm*s4PCvEQ`UBAK4TgdnGN_eVQ z8yr_t!oDf0aXdpoe=PWw<&1flADG{<5|S*8TONfUVZq zSSi(!~Wz?3782*)Ks)Q?aWg#w4MTt4SF@(ya=(!L1D?-ZDg}4_yO27#w92LjTZO-gU zJBhrzRgPq1ccG-EK%Mq4F9J58akVBB=1qqNm$|pULdHiBqV;eiosj1wi&hZtw+s?% z-osJ*j!Dngb`J$jJ{hSR1=mXzzU>?JTyg-~`ufez2?lD~A^C%ch@9j*%dh#NByz^F zLM_R)RmQE~A2MJV^baVmFrXRxvL1}Yg7oF8w=|nkIq*Z!gK4sKdbG_bz``CxY za)&4WTZp!l@mH2>FMICah|!G0990wbp;T#lkOI!F*dQd+?EL0B;vgVTx$mv*5Vkj; z*&lrz{x+Us|4nn$sx+6*1`7)z}2cBg8k@3#$SH2_$Mv>#^w7U211jq_X2WF8 zgfC#d_h1(XD1oiH%97gO<(=&93HmSqmQfg|fC}5pCaS=TnJ>B87t3|EPN0&f1^nt) zf4BVaAMWB999x#hap38EBb66!+bX06a;#pdKn^K;i+sgd*3fZWwgKrf+!#?UWr%Ca zFjF-Hv`f)xYdCxk8TSq+>VyG`eqOZev782;=p_VAbgaR+bTqP`eOM$PeyfPD(j4Ph7I zrp50lkSk+Xm+bTkG?$?JyUI-UN$h(AK7|R=`h5Bv27KCAxYH5OQ2pAjP@9+F+Nt!` zv)RX-Zq1c=Dq*x;)6DaB8nJoh1`&IUL_c5qu-y90JgYX06DGoYld?vK<4XoXRfgbd zppk)2t49IqpSQRNIIXeE9-W0YxdNoKng95gzD6xOGyf$(}|eD z?Og_U_ZfQ>2n7hl02wx_a$H+JFUD#bS-EGI7Y8MP-D=P7NGl{eD575{D%F;ZveV%O zs$-WL^4ssl`zVfSOcNGHFSLo@jXv)RCi%*8w3S56_qZkn}(do!p+a%t-e7 zWH6tvt6DJ;h8Kk5|NdA1^Y#Bkzm-;eG8yMt(U0B{dQ%4iUeUWg?Yq$XwOtX6y>f&=w>{|H^WYRS(fn zwT0`zb3B{# zF9?~Tpf#7Vt+kT`6BTXm&{kE!^kvu*s5=Wn*n5{$jfHGOJ?TDi_MfIjrSJI9>VVW7SzfIc&2b81e0B~=RJZ^;Cw<`cE0*SoV198vdmx}lWCq2<>=<)) z%)k!wSqIVdd||9=NzSQHjFIhtKi~C@*Rn0Be~@YrqYmkLSw|&aJs8)7gweLi`LE1JY1Q-xJ?C4E-1*YEyS4em`yk z*zQn$%hyWuZ>@E=UB|Y}e9B76Q1kXNxiU2c7?h`Gw@j!~5k4i^tO)*FDo9b^vCb|q zZH3;f)UM(9jLMpc>G^ZKHhk}#Xtm!y7vXqU`0zOqKQaMH$g$zTp#C&prsh@FkVO}1 zJ!JKL~me-?#GP}OZ-H! zu)c5AWG5qQ@(ROPs9Mx&nZb6SI_yngWdLP_V%zXZCFRpFge4I^h?-xl8e&{+o&}?V z_8!^)2BQm@UVZ|T^N*w-4h7Nx>O6%C(76>lsY~kB{N@*P8Athp85sGL&yfjCrz30s zoyaMU;SBs7hJjQC5xNFddrrsLbCL#joTx(CTV;4`*JeB%r(ObSswzSz3B~t6>?UtE zc3XymD-|)2kL)v_?q-Wrv^QaYZ$cRxX#@m!mE;6rKIBvXSjOF}2^DaYpuWA@d+@OK zVYSux{GuvWyVS;RbY%lJL#o$yo5K<6Ros9HUL)Hg3x=P#M*?S zSAq~`Q-(}dp|AxfEcC919%E!&%M59W2HGu^vHq(8EUa#wzD|toH6_)c@PL5yEtV(+hNK!qB7B zsOy}wV9}h6IKv@jZBCg1u#HNVW!2kLb*lhG_=IJ+T<+NSPbJ-^m#^5B*N`+;xc^Kl zaObAzWd!641OH7iv&MkQz(?hLNjpvh4AycZeIDk-uYW*vdDUEr}W|D*2_Iw^&|itqrJ^ae-LJ%DvnngVX?>TK zKW*O$Jr}~WCu~h(0t{>#csjSHk1-8;EL?TnQ&k-&^BEyYNn-)H>o*+HD$W^#v)-%{ z7WcDM9l_#*6Ta?^OJr>s2$k>=wLRKla4QE}6l%4apiD}-#~y+x-g5t|}0 zqwrem!BLA*djF^Y?sX9a)b;**GXNC#uL;l+%6cWjJfPKR&_qPOLM9XyH>K4^BWpiu zzxMP^gca{=0#bMaaH7~-KAfe>1YfR@x)>;w$DJd9t6E~b^9lN1PSH$M=3O{6!7fiA z8L4QYJ_6HU&Xt!?LBLlKpm>hr=Xg+L1s=l)OpmlS1l)OhLwNsE*Q)z_@Jtv4WU|*J zs_HSLqZaR3YxjrVc?a_}k$?Lb#b+uhj?a=py=WplXGWi9%Jyw5wA4!lN_YHWxH@_l z-pJ}DgG!=N{TtJlxh6)bHBt!K8mYNTM=GJHWEd<$F(bcbo8^ly$aQ#IRozKxFPEJ6#4n#ReVpWGeq<;r77>)p#Tmz8RwcmmyR(!o9c)Syn~L*=7|%Sua4e z7?3a%E3g~NK_Pv%jA*%Cjl2;pd=j6vl4vQmTa;Z zx|a-4bh1%pnJi6upKd~RVEv90nX+yPyhlQs{kersE15V^E}#?-t-BwNGCbjl{6G1L z)71*~b)VtChvOkbh|zne5B!+UC9OmT6m( z(4Coz$rs}>Gn1HO?yL8=HytxAX2^A$25@dbVxasFzO_CQ06#e#1j{7%?s0Ft^a{*P z>4e>~NmI-*sqiFjz&J^Ga~jp^P{BqQSyEYQs*ppNcN9u%Ko$ge4sLGf-`<~*IGr|t zLyYFolA9Mx%m%eVLVp#xrx*cM$8qAmwY%vai7ZbEt(y|&f4qwruYjP!$#q06!SA*> z4$1{cE4pg+8MbV7R&`=0oj;r8qS=TStFC)u+8bCQ_-qP!t*aVmg86XH!;j@9rO4YPG>JY&Oq8 zgz5dvDu~=dwB8*A0x|6fBVe{pGjXSaErbjLh3Bp$wYH(bwIn3QtHg!@6D}n)WXuS1 zFxh#{dtBkYCeT7vkR5Olj7%pXIgK{ZEyAm7+?(w1y@y)+3I*vDYl(`$CkJc|e#%p9 zETVw3j!``z06^R<%TEQ2(y>c1Ix4qKzI&O=Mu3lFA3P^f#9hh;6z;(qZr_dD$H zmc`0kYgRk<07p~MLIGztQ%eM~VJ*Dz)6@3a`i2*~eB6>;5@JIy1{l0gmy z_)->~!k$ICuiLd6lAGB#BDoG#Yw&V=95BvxwoLotKXXhcj{A3EVbAilf z$##%-m~NkO>p!Y%ucbpe{jzug`z`ADu?hw6yKagP)jdqc<4ds};MSbUq!z4`022PoJG5@drhqklirYw%M4H@{B(aKcY1CsM6)t9osaO59ZQC zqdX`9Nb@urN1oqQPiV%dXHnaB+StX^3LsN4Mq&h{&&PNudATXVQR%BYUJ>e7tAA6_ z&ya*{PUxvGZs)2TP4S<)QE_F$+&_#+&j1TTyOo z;K5`X!ekb*E0p}zF*~L{RD_^V230DYL6&!!aBz(=q*=%29CLY35#&ZFOG6cT8RKC` z1%r>~`ISCNydPj+!;w%0X`xNO(ToQ}}$Ksm+}D&6dmd@yIjMzbC>Ujiy{Op5Vb!D#Ko0Yi^ul z_xF|Gb+)6}@pv3w%SN`#p(UwKm9N#-<>p!%b%? z^wqx+@rRVeLt(lmfv3{NVa?S2Jg%unDarc{SIv>dX(uZ8_90C>p=dt95DAs)!t>Izy9(KtB#?!zNd8S5Z2Y7Wgq83f~!36yAO9)0+IN_bLAvE69 zu|h>b__(Le19HJ>!iP4Iy5PW@O^NjY8$1Q}*olHKhh7##^o-;YMMl5fHhcV&fA>C7<33CrM@axUm}}HUqxxjrBohjSe>Wg_XQA-bjSHl2 zGix^)50L{-aZyJMLuNbx_RvBzG?y}{OHqeP&!eApN$T*J+)dSX%i^741aVZrY=L%B z9irC0tHbsPP+$_N?0;WEyu-Qf&!yt4Kp2lpT8m>yWlC5aFO?v@>nAY13NX--C4nJ$;Q^R`i zu4gHHvmr_XjJHQt=S&6d*o183(yVJhpj|P_eK_VomJkvY4fgx^M0>tg9fT7289X!K zas(>N>|nhHH`5WiPi9=?-Xm~Slm;mB&-aHPCWO{vhhafUDrJewZ66q?r5kHw&xDq` z;&jhRGZ7NJ0iiIsiCsV^M%8n!)V=0bl)M6iT-r6n;T6_!KaH*MlvDBL}Y5?1xfv~ydwp#dAQj7h@x#YG>= z24Hd>Zmw5z;pcPquU2Da9gAlcPHjWMkXPeyq>5%}u+VZ!2gGj)#i>uy#Arkk!Gzs? zu6cI70G7_pZBjD=U5k&4oj6aKBad1WorR}ng5q)-?|Le#-P@=TGO1)k zA=jQisMs@(W0VSQmLk+bI2(t2(m!r)VHdBpUTQ4QrJaSEb!vK{UB<8CvS7$3zCU`V ziQhJEcMmoR#FXxujAw8$9Kej=*}ZmsOBZA2bC$+k`I;fb1F{)RVTTv2DE36w_b(L} z=~J810DCT$8(6KV=3@gRQRiK>iM@=gm-=v=PA712F?$0?w06Y;poLWA5weVBpWrKWIPj-@fe<6U5Ybg zNTX4BlnQW^4dCzo`f=-f;(dafc!&D!HrnDzu3@01tt*S@1Pc0^KtI;|JuEgmWCW2C z@mOfbS#nb8~}%X4s-@$Aux1;SspSY_INKJia$t2ut6|_a5!bC z>9SyotXx)N%b%lU^~Lim_`%B;@bdDEt>Z?5>l|(myGCIP(UvYEe2xT)LmzFmC z>pM>wH)Mih?RK|;U9?yJ_4b|i4z+&7;tz7YH8KEV1p6pDTBkqdfR@^@U`_aI>}L8~ z5&!M=6YHK%z=t|GX3~mi7&RGB*uiMV%z!Ea^S4AWC>>BN`VU?{hp#_=4$sb~oK|Xd z|9%Qfx6W%sY+64*4Edu7|CqUTNidRQg2eVu(LRfcCMN%jFEA>P2m1v4ofEdv>^PZcgr-dB83_+D#a>XT#Von ziGMg$s#4C3Ppn^myPB)}+~vTk?HD5zfe6T zl)RBeIPioEV^GDIdVY2n+P>u(pxtu0E(Bt^#@biM(8+74=9YqjDs!aA7A9p2SMM=) z0#y+tS#?5?pJGf@PiKQ9gVfXMW%vt|6W8+zh#4uyRCj;eC*auY=z}!b=?}kGV;Q+?|24tGH`c#ng z7JH0<0)v5r&?tO7A{aM79Y0p6RIM`OW`Yg#y6_4{!bMTWJ~Du6S#)(HDd9Mt2m17$ zI2`E(P!kd+8n9u)Q?T6h33Yus*LybLjI|)4V*PUl@f1{)!yj-g0jU?RlgJ%dCpZ`* z&6W3=VembT`!A()OP8*D0XCUYX%(4@gC>9pf-KTW8MTSHnmNQe^ksu%C~}`qHLp?@ z+Kk~8@~;m97{lyrI)=$GL;}j3i6aN)5kmy#JqWGi5Eg6(P#X{53>J8dclr7N>| zN+(uaPy9;~9YGnS6lC>#pxd72S~l@UF?aXbM9hvXhdg9+cSZIMns(xWLU$*mjL9@KG-6!lY-QgHW3^!qgu zew=ERzmGw+&uj#*3Hir~@N=E<=f>yPV{}9zD*Ye0c&j%agBT2WoeL^65M$N8Ks_(h z$Uaqxmuy=D>`P`Itkx-)T;u1M1J1>WOsqjcO%(nevY~Ny=JUSoh$Pexfq4+>D8QZ@ zqc;OE2jZJ=H@BlRFWT?3VV9mk3r>KMcm}YmE?|s0(^;=4@}Fclic+esiZ4fm9Cv@} zrstALxw3St(t#e7QDx01AJZ{yk{Gy%DHp&vae$7N>;47ToeQ{1k$&(gqb*vUCOZ1+ zB7SL927KR90^7w7qD{n1pa>u;Iyt~;9O4`w%tGNOP~i_c`D?dW|Is}Op|4K}SQS+v z|Lg*M%FN62lFIZ@?8i$zL^$Wl(qv1a;-ga(_dQPLYI+xKhh8ZZDhekW6>j`ccz{J;LyYj)4&cB5RY9peSy4pEf35uR9Czic+4Ht(K{g?O6Bd8!3C z@3>Qv^e9#h1aefBEF>%6+4gNiU2J{F5Z083Js4Va?GuTLm`NV7v=WB4exKG9u_de? zaH%q3iikcz-spX6oAKs4po4d!}U%Yq* zlhL3k*WD~7UJj!n-H-}Hm7=K<@c0D;qf6zg)!gsU8Nvof6b-jK2{*U#yY8#o?Fa^- zrZXB2mlOO9{8H!Ze65WMXIdg4?l#am^Wkl)%RHO#NKkPBlr2afC(M(uoI=I0DuzH3 zQz>!_nE>g4#`Plmc~aVa>pwZV&<|la7{OpLQf?`*ou#KX#R!Jsm_NQ>G6M78Q=TL% zKb0*^0y2O2h+KvrzkttQT*8zrZ=hXReT?`Az9%Euc#t7sWpK`fucpN7)@im8ohkrH zqFai%i&Ku-SBjt7A6)j_b#KE~WF&}PBw#io;(vxeOIMsq;&F|&BJAr6Mza}Qeew#1 zvnx&bN}V#M&MtmR-;s^s-CZiayN+P7&fdDOcJ$HzQZ?XT{@s0)Ch0vHI>w<710C|% zcdJ#+0Ha{YpFsEyK3jcuTN6`8EMNt3Xe^{PYq=}uK$Ic9H62n*1cXwAVjKZCoTd)6 zXF`D?#0cnPTstSXVp3*olJ(DFFlMPBpqzsOB;sk0QFJA-?*Lw1opXTDr_V3>#BXP2 zp8hPlcZkbPqW<}W3~B29lzmDqqPrjBJ_smYKZi}46>3XybV-G+=Zs>|QitI$Bz-Qn zKFqfst6@y=m4nI5#YO*8O9#Wr1g>6vjKu#E1}G_JX;xQ?rKtwgmPF}yWXrmHOyKqP z9v+veAcN>=;`b^DTI;Ltg|dQUET!PWgY*wN5ypXcxNLU4w}PbU1RJBiJf=8s;S!Y% z!FIfSudLHoc+I54KmbtqP+c#c5QQk;fIfb3w6nz70+Ir7fEqde3C+ebC8u8xf)O(U z0eMU0Z1-Zmw;MtuDl;hu@WWTnkpZ0H`uZ)xKW@zKMq)k_KGibRu_Q@wOnoha@EGtWq)$f5C1Q|)D zB!xZ9BY6F85APqy1xns-NvKQNyVuL!V4$WQYo*dNhwrN{9pXq7KTp99Y0^;4T`F1Q z-ysqOrw&u?z9aUQY;;C^h#0{@SJUk(RNDC%eOo{bZb*zkr6E7H87@kzL`gg3C2Gc# z_v@uH$kuln^IoP5pdk(9c8_KZ@wDNWTPnawxf?zkHalI0hc$p6Qja@*)~Gbr?+i0P z!V6ITPO$U@&4X6EH3?sk)?to>zmE$zY;%d@QDsjCIzNgc*zWgm`SHgvIX{C!ZQ{!f zqpo*o#D4>dJD+di+t=^m?e&U{;U#>M z6F?QNC}(XB?&e}OH>A@4)XT`@m|0V`-dtHTuiaX&Rw_6rvW*RLd}(p6N-@=*-w)`) z=<^f;O6k0mz>zSddFI~mu7R3X`Hn6n!xS+AVlN-I$gtKG$mj|QN*?5*RPf`i6JIEc zL7aH7iv0o}n^b4yGd- zSg#|ve^_$1Akhs+D3&gn=#Oayj`5?=)w;}u~kMu zapVj=-4!V19AQV}3{H|6eI2x<(SfnIZRDZ2?=cjcS>~!y{g98LG;h^g85|UIV3TXq zZe^|VjEb(EX@VJz29yE|lko^P8#{a#8!>H_eYDiVfUA`7C4ETnXkFhw!U{hG<`T?4 zQZXZS^_-z_ov)tu8|Aocx3F5TkO?H5IAqeyo01H9Ph?(hZT4v3bqOAX@2)p^^6N}N zT?z~=HY8k|JN#A4J%6Yjr2?1%-dyht-pZ@CdcQ9@5>GW(=f0&Fj_Yd2~m5^bkgQu! z{ZbXBz(x!H2erP8#alFEw;kEXtgUr_fi@7BB^Sw=7^x)IlI=hJsOpx$bt2r!I zkE&dD*O(7*03|BtycdY@KYsZPKL6|`TwR{AA+M96J45Iw1|Z~G0uS%5;rf@~z{B-5 zqaKOCQKiV7Lk+b-NyT_#<4OJg<~=+--g7^m=B8vzYIdg#*+y*>tml(KaE{W)_4n`K z;bFy+YF(^v9Gg5IaT^YTb=UgY+OakOp0DS74>*xUb4{CeK;Ae~h2Y98;E>j0@D5X{ zap%~$q$e^wadU9h?Q3@is+L6MS9H3X6knM+D#;$`zDmS&;>7rZB3)Id-^hBL-Lx6} z5T&RQuIm7VH7ERujVk0OD!}T17p->_I`S{Z({r_agyrG^#ptb8`3^kbKxH6W>+xs= zuReYTUwn>)e>Kyw@pc`$+FTKMgjBVkFW}A3e+7@o0O-^$GVu6(u#ZX0sm0%wR4Cwa zgtLIb6Sf4fER@t`Xt2FeyZ9opkKQ-Cz94 zTTXlFg9T{XNug>@HhXu3r6}(4fgfutefdQsuF#(SkB?K@bMz z9JOtXA`nTPS+5q^eyG``? z_>j(hFZha(PleX~$$(p>KHA>EvPRv$lP>b&iRkb!FW+F?ywc2>8 zw9nrKxDf9tVI^i?Y>0X!fl0J1!i@#serc)(mAX1c9biOWh%_s!`_#td=)1EqA^7Yz z%_*zS^EwTq|4_{sgDK5*xmu#G9~J9;ESi#y|B_9Df^I0_>uNUQ1HcZS?e3S?Nei6h z@h7yWk*{+0**;(*0c)M8tF5c6)m@UDHjy%%mitfVMl|=LP!fPqJ&i}{;cf}9fAJO; zw~u^}C(0dS`m2wr#9<^nfz5IycAEt(9(G5E0aH8C!7Y}km(Mr*2t^%VPA4G@CxN!w zH=Zx;i3~)vl-1?2b=6Yk)FPLwikx?Kt};KC?G37!N2arfr8Kqb4!@%=!lrzF#$7-uC?<72|9fTub{Z(WK2*kR zwcO+S?JOc|rH`&*RuhLrN%(ZSaup`g4Nf9mR!Att|A|l4d_4u$0f(hAVa8PqQT;tb z^=5-oW1LPDh^#OlwWpP>qhYHe8vvCS<4QL^td~1@^X)aVwWORU64JQ4B&yo>D+btw06_7+g(ts`DQMrJ+S%BG#G#1ZO z)q`jwoATpNKe<%^%g9p}aZ10=T8#F?G6qAO^qfTJxu=0Tsk-Sfrr~U zp8jjjKOkH|X^It8`_MNDQSK#e=|>vdqYA!NAST8LhtmrJadZ?QwNs3M{8T)BYVgA* z)G?!U-4$-`y&gR2hz`oNtv!oR1czlSlib6&NrNN3o024wSQZO+RI7;TL{KD#QsL6- zkeoR9#(v=7cXS6yN|%!{Oh*GYMjnWAwl<^PR2%Jw0fVrRYV`D!BcsRDdhT{PtX3Ip zw>ebmUQ`Bj+yqQG@n8_b<;6K%;fEp)^W4Hv3d4<sU^M#Wyv&U~28)afeo?wF4z zTabEubhbsi6>R43V83|)Ss)s@!AJ7k-~^WYZnsV0@oodJfAt17>kS(NjVs#4-9+X7 za_CYA3{{>j`EXj@-^INv0$1C~57PxHBUNk$I7NmgWlWruW=I>*6@yG(iHulaJoRWM(zA zmQ(60wdfNc2S{+%_r=3@s%UL^e8 z`c9vGj|F<|)8ho_#2+x4?X#;(F7sAG!*zEqEZUqI&yHgBQCz1}pF+@~@lFi7v3*2P zNU4mmKbyddmoMPiv#TPqwK;L+9c-!qnn_4flTc5e?_v44SHv&Oes7P%Hf#2f*~Uu0 zZy0*G-%Q@&JKkC+c%U8605qkom)YF&MXKi`^>?=GA&US-pFM20JB1e0)xT{o5C^6- zN<7VIK~+d(zunjc3ew%&R7fv~%AH+J$9#&LqNM=+)$ZzJRKW?{e4~&7CZ;1(73Yb~ z9E7}aB&3M~ZdIq;at#)HXJ6aI^5oL9g&l3Ba_RyoT0`jG*fLWdvk9$@*f zgJ_%8c}I_l(WA(qn`x9G+f5A@sCtt=ynXu}CD5pd`NK~t+tCcb49WL{x$hOoK;`$2 z9?94dM+vM5|DOth=={f42x;-BW%Bq!?(f%dkNQ-SG>R#luuF?bE$8Xb!301_DpTAn zq|eWY5qM?wVyy=DZ_-$;J+8__MZR)Q;`xx0jnW|vdNaQQ3bju5uwCBbiGPh7cg`{U zW$7<~(y-Anc5_{$<;biPuCOv-!soaeM^xTH$wzljgufudU;CWDpwt7qovG~H{%cZ? zo`3YbAbhAu3(oAv!T_SA1`5Pk+~2|N_rHPF{6Rs5_u^zca7FkeUFM~fX3OX^`wEQZ zm^@T*0Ae-0uJm|RJH-aTLkPog9*)F)l1I;pZAsZlyNVn7D#>TJPgw6AW&V!uM54r@p!R1gwmr_2{P&6HnA_6xK#TD7rs-(TxXas?q0--n#{ zKuJA1lJrz*UYK%M3~J8ANw87HN_EvX>)G;*5I-_2;UCouL#z;fb=rrLCT)kbVR$jB zCK0}yB%8KegypsFzMFb;^BGo&L;{QA?ce9D|L-}Be4+gDY&ucIU)Bn696H)`5Um8P z-g^*Ea+rNomtOb)WJ9y8EsXTE5qvuYu^HjQ;Eod%ex97<0;F~_19-UIZ!VslJ*WW- z$v#b=V3w<}O_fDxtfhHjF%@;#WL))RJoJ?Xw}W7eo@d-7LdYl)gn}mc zXb!*=QCu!8(p_w zB%czW6O>AJ(F)b64M&Qynk77^7UI%6jmns&T@rwML@M`0ox(vF!gw@;(P)f^P68&$ zsW}DflLWcV1#BLC*xm_3j%P`Lfr$L_nsQ7=jZpO~;z+{XH!19HP{O1VL8cUwWc72i zT*Wu~K6$K~^(3%6Ply%_F~{dK6!ri)+#a%cXAOy-3exG6@Y5R zY~Cy4XQB_vOPVm4(nt%T-~(j-CWD9XGT1J2n2y6%s6F<+glF#tSyt|RvE zSN9u{vC>z4S~LP%i1s*{NWI9){WiA^8~@1Xk1I784Y{UVo>tTf%ZoJXI=yrwk+C~P zhXvb`6!lQ8qI}se5p9GUA;ozNRQ-Bk!*sE=cBfn|i6kANasw!#r!#QlfE}?&WI~mN z>=z-PQbUR^^!t?I>ffq85y9tqRPj)#^Vcn&t5RdRq$$#=dd zFd+;D;YWK4f-NeaQ&`{UeBhHB$spC0qlz9Rg~Ti6W94^8wI?xvG|Ap7K!%Dn zN&plP2&})LUOy(?4Hwa0IeNQR70|pC62OS1R<5CB zm0VW{ZqtN>B3{|Lv-IXBpD;-?C~^~ej9~;Pthaiqq+pSlH)s$j5xzOJLxf{StTw-L zr$)#K63qxk<3XWbIeU}NnODY|>y4dqMIz&ws0!Yl_v@dYsGqbdoi>B{dIt}y4eV1B zC}tJr!L3~AD+H~n3R#YmQmWLJ9`}6}Rgw2HPHn#0!`*5PXW@*Y;j6^1q>H>I0T`)6 zDab)yl&;{8Tp+&xjyChK$@MI0BAW@-E3$Jz}mj9|IkaA|ZuG(knjF)IU@ zdVYS!uGW~v@)!<^C9bjQ@ez>`Q@)w6;hXDwc>Azmx2Y$(%%r8H(floae35g!{c@Et z@gKG~)W_xNGG;4O`F{QW0e*dZ58EhF%&4_&!VV@Y6p@k_gv9rP2Ke`aQP^xAEtXm` zWrV(bbq*i@;JK<3K)AR@RggyY6^;7^N`L9y>$i)9*W&~u(32QIx|Vl%9&TEz)J&1o zi$luVXz0WFG=T9?J-R5+VQUTjpNO9%f{a2x8wgX%0`DltRQYW!2cat-*>qo9biE1j zZ4%_w-qa~{2@gFR>6H6jgr`@;hR~XjcS0-lW_-QjV2W!tMJC#>j$p2%SkBL;@Y$y? z;nPoFu$#6Qq?c_hpluR5ZTWV-fp6a5DZ)>Z-cg;^YYgENJlu2;!#IrDZltcW-EE(< zLZS9xyHDV|n@1%6dzkNb+(%Ft9ozR-1B6UOBSrpgwuzmh`1G+bFD(H~ucq+w>*sL( z5lYGdsvrB*TD`gvO2AOGRp&CNuQqZ_ z#y*@)d~F$TyK$_jFQ7!WJjO+$jKfG1q*<6Frq89Wq=sXb4kJ~^sU&nCgbK4y6eD;_ zt!f5GqEHYa7UHHil1MeFUGpdX9e| zsk@%wS2S+2*5u3EwLeHd3$S;w}e*M)87@ZCIBr%>F zx{N$VP~p!;x+SJb(Wc|kkUc)?K$Rzl0aJUD5l|`@#El-M43H7{gcd`VT~R+|7`M+N z2GNNgZ&8O^BUeA8$SAKUdQimSR9aClO|KAV9Io+Yk=tbKuxdFhjpmi_3EnBmU>F8m z+Bqny1PgnA+Q7*oK*fk;BmxdRE8LszT!ZeW?xW4=<;tk!Kh?6Yhe2Vi1W_$>obLoh z{m)*&AQ*7;nJPhUUBF%sU>g|zHwi~D3&(u=Ga;qNsYON8OHC*JY`6!2tTm#}<*n&_ zCNr@7icxH=QAILG-=2(PKw zRM%y*eSN$%lG)h^rsE;2EEVm8q7_ee0a81O0qAH0@tb$^^!I-7;=1}`iPMjff+u*0 zY+_&_4fDN(MlgpaaE_3|Yj^V;;+=%yOu%65D8ofB!Y}VPYnR6aLXv?k=_U1PCdV#8?0e)5;j>Sk!?Vj7Ga(*-5n))|L3?O{pZm_i9B5BW z0VC+C;94(8$pG{pX2{6Q-~v^GF_mx1ycXB?{KkvW7FNo~*=`b;KkgY#mA?{Tt(i`( z{+?O(Di}eUm6qE+%@}n^pB+%u;$ef>j19nbe`S&?7ELmC{${&TR(`WO9TsX=D=N*P zYB5A6Kq;-Bu37m1XX~O1*H0u%Z=cjrc0+w3U7D1~j5*AI_MGm^J$ zTqI!b*AZM_FOYHXb>G@zBu&jq%VDOC*zwwf)pr4`-{Lz-$|AX~0r-{5R3scmxaZ&a z@N9GrV^l$_UWF=ZQjsN@rgQu;udl*!?I{d^ALx7DH4ex)EsTazI|cY}9%|+!0c=r3 zjQmm>Fe-rU&FVSR#vlxU#eB~j#PixrgfGt>s~|I2qa-n3#vFuFvsoONq3Mre!WFTN zY8hb1G~+X-iaEsf29v2O9B`y~+_XxNYC+>7dxPh>vhn_&TQ|pQy%^)Q8TuhSA78*w z44g?jE@`Ro#q0R^-9CrMbpq>su0c7v(Tr>~8Q_gWf|w^8PM$d=NBat=k%0BP09LO< zNY`F*SScHjtef>|3;Fs(H8S2K1N;RtiW?;MB*l<`F`^9YCawhmS*gyv?ogd z8OUoK@H(q;Z2?XEITp7}Rnxt%7(t?Bd6OJbTWhHZn!nd4H)Z^hG(dnNP6pr*6REB7 zWVnBfV7*D4CxfNe+P{d{I3<*_vZ^n&^~~Dj~42*$G+gyS)^vpkM#N+Jk(Y|IFn zStd{E_^CF>Mq@N!FNCYn89bj{!elUVUkgSBsNSzW1O!7rS9sdbHze+7?1n9k&WFcg z8Xd-i6c4GaGTp`osfGL2JK`Ar4HEzUPOrP>(#!y?0HVqWD3?h1ze0L>jYLoG?4~qq zI@5;-l^ef2pTK|hpZ_lW{_lSI@E`u}4KGoCqR;lp62NRcdce7_qkUE>gJn0mDE(S1 z-6S&*BiMxy(q=}6VnxzUGu0m=v4s+uCe2|sRB3QrsPmYWpr7cp#i2DhzGK3i?t z?1!b2VpK?^85dqxh#b8bI|*)%0WyH`*$e_?2--5&kLX&1R=-e8N&}2qs?_vp1=B?l zHi{43f4Kh~l&2-YcYQfL<5Pb+n6PMHb(ps?Jg><0G&JS?kg_$h&8w)HpLWgQ0Qqz|rezwaH^QiD$6AR(_UhS3g^YOjs z?}+&E9nl$1hoH6{)Sjs4L~$YXK7a4Gzl4ABU;MuK(U%|Ndr42K22^cNmH@U3pL8 zcXBN)Rxvy-BSKZRZsD%ldkoehDeG*CGaps0tF2}=Y4o`~)w zRnxaigDoe?%0Ncx*ipw!TDPh7Nd+vn9#^|H)q|b)loN4$uS&9?Bf-DG6Mr_EXjMg) z_jhoBqEauXczdwhCGhjVy@kK{^Y7pW^>m)Ab$s>Ial@DieQF=2Y+xQ{R8F_`$i}>? zUl}b|GB}H*)L=gF1b-SrEK2}^Mn^KiKI6%d^ZIi#-w}VV#QayEYHBjXNc=BfT)-dy z^Pj?h`g>n<6d+~cVu#f*;FH?P48WXt+kLVbgu$<4DrIqyQ_L8^UV+)-ULj7w7Q% zzx5e>^~oi3cxD79f~xg!s83mxh_FtAZRmr>#lMepj^qj)RmWZR=oGCh;{`?TMcXy( zkP%RMY4hSc_0Q&pS387_dBf=h)q*Jq(d~WcEwxbUE;E9-^4$8lXb3+=VqfiiCj4Dw zu=h?=O*}2ltm7>QzFdya8BVJ?cXhJ6pF!_#Fz}ga|N5Id`161N8ovF_Ek{Zc64fEQ zhxv}f&hc=%zTLvlzInt0VDF6fbh0Cg#~`9-OaR3>xCi=c*6z#K1};{6!T@H3`aB-0 zz6xNE){Oa2BK*-XfIs}{m+)Wzv)_eRFD^MvnfVBXSck!z=AFm3lj8tPFwoDwxz2v) z>lfDw5x4l32k-4EHPz?*bkmx^4qSi&IVri_Mz}yf_~IqJcs7IAZysU3+w?rQKrb?I z9`)p0m*J`{ti2aC9L1SE&gOzf>2m3KM~Y$!2t?-ADP)^9ss}09CD&86@p6{zAKnE;7fxekD^ZK_=BRkSE{&pC3* z-^Gdl=<}Bx{#tvnylM{WAqKF>VSb&#Ze=z{WuTTOtHwr9Ou(;*gzT zJ4hpV+%DiAKf5eeQlG<*uLlLKFZCEas`t3u!O#Eh8i{|$*a@}bDcU~ZR6p=50*?LV z>jnJ$+c_-o@4kkNbDsWYPnf;qQMzu$2~e~7d&=EKx@H9()eqd}1Vn?L?N;01#SwsWmS7r7N>g2NX9=fB%R=AV*`n+s*OLS#Ls#cYUA1@-~N9 z$5p$6hxqxHerQSkOag}mT-@sZ5r`oI{o*R)~Z^RO3Ks%L9yfpT-7g6 z{c|9WL(X`7wtDM)M@KLYVFGTq5fgJ;EOu|8s zlrbnzx5(e-uw0=ehD2Lr`&F*R7a62FC{QOyM!PA zqd$V*{zv~5&dx7U4T!9RZ$&5KSVp4>`~(@mXcUr#UyY;vj-`(Kf86img&NoC{^JkA z0CsV9JH|od;uL}L5^M{lHuhvV;*>^XH;_6Wy*X9ms!_!^JY)m`XP1E}b*Qe!YnPK+ zfMPB(0};d75{1Sl0eEH`(a@6T%sbwYa*0}$FgyxGNf z&#%r_^em;c(0eP}fuK~v_OVQqli6fK*#^a$b!&F}=237U^)}c**e|B{SUw!_95p2|p zIV4l-54lg*^zjrtuK+8DwsxVJ8)5Ekw|kZhPH8MQ$H>KR=5YW15%#-SZKld%^`T|M z`e*}FRa{~O{;{}0Gu^4FivbbAjRq;UJVhWo{q*L=C& znJhprcb0uV+@8t+^lHEZa^eLI19f#tR?pc?1$)#EXaTJVE2;dMu-m8bFkkD%DJ}oB zAWadD{I4ViO^|VX_UZ~geR+YBM4&D12X>=5^-(p;SNNO_0XDhi|m^d;)>s=Y09u3wZu)X8fc*2Cc>fd*rT5$zq?;ubY>3b;6;^u_|U#d#>3- zjaM$Ufw?j9adyiXbKn@y`|CfhDS>23RN0Q);6zTAxuQC4XdFFJ6aS7Aj=* zA!Hmk4A)bBem?adm)pwql6?YklC_HRoYI~M38t3pSKr;GS7+n|@V1{#zqBU9GdkMpy zLY-N!sESOE>WI%(iBv{bkERDf?n2TCXp@i{SNNFw3_{PH`dHx$-{D$KP=XS|S1ztD z;^<&99)m{?APWKoPLdr~S-+@w*Oe81MRf20g_aJ+qAS?WKX1BkXWK*N>GvOnXzyB_S z#cPx_O_2|wt_l25VMfSirYZd+Ya5j&tAM~4G?SKW!FD^GIl^0UjS0-H3Pwtc9p#n$52dK`<5iH}Z-q-k!#+acbKm{t&^niQKVR$5o zfa(%19+oH-P>#VK`j#zsH4;zB)-oKq;mM3>8O0IY&2RDKxrY6It&L@;ZWD@z8=$&1 zMCO))`^CG&Bqip^+=Jb1$ftg~_KTC;oXjm^GPfJefhsjW`jC8w%n+ppt{kOyb8Fd{OA4Kj@GHe1-P*NjeMzT+_)0pkcApFk;@5ex@Kh8i_4g_Xo8>fbTpZ+1)ltXg=d zy|rjszwpbA2oOgjt;5?Y1C>rqMWtQmiazl6;wS|I|0%QaOURdK*sNkOxdQIlJH9e*La+O}jvjPmV~U$`jf`N!E~X+f>_h_}r819(iV@J<9+!`B z^Y|X6t_ADn%@e=Z&0H6i6Z2` z2gw5x|99YJCP>dRXdQe-2ORzU;a4x=Kl_6p;`<2MxZEY}v7`|A%kQrr_yJD^i2Wc& zKx&i8@OC(2G+rK&nS%>r+8AhLgYaz4i2q}62v^|@&ipaoXtVHgXlV76kSc|gDyveu zF zy5kU5A&%!%CK^!Y$YA3ke;_}Sf$&~X`5;vJY4U6aqpK;NxXS(^Q-{6;I>g&ZGJ#+i zx!cz%{2E2}`)_k~09$ssXEO0>gTy_x58&O;a(MT*Nm-r?!1{b8i4sCp071To!S;Iy z;`g{sQu{+etre-4MEuXMW=#0M`;*T(VW?0$J64JwiqCvZl5AD{?g{P548U-!*Y6%4 zC!;}zOh6!q;z3nQf19R$Ra#xy1JDu6BP(>r5rO#gEEuyiU<>V42X0#=q(-j7vkBq* z1>Hwd?PmSclN=UW&%5Zq_61ioC(!}>g0&BAIE|wiC6g6OD7%9vMt9SI8KOIk$37M% zZE=+3DpRL^c04Yj89JS!0+wId|n6q2okDkyZT zdG)^&tbBBj4DogV$r{+W=&Ju}q%T_g$z%+#E`1p8zXy?R;E=dS;yxL+fBIXW!$19l zAHj=f=iCpuA$ycxlgcS52~ak zX}&n3F(b&SAm$zx%MEO_wfOHX643H|!d9fP*}Iz!1GgSpI@|YL8ayF5DG6gd^#_wd z?IvR$bkyQhMzVkaJe98g`Y#jMJ}SZ&70JNbSa?!E9?3j}==~7#wW`uw5Wa)>IcgQJ zdG*mb{Nx9pz}4AM5wF8os)?3^h^{WC@CQHr3V!tU$I9SqQhY%dWI6B(HJ#l2$zS|B z0_LAjd*@FEj?*H)d~r1!oXQi(0JsS<`z>LLibXP^TwOpyi`jNV}2)gtVa*sGX8mKmR}ZE>8B=j-E* zU?53P`+@0kngX`OflKx!oi>&2T-cPIgIf8 zFFtz)U*LUY2TM~G2T=z0AS2wx-2>P3?|b53|F8e{KmISkuK;pDjlbq;pB*JD+N)*w`oRYm8n2kWDoGYqvfP%?vlgC7ojn4((XgYQ0# zU43a>0%s&ql+QnT20!}pB^T_-b5sAqK6(=E>HCjRt@-UAe*z!BxF~+# zJe)Yn@IXWVpG!Qe;+JoTivpoSb7Db7K8k;Or4l1D>3u20u%Z_SNkCF9! zU7JDut~tZ<9oRZiIUN8|BH>|?aGXU}wPCszOgL14>KY4q*dro!uoy~A7iVKe*tvh) z!X{6w>Zq9!XvRwO{p#~)@ci&UjSW1$s*FOA;x+X^mJ&dH zKmZrWozIX7+}^J^AKaB*S#3OlL@3+>d-_Pgxx+y2_oQx3FheF0M#PB z5Z^Fi2YmMN73*tv4@(qZBj_p=QJls!kw`HDhK%#wxq`0KOA(pzO*wq_d~f@e^ZvnS zlS&}2D9FUUEgT*$-H%|K@t*P&aJ`2EfqJM9rbdNRssiA!-)R`aC{TEgg{W_1+QmUw z|I*WW?aS4gRg*zD(uCihOW}QNSbIt5XS_(-m;nb7bf+;9QZ(DCCEjnEI{+ zIwD5$6#W1R`0LMKu>MZJOKsuhqLhe?v_v^ABz+Q?4I2zCuTV*z>R^2Peh$m+o`FD| z+N4yrusBY)_&$va@Fe}8+6Pkss8KLbGi+6OqP928-)W%|k?EqD-KGc*h9L=JpTHo^ zIl9kdOSl^g#l(Q0qa;99|HtJ9=JRzS(%GI-{sTCKJKG61lV+qAjNB57)oj3oEVz$g zENlMigH1CQ)>&DgFrwq}DxatO+3gij>uBIHGbl=|>qg9k@E0e@I47t+1fEx{;lXiN z2-CzyY?0y4=S!6O)|@Ca8jd?}uZ~7&rb$(JZ?0Dyh38k%I}S9H8$x$Na!vRip7dT6ylNolLHB{>l*@Cu30G!yVd z5*Y!^ym|kK2h#ZTZ)R2fN z^Eyv*7@wv#~{07lH$N z(p($5Q6df^2jvRL|?14?`{^j7w2rSRoDdW@OZNxBr#v#%;oj_g$R7H zyuMpLR=Rvr`=AU!O7WiIkaKAmx~Rf>)wXSwsFRYY4cv20im2Wx)QjHkRCzGM5-|6; z2d3^JXy%KHDZp~4v*Rj}R}M8)xyw)mnd3Nj*vGjCqiI!@I6#byMug06L#5Ag!N;Up zn6)@gzppWZ6FtDZaWe_o7UzWjel9(DJ|3Z_W3v(T?2`xt*N6yzv7~h7ls9g-p%;qv z=CFOL1rg9*DRXbfqEuD&DC~BP#>m4U*b_0Gj*CPgenDN-B-HaLv1@&o zGtg+f*T1(h4Jdyn%pY2}Pgc0m$>o>1K*d{Kw0|${Vr<`L^!YfUe07whC^zGPUBKE8 z?;Z~}s|4P@yN3IR2TnO|p*XuF79uF0yMV`s4Se&98+iNu1MB=;!~@(+$#h9NHtjD; z9slH`3(otno%-dCszWyN;ZJe_|L}{K@YSc!dEaFPR$pVNdVS3Igg^1m{_&6D(~qy% zSXi}faQJy>;L9Z&`7)U!AwR(1{^BhYKO0ml4`~5`;PoV}{_>mmutDPYHS`%uSnvP* zXWvl}5IhA5sCe#EJE%4s_!7D2yg4j#y`0UI7*~V`x9(MzS8`jC+hn4FL=4Gra1eKHimqXmgy z0ngV-%m=uG(P~fK1qzEK?PMgfke91=9c}R15-`UQ*0&j_5t~#0VAHx2pZc2|-u`+4 zuYY|HJ7nbK^$``-r0M7>0%vq=09p25y|{p9DDwNl>v19qRrMF=@afA-`0-aSQC%1p z41s}IEO%vW3rP8SfAD)>!SDahmoOO(VZV=cQco#L(g-Nrm)3*&qk0Cv_~sg3zkOiI zqAIa+WKSidkyEl!m3SZ^koiW9N!iF44LJV)+WQVTsp@P0-@SKwpV`?qy9+EVAczG) zV+V;X=5L~jCceZZCjXR|Vw$nVyr-!m_9PlxY*7YTjEX2lLsH28Ys!-m8|OtrV_EHU%Y7 zQd8#ldjX}`!*aY;2vwfxp>BajEdpvzXC%u=uk8R6zP}SD}%Z5q{!vtB8DwlwE#^YO*0%)Y7P4i>TiRFx4m(j$W^` z_}sev;mk%w>ECy%AP~V$Sw}F8R5yTNx)7O%2su8&JxkmVV(2|OwHUHw>#7v#*_cB- z{n8TO((?se1~Hzj1Sqfj4Mr~;Av0KAfir-?aapo zARvgX=$a;Q0LG92;Ke}e{@sbmmm&iK4muX62#r8rm`v5!`_G(!m5x~$Ij7q6VQ^xFK-5(T`AJh_9sL== z6s>C0f@;K(bk-#q4EU+i3KJg{(y))nGzjSo0c^7?E=>Btp%kX=L?4Sa^E06YSb+Up z>le;%2mqa0hiWpFcElp#tfY8WnXmK1(oT&500n$?mmM^7=0CIfoRj)YIzpJ4Ze9ei zJe2tpO%YOG7hu(XToRfGZ{YU)A4nB?sYT#M;6%>*_|rag1(k3h2-3N{p(R-Bs|87g z5zbKf0nub;nvW34E+GJ@%?`?#{sXcvWEPffao`d(OoR#`aGC53gtPH&}j5U z!7n9rVNy-KNh9e_7mgIPgbc7@Vi7olRBF!#YVNP1E?N(R5-+NYsKmf3gMdHckm=;m zIaBf3Ahx8&-n_`oo1asm)m+Cl(^wy)>nw~wC=jq?!QgTdg<{NFbyLO4F1)4%;=Wj1NE& z5v2Wc!wzb)1{e~pB|f~>bu)hx0!+b>m$-av5|ZVqD_oAmkCjfPNGb{W^hyO#1+62B zRG{%^T_if6dWmE>R0mrmjh1|4njK;{(hs+=o zTIz5tw`iXw{M~A%=PK?Gg27IwOk%MhX=;cub6-RgO&ZpUz}yFGAr=W@U4WP?AeAt) zsNB!9aot6PnJ*hWN}UJw04z5`-98XXS9M+VQ0~ zR&W0D&#%1`FgL4h5v!VZx(h(BUgJ4U`HqK|{%>bbYQcf~%(^NXiez&1rr-vJHDIh| zo_+x)i$wygT(|T>OVJ<+F)F>X`Qq)(j8BUG&K@?@TsxiR&HuImH@X0ziV&j45Ui`J z00UhL7Af}mgCyS6O2V-QD!d%VXlP;fS0c7BW#S9Di8ts*m@MNvQeibng^ff(P9~ip zsi9%&J7)}S&jMd;fXnvnLuBphPO^DZFPlxEuti_-61f2(o~@rUYfHVKBwkldJ^z8(2}n36nBVrx&Q!z0tFdCL1g*K7hdkU`Tiy6#AD5$ zN;D>3Po*=ms;kTzC{l*(O+ruvMu}%~`J!W52A#M?0CU}7pVIPGJLZBHUO+7>q@L{K zD$LXbMg%J*(HJ3qzne#(D?bay0L*L+MPel0+)9}_!mn`z2&m%VGI3Id0zu&Rvmug} zsmBV0f1>>0hg?)&WBn*2*o(0 z(8g;QLorNw!qRA7Y9)n&VJbL0hQlaZ#B9up1A=gHy|bpbkp)NXN7~yO@w|`)V&MTR z|Ip;gLzk(;f#st*(6}9`Kz5}dPa7X-pq4iCdqT_Rh zE7CI5le}CzHu&C*}qdLRFhujIYO9TKA*fG@4r`7-{eM!FU z!6i?n)6&O3ba<7uU=qi zFv%RQ%3X;lOj!LWN^1}tFoXmw7Nf4gazB=L7K;$#9!@7+4Dm+8Ef|eZ7g`(Q0)FZi z2xxDck_YS9oXA?Jd6G+~$=0pCY>s=UZsYc`R$R&T;)C#Qo&M9nsmP72lv+zV*^ zF#7to>qG-VOs!sJ_NQ%!EQHb=KE?w~J|Qq?TBQF* zNDmq3BNC>Rm^Dy=nZ-#+L8FC&UR;1+4G1&1cqa@Umi&on1)o1aLeY9$7^BYUY77BK z)nqcTUBej!QaPWDKx|{EWK+?)kt$kE#rMFFZk*mA3Di#{;kr0+J7n9D?IIh1j4QD^ zduYf?P$Bx6<7bm8tqJ3Lbh8$K(1Bcz45f3cBTfbI;Ro-7J@=48!vZjwi3cpyDY+Vr zOHgEdXhoNc-Acuxl2ODLKA>9vwUryNbr;T|h#)iw6O%blP^y7^v6^Fd=KD$t5AVkgip7XT*GlBqPF^YU94KhWKuJ!=1{ z``#4v`?XXiEps7Y@R^|m=ufZ&z$HM9SL(l6SO&1bpgALx$yd!=@IswV#V|{&A$X}! z$_ofH07Bw)I?7(OZWP&<2Ax=t4_alx9g(euOIE>*nPFkf%#Xx`vDnF za;>iyTuiBO03&@G3;ReU8nj#w;&N0~MNgqAUjJMw<2?R5KfmFs+yDA_USW+C>dvV1 zuZDJ~007d#p8=QPf1Z1B+jW0=>|5br!{?_?Y+nb#4~TxUAYnPd^8hXFEE#smw2H;{ z)B=EcgoE^B3))#i$oq&>RjN+y--TERP_+mtLssQjFe4e5rnpjTVmOGbFThHmRlZ&> zB>QyIw@oLhL7t%6X>V3AKGe@Uh&S9o!VQy%ClD28mub6VLSDpR01mT6;c?)MHgeXf zhm&Iun?V9zH%U`p-L@!)5UlUVWAQ*SXjFK{PK6;lV-%$<+DnK~o`NYw01kvl8O*rI zF3D0skWc~)iOrq8WMD9f&r`9=9vQ+wN5K}SzCKunB1>WMNa*cq5>$#97nn;p)U8vuKquMM==QfIu9}_xC?Fo&G}i8ZtSs`=v3 z-@^0ytn|33ToN7-ruV1?k>9st+7-)|zkkxDH{SmW-H!fA+GP>`YG{uM03a?AHSl}x zf8uHBTbEq<=f+se{DWrfcRxfxv$?EfjtvwOOXYcBz=xy!Hj35>XN+uC!y0XPxw=Ki zpdDr)^VJpfH?5>VX@7yJ?|}j*uY)f3e5yE#SOtMA0!YQ`fP}U8w)rWmzj6*r4@2OE zUUODvsjpGQHem6){XXIeg^Al6AcR!FA1Ez^LEDagvQ&U=_mZg%EmT8#5iy5dU*UOS zh@`~o%|lvIQpiM4J!$kuSom3P1Xep{mp$U?b#=oI4f;X*_jjx?e)j z{Q@fyfMiQyyUXG_`~!hL@b}G`AXZl)_LVS#uW5NX(a^A>t!d&Zr+jDLYfZ^rLj>XYr+o@K`7fcVu_8|hPrKYkg^g_F+rdaSskLELCPn&qCIrOh^=td zRCcI+bm1nY@)K4%xg@L-i7{fDesUv70DeTLfL8K4@>>5E&dy8XB)sJX{EBs1Ns225}0jqYx^vyD!{Grp&KUAt0;6 zybEw-jci!B^se34CYQ61B(cF&gebFh@1U-ptI-exk{+eAEy6Y3}{x_Ba11MjbYIEACN0XWvq zl4G~YECOU?MMn5AaJMSnp@=y^X*R4gx{qZ*kX;Wnoaj*J(h#p(-P5O@e%ATF|G|Ar z|Iq_$n^ILxrn`&Ai~taXrNk&fC3)FvE8bnU{GBr8k_a+xsUf&i=np1+nTgSrAi;t7X{!|fvF;2I;uFl3D#uZx=8 z-5%z0@aemDARFe?A_V$cTro1u*Gyur05ZO6nACPtc3HI@WD&Lldd@%+tqi*qoY zJ$YSDTr09{k$yGr2Z26b1qxPz+gX5-E8UddsYYE|aP0L1_nC29caJvz;%o1D1fCEC zy){-FH)fb0Xv_%!Aj}hBra+O`Zu~d7?V+WAY>YK8ICQ@Qo`l$8E}tuk4VX=Tv<6@* zjvI!5vYG9rCaiglNZfP;oVKB%jO|jldTr3j<%PL;xR9*-1Ih)1gyW+Xa0~KD`vkag zp(VaG95YR?hq?t)T2$^;l0G)y<>;%Y@>G#M#2XG1r`N7vrTp5&U!c_9<srw{toWJrE@;T~os{`O2#BDf z-BXZxMgjbMP!O()T3=izvkYM^d3o8m)zf5U?Yf@L=j6I*WK&!7q%$9U;5ATs&=`~JxpU#00>g)QY$JPs6JZPLtO%_3KG^p>8l4% zz#EJbZwMN26jIdSVG;a;Ws*#0@GHwcZW|_peE}V|u|ACH$?|SN%O!*V%6b+&U)%ea z?BWBU$*5Z(Q>_cpXSYiTI@?28TsQND6@>~fh?0*&F$woNPA&Z@af$df8K)|hj=vG5 z%b>;0-+=oBSo^EjZzF5gZ6h9;U%y4Z#LUz}>jOgWzc=?_9H(@fQW8EpG?;DJ)I~Ob z&^zKB3c@oWZeBP9DP0>GjS>EAE{9-KQ`;v$Fr0GCJL~+b|8o0-Phbf=fs&M6Sjzih zX-o?MARZ-E!GC)A>1CO#?zr!oM19+WIs49fBA-{~d_FH>$+XoAqAT1Jh>$=ufn}=# zh{0~Th_X+JIy;J{?Am3z3#ldW3!57vxL^R{YIg*8fnh+405*3UXnOkUVcB4eLZXY23dTS$Dzp)Fe_(ZLR)xP4;upb0% zp%i!1mL4qkt_UT@_lKI=p1vWncHIZ$gRQ+rYS{K3bym+24Ejhk3Y~inR$^@RIM7g4 z<>vbM*7mk3-~7|V|2SjOE%&~MMLp>2kBvZIB^vVrK#+(H&|j55KKR(1FRys-(bxQE^5z>k1rjp)b;yDDP z5D0)zq0lAZcaskb>t#NJ-8VWHPLPTMApnAimEG<<0fZ7*hgpGyv_vTL#|epeB?3*@ zBN?`0at>%=D9?Ut%@(p^&1Q_fI2>}tnT>2;R#?;5KTNfLHzMT%$#Mm$LkeZQ8~)uz z*1g|}efwDGQ|eZk?^9^~Sb$n}qQ65VsERBR@b%HOiALfNz4+$8=binl8*hGP#cGI8 zVNp+h4;1z62#p&70HiV}TZOuTH&?%#{nd?kT|WQd!;d?7*8a~?cR``181zjSmL#9c zCQM6@KSca7ZVkZq7EEHsCxo96DF%#pp6jx{Fq6xR(B{-6Z>S4nvx-%X!f2@4V82+S zkeUkM%!BfI^+nr@Uu3CbLP9hw*HIULGG+XRAOlv-n^SWmEOl^yH&Ctp`pQi>5r<8} zk&2$R6+taTCYK{ysOE+#IuNT-O7Qc`_Tjw)0IR)b-Bz-VS{uTG5M{xodx^dbKw!dZ zJ}USHHm$Ckfoho%1ny@z80ep~-~K;*WA&EPANl)>YZYG9Gaj_QnaWWy#sR@o=4Pex zzb`J|G^K6geY2)c%?zhghjjP$x}8oZs(49uNDjBZXkSHf5Qoc$W}TMLGDq07kbq%} zCma{%5}E-eTSLV*crK3S@iWVE?YLeO`u#9_LH42MMyK`uq9Fi(%i z0D^H33D&s{Ak(5_Q-jK>I!LoSNSZ=W2vrD%nm2`+0BSy8#E?3VN%(wTGL*`b&6I&5 zaOWuUzgbtE+g-d2F`!C!9vsS$UAG1G?TAyA=CuMqY6SBsDkpe;H zhC#gX>*QJ=CPu+HZ!3bqvRJCCX&^=9Y3-AiWwOpMQLX>rJL@*WJxQvzr%QTvjK-w^ z0OHRYA;{idw?6;MTdSTq?y$rD(NteI^MkJKZFx1XI~;DE3II#K1M^jJc(BPuS93$ucEC4fFPVEV;k@&766(_ z4g%xL)Uo$vTqKZ&@{o=(p*8kx5cR%_*G1_*=BkMC7S1y1RX)IlcF{WD{cy!rN zQa%3QSqJ_i7LE+3Gbt7uu$az{o}i)-Pq2=-0x`N+oa}Ae1f;}1&}t0+E1(Sv6IM4Y zM2mem?*gq!!{>wN0`g!!pXrKUF;-@$TtA$$nLwm($2^(@c06NfS{YOwGaJ% zS+*0Hg_dFA>j$7*ShAhUi@tm|o0TUfT3#4R$tV0|(e0PsyX3hfhv-trQc=&2(6|=> zK)j0z127Li{oK%P4=ufT=9C$qIB3Sqms6RvqLnlj8RjIf3Uj!j=Dm(6^k=og9L6_+ zX^(h>l6Ah?r~~A2CpdPBBNUgypWBf+9wAE#3W5UHRCNe`4a|KhvqJdoLJzi6lS!B| zekkc74ppfr49z5}>)dWPsjrWcXf(v2-bLWF!a+oqV3=A7TRR7+07w}=d4+Ht5#5^L z>u=iJgQMYa*e17ZiqFZ9M6Err@Pbt1LxjHqniIyFKf0ZB z2{VyuXQ>UHBF_s#MZg-#tXmD1qB^= z{wQ&IgGSFlB@)Os&{zZ?FriB$+Gv)P`mTgo5s=1$=`n(NDx9h8yuupLi6j6et0uTc z=vD-@W1;nd)dCqOi41#)Co3x5bc?gw91{krP;h+Z=@&=|%2(a-=l*MN`_m7PpL@V5 zGbgsK$ma4g_2VIKpp}D2uv~$|>A`}Y5l4=b!rBC%bz65oS_DPGDxGa5^5EwEbiSV( zYs*>6u-cpNuSlMuYVZq>cMBZ&fOML|Z=i_+34NIBL7B0RFHkca-%n3F8;gC;FG&EoL__B9C{-txTehMBJFX7!O!#Ktg?R5e`kk0A` z;8*$L-~Qo$wr|@y|FBupuZ;x#xfFfL&{$;EJjl#X8GS??A6}(301@ZTu0hh>H^gAg z`Jy!31B+vzsRE;|BYuRmt^gcqNl@X~Oik{VhA1{dl~*B-TqxsF9mJKBiDe;`?S9Pq zfl}N)`mw9OH^`Jm$9tApUA>og)7ez}8xld{=LBEBo0|On^qeAyXL&Bd-4abDu0S1$ zw9X>_x>nvhp%RPdg4O3x$KT$XSku*$JN>NlulwFz4?o?*P*$~F_+IH+^|Go3M^E* zfp#(iV0H{5@hFnchNHkt1V9uLy$vJs6-T#$xruE}G13qVVmfj(L1`BFBO^NdV*SHU zaCv(A2Ki77dr#dUQ=re|bPzvUSRB%;LNA2K-@`W0;}5Pv8gU-&gM0*oiPR-foFvfD zPQoqw5U1DAEP-;XqJYJ(C~Bg<`KBe$uAF!AwSRdSPEG$NF;w31QPi^|v{wrNAkkPP zGbd5L{eegR*4|Jz|J0)ozscoPFwnzs2=#*J%ZW3#um)^n15!cLi@tOKmgu6NJo=|L zk69;1Z#vUx5(z;GDvU*UD7?z9(%NI+i7G^xS)ryjYXCm~Fl;vwRu7L35g+fiaDI-r5mq^Cb= z6y=E1vu$j4=1BmLleOL|7Ol5d*M@^eupmpJF4b`1oMu|c%WNeWsvpO=8qTbmOP_Vj8CKKb=a?kAx29f|~L5I&du{-y^fH#N-r_}l~j1Oc@q4l;!Rp|#pYm@JpIHDJX9*lL_t4cKZcvWnp| z7;P9w#^w$H3a)06EznK>n)d}08Da`;%`t3Ff|$l=*R!}>0LX;g{E&gJT)j%V#Os1ANT^z$Q{oqiT0fsB-cTcHn)WdgOLVaBw6cMl1icCBbg7yu zH^u9=HpCL&yk+sTXPkfeAK#NWSVum;_iKGKeWV0{AidC7B;T<3fz8jn_|jK85)Ee_ zFm>{K8R`%Im&qbgBfaiXRx?N{N3u@rESabTRyK7sClY%KC^=Y+d)7SW-rzO ze7D14xB=D|32FU2RoQN;@%JOm(+(!yV1%gD5)cDGN*@We2qfzE$&qmM;isNoGw&am< zCQ;T}hz;zxr(HTQxcppPT~AlnD`Cx7=48 zH<`+lzWy`@+{E82lIeRmA51E$2L3|g+rvfpeJ;e*_hUW2Zd|*qfP}zlxQQfC>rZBN z5nSt+>;n#+3V}Yi%h4B)Hhu5T2VXdC@!y_XD(p4?d>v(y1^^#%J6Jy3 zQrVU6tKm7K;Q*PCh*S5#&)VAbLO2alWSN{s`iC;Sc3-d9s#|;yOpsNh^>IILFd&4N zB2lf+0-t4RP?P^|{7GlNe5`RIX_`8hxcwot1kAZc!Ox;?ms<78w6>#u)`$I=iH&Uw-XhA3yZa$LeFzww{5$8L3Q~ zI2{fn=2f~sD_CQ->{hF(QneqZ#@s9|R;?WYkY@k_0?Y#%-8Rcmb{$M$!KiZx7D8S< zNQGA<*7)dk7!6NF+cCU9 z5dhSAL=mj6NYF!~P3_pjfy{62LWFYbREqlYd7U!8To(xrPO1<8{MqN8`~DR-+_sTm z8G1u8Z*K~AanrA4AOEiFCm?=@biIB6$!H+r8xP( zwBWCUYoTJ7EC0Oe-SrUsMX#gA`UU#Py8xwR)D2J} z@aoEU)J3=c<(7eAef~b}Qy+osunCaVAW;J#Vgoot#37IDJM)DI2ZNL$RJlQqKqXjf zV^?lf&W?to-5iiqGeeLuAy8Pw zps}difQ>S?yd@QWV0kUI1fb9chEnEL>wfm){R`CQ7zic;UWCp#F`sV4N;`%o>clLk!WBboJuPz$v zPiG-hU_ZzdNDP&L@?I+{U7^5qs$mTzZ3~ISU(6MG@H;dn0p5NVLh{vG0~Vz5ab6Ae zAu@GJGu8ef_IJJVP&4>DRQ;tWV*?}_Fu&s9=(?thDQ$ohS|3n)5S!1%vI16>50Wfn zjecI&<(7unn)bN=^fSKppWpf6#S4377D!RY3oz%Nq?!Pzl6W^5FuDA?s%pM0HeeS44Snek$(|K&z z!MS`@-zg7T(tZ3sFPSu$9jiq(&YldXK*-${SXY(ko7v0Ujq-0>a6q<0+LX< z2<^pS;oF=}2j-_TQ4RV&%BO;0WTpQAtj_3!_cpur(aALYFMXldl}C^af24J(AG z=DGW^Ctf*d=JZd_KX~qUm%qK@r`xu7McghIta$J{t=2pGzlujjjC+XS3*Xw#%xAUu z8n(a!egLHKzyv2kGghoXBshRW)v{Pw=i({DO1%LLxKknZjWFXNh!u~FpX?i&%-0H~ z!!UsvTo};!h@EJAjchI;;_y?g@AY|bVvrFRD8EkhqtdyY+!FGw@7}WE+_M*6`2d`n zL3CkJPfhEOf@%U_2Z;NX*k=6N+pE*`bNN;0p8d>=Z@hl(8>`e{eX%3Xf#j=pwYfE;dsD(21f^7fyIK;~D6rs80f(HRSds z>ex%Orghxc6!o2Z>IIio@CtFjD$;m)XoaCJ z1y}-LMTpt~;2kI^s*gty$yZU>?7fmkMav@tgJ-C4>F-Zb?JrW8g*_OMY4H(c7Pcot z)UEOQ-CP)yHZ`&8LKwIS_Xlm;b&<%{L}TmEo_+Q0JMMn;rabrcp@FBy`8!BEUc_Fb zQUc@{z>?FycIqeR4Gi@yeCNHjheFK^H1tr0va|*el?Tjhy4rJ;sjIbMbsp&l__ERV zBET5{&l=&#V2}vazH!R@Fz8e>MdsiK2!>eHkFelHH%qw~gce{P03xqilD0&YBq|v8 zot7Z`O>aYY2P-ByvQOVo5`%=cU6Pb~dx!O8DlJhfL27TE@aX2wp>r4BeD7*DeTOAq zMs?#gDx+EuaOV-_VGT21xBm5S&#u|9^@OA69{QW0KafeLQV=#M8(n55@VkMTf#Iql zVGZnv%PUNN(7;gTH=(tWcwOArFY>#stDoWAP`wAkH@bTU`Ah+8Miy=g!}HTg|4@o_ z_6{PfdWEZ2Yb|PW%kjx;+R;+z* z@DGb0xoGx`{Xcd1?1NUMGZ`h9&m$nI)xM&@1@hi*F^YN@8n&V#N8yD^73*X;p9-zN zy=#DM{-6gl6l^euWd{U{0dN>{a1*xo4v`)}6VkLwu>nlqWpY_%-|5qz$mCqdeCHQ` z_}wcjR_7%?cdu5|v-7A{2(*()SkIKP!1q^PUAb!A@kbnf-=su~r*EKtcJIJ|)8%jo zRAT(6bVz2Q0EmpJ;c<%bDEk2L#M}>u^4e&~&%r**x5F9+FKav+8cO5XEeQ4zNiy*I zaKdlNvEkMrP62=>UaymE?-|1Fn82{SUX1&tvstAs92)Lun{>&$8+w26>l^ObLU;p@ zzLx@X?n$ay0K15|mO^;)MYrD7{o8vU{K1ro9j6{JW9B>QYz}$~3~QjYAV!ec8mQ3q zze^)IXdS33;_q+S+Q-InOB@2kB1kBN7T^cAG%+-zPRjh6Zto@#LKp-W%-x$f>E-?b z>BLjNd)cKI|L%^gn7~u(-rF@)69BuI%z&hKJiKJd;IKOX&;w@QP#2D>sdR>cj@Uqu z0f7c)v4OJY7lU>M|BJ>ZFyXgs>!rRv%*C+42rvmRQFj1V$*g@^$q{p>Vh@0wbwOCW zfu?Dy9P;~<0e|F|OP*bM{DoKE{ybqtJ$uarp0P?b0k9hgD$~G(g%$ny^Dl0{c9{a*um)T%7P{G)jBm8r5;k@l24_NX zj`+@QAD}#+d^~G<3ps2~2bS}~5LClzFG=wefauEQa5&4+2hIK63(Ma>?pHS~UPd2{ z;$SlcYg&IdQB45sW>V1_VDRME-nF=M(QS*rG5?SwzBHk^WfQa+Lj>F|Qy>W30gs1g z3P_dx0V5F9>O)mtIP4>#kgrfOY>Q;XzJekm=+!@T&J;4EBZ2XOywSW=G7?S9-J^1_ zwYhn9eKc|UF<<`g@87@l`F?mFl=0PkEyBNBsU`sS0BI(8a{5zVc*|Y)G}X1tJ975H z_XNCNgeT{XMYhZ!ih$%QG6j}ouHmO2f51(mu^`p@762b5m4+-Z$V~ew6YI$lbEcAp zx{%T1Z;VCbeGVW8prQ{1Tqx+%8tWQw0aV_vUT_Ug-~q@rQp@Y_5vr8}??GbIjAaSB zjsLLtukYi5@AbSR3(@GNxeo&ucK!y@kB7E}u-hQu{E6d=K< zY+3XNSj-+UmjgjD50n%``mik#BlXcBG~Ofg+gKvlNSRf$@`OZU{d*gG&i}>lufGqk zUtsaq+IIIC)k=ZK2tnYBYjW)qM;$gX5_BzEzh&d+ayh8ocWJzzpzM9Y=qzXu0<8;G zgidF9?Y$M@&=M**W=?G-2ktuwk5kIPuuUqJ#iAckbqGFsV||z;8X_1dgl%Bzj|Jge z#t*vsoa2tnXW=HqFWEc@q%&!2eg z7r%JYr=D8+{Byt9(z&h4<#bwF0|lnlk%?7RLinuetpNd8YTr?W*n^Z;!$GR`o1^rn z53L7K+)nFJX{hycsw&q-qgy@h$oUUF`O=^6dGu+lk_5p})B0nBY64&kk;cI5bm|t! z_dW4qo z7$u3O2nGsO4(?%L@}neCsT88;mKx%Xe_OG-^V}a_y6_#s=k7tg`4-pI;@xf@`HA}dAs!lIsFaJ$pt`_-?nf9%F*UVbw}1qg&Xv|8Kl*rS>N7`uep z6ar<--(H=6b>*t-&N}6!XD2i#7QMb|_}p0G2UUd-G@L;Nz=0zO zfS^Tf0BC*K$L(^+?QJbDIUK=rj{f3>Si=vQg1n{4P@}O%H32ZrNC1-3U)9r&KPC_h z`+xNA`|HoyynSof#bN_R5M(%B3z!@JM`w9_zy%Bjz4-miDG6o)|K(zn${mbR1*N>l_cu>Gt^A|%#%+zSW`2LR;*by9|DLl zkw^pxiv$2Cum%8-6ma+F?l+mt-nZRW0Jyjdz=vFuV?$!4<5B%gO3vYjxFkin` z!#@tGRth{`iE3eBVgTK_>(R$wd1w8WPtHH&@c#<>11T6*Lcib;WENvJ5NeztxG3WC zRaylSKN}3%$meCZ%axtbGV$sw{n`#!oUO-}yDg9OX`5$h5u0Gy$?8(O*w=fooq=%A8#L=q+NNPja zz>~}6v8b@4eafv{w&xZA^UEx+Un}LUQH{nLNyHf2N4{~|$qPw|i0Lr|U4 zTBo)rqB?vgx5V@o`u9_ho2_4U(HZ)}b5GMRJMVP-EIRLV>ZL#VtorMpd`7=x(YM}P zdh5k!7{{l~uj~j2VU223quoP%UWVotCMBEde8Bj5`q69zfVSxT z&#Axs(JA^hKl?)d_RGF^`{z$Os?9j8R54mmqZ-v{tPqyqF+qUZ`s^>9cI;=5J>p+2 z^#Ofi0S^K2{!>`(pw>XK061Nx0zkdw`zPzSFZ$2TS6=Y7FB->UJxVpLU!xk0H*(-~ zPG$}K*SEh`_q{KC=K6gmHsum=KXnU2>SvCdtzCW5f2hCy@nhic-`1HLB5GL)?c)jef!rA8S7IlgHig#s7C`?#|1<`}ieipE*lxri=<& zs75ua(YPUQ4IqQh>gZ7Jxa@)>&;0a)7=Fi4d23p~Mm5^o2?K<@^2g Date: Sun, 28 Jul 2013 19:18:15 +0200 Subject: [PATCH 09/11] Ignoring all items beginning with "world". This is so that multiple worlds can exists without having to ignore each of them - simply name each worldSomething --- MCServer/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MCServer/.gitignore b/MCServer/.gitignore index e455b8cdc..8452ec2d7 100644 --- a/MCServer/.gitignore +++ b/MCServer/.gitignore @@ -6,7 +6,7 @@ banned.ini logs players whitelist.ini -world +world* API.txt *.dat schematics From 3bf4130e3fc05f84cf7be7e33656f3e29f0fe12c Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 28 Jul 2013 22:55:09 +0200 Subject: [PATCH 10/11] Player eating is now properly broadcast to other players. Also fixed the API relating to food, determining player gamemode, and removed several unneeded API functions. --- source/Bindings.cpp | 467 ++++++++++++++++++++++++++-------------- source/Bindings.h | 2 +- source/ClientHandle.cpp | 5 + source/Defines.h | 4 + source/Player.cpp | 2 +- source/Player.h | 42 +++- 6 files changed, 343 insertions(+), 179 deletions(-) diff --git a/source/Bindings.cpp b/source/Bindings.cpp index fd85abba9..68710a743 100644 --- a/source/Bindings.cpp +++ b/source/Bindings.cpp @@ -1,6 +1,6 @@ /* ** Lua binding: AllToLua -** Generated automatically by tolua++-1.0.92 on 07/26/13 21:48:46. +** Generated automatically by tolua++-1.0.92 on 07/28/13 22:51:46. */ #ifndef __cplusplus @@ -8439,166 +8439,6 @@ static int tolua_AllToLua_cPlayer_GetGameMode00(lua_State* tolua_S) } #endif //#ifndef TOLUA_DISABLE -/* method: GetIP of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_GetIP00 -static int tolua_AllToLua_cPlayer_GetIP00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnoobj(tolua_S,2,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetIP'", NULL); -#endif - { - std::string tolua_ret = (std::string) self->GetIP(); - tolua_pushcppstring(tolua_S,(const char*)tolua_ret); - } - } - return 1; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'GetIP'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - -/* method: GetLastBlockActionTime of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_GetLastBlockActionTime00 -static int tolua_AllToLua_cPlayer_GetLastBlockActionTime00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnoobj(tolua_S,2,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetLastBlockActionTime'", NULL); -#endif - { - float tolua_ret = (float) self->GetLastBlockActionTime(); - tolua_pushnumber(tolua_S,(lua_Number)tolua_ret); - } - } - return 1; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'GetLastBlockActionTime'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - -/* method: GetLastBlockActionCnt of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_GetLastBlockActionCnt00 -static int tolua_AllToLua_cPlayer_GetLastBlockActionCnt00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnoobj(tolua_S,2,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetLastBlockActionCnt'", NULL); -#endif - { - int tolua_ret = (int) self->GetLastBlockActionCnt(); - tolua_pushnumber(tolua_S,(lua_Number)tolua_ret); - } - } - return 1; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'GetLastBlockActionCnt'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - -/* method: SetLastBlockActionCnt of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_SetLastBlockActionCnt00 -static int tolua_AllToLua_cPlayer_SetLastBlockActionCnt00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnumber(tolua_S,2,0,&tolua_err) || - !tolua_isnoobj(tolua_S,3,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); - int tolua_var_1 = ((int) tolua_tonumber(tolua_S,2,0)); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetLastBlockActionCnt'", NULL); -#endif - { - self->SetLastBlockActionCnt(tolua_var_1); - } - } - return 0; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'SetLastBlockActionCnt'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - -/* method: SetLastBlockActionTime of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_SetLastBlockActionTime00 -static int tolua_AllToLua_cPlayer_SetLastBlockActionTime00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnoobj(tolua_S,2,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetLastBlockActionTime'", NULL); -#endif - { - self->SetLastBlockActionTime(); - } - } - return 0; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'SetLastBlockActionTime'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - /* method: SetGameMode of class cPlayer */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_SetGameMode00 static int tolua_AllToLua_cPlayer_SetGameMode00(lua_State* tolua_S) @@ -8632,6 +8472,134 @@ static int tolua_AllToLua_cPlayer_SetGameMode00(lua_State* tolua_S) } #endif //#ifndef TOLUA_DISABLE +/* method: IsGameModeCreative of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsGameModeCreative00 +static int tolua_AllToLua_cPlayer_IsGameModeCreative00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeCreative'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeCreative(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeCreative'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: IsGameModeSurvival of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsGameModeSurvival00 +static int tolua_AllToLua_cPlayer_IsGameModeSurvival00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeSurvival'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeSurvival(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeSurvival'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: IsGameModeAdventure of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsGameModeAdventure00 +static int tolua_AllToLua_cPlayer_IsGameModeAdventure00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeAdventure'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeAdventure(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeAdventure'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: GetIP of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_GetIP00 +static int tolua_AllToLua_cPlayer_GetIP00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetIP'", NULL); +#endif + { + AString tolua_ret = (AString) self->GetIP(); + tolua_pushcppstring(tolua_S,(const char*)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'GetIP'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + /* method: MoveTo of class cPlayer */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_MoveTo00 static int tolua_AllToLua_cPlayer_MoveTo00(lua_State* tolua_S) @@ -9334,6 +9302,38 @@ static int tolua_AllToLua_cPlayer_GetFoodPoisonedTicksRemaining00(lua_State* tol } #endif //#ifndef TOLUA_DISABLE +/* method: IsSatiated of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsSatiated00 +static int tolua_AllToLua_cPlayer_IsSatiated00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsSatiated'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsSatiated(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsSatiated'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + /* method: SetFoodLevel of class cPlayer */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_SetFoodLevel00 static int tolua_AllToLua_cPlayer_SetFoodLevel00(lua_State* tolua_S) @@ -9601,6 +9601,38 @@ static int tolua_AllToLua_cPlayer_FoodPoison00(lua_State* tolua_S) } #endif //#ifndef TOLUA_DISABLE +/* method: IsEating of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsEating00 +static int tolua_AllToLua_cPlayer_IsEating00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsEating'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsEating(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsEating'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + /* method: Respawn of class cPlayer */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_Respawn00 static int tolua_AllToLua_cPlayer_Respawn00(lua_State* tolua_S) @@ -11375,6 +11407,102 @@ static int tolua_AllToLua_cWorld_GetGameMode00(lua_State* tolua_S) } #endif //#ifndef TOLUA_DISABLE +/* method: IsGameModeCreative of class cWorld */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_IsGameModeCreative00 +static int tolua_AllToLua_cWorld_IsGameModeCreative00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cWorld",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cWorld* self = (const cWorld*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeCreative'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeCreative(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeCreative'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: IsGameModeSurvival of class cWorld */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_IsGameModeSurvival00 +static int tolua_AllToLua_cWorld_IsGameModeSurvival00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cWorld",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cWorld* self = (const cWorld*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeSurvival'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeSurvival(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeSurvival'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: IsGameModeAdventure of class cWorld */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_IsGameModeAdventure00 +static int tolua_AllToLua_cWorld_IsGameModeAdventure00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cWorld",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cWorld* self = (const cWorld*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeAdventure'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeAdventure(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeAdventure'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + /* method: IsPVPEnabled of class cWorld */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_IsPVPEnabled00 static int tolua_AllToLua_cWorld_IsPVPEnabled00(lua_State* tolua_S) @@ -28665,6 +28793,8 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_constant(tolua_S,"gmSurvival",gmSurvival); tolua_constant(tolua_S,"gmCreative",gmCreative); tolua_constant(tolua_S,"gmAdventure",gmAdventure); + tolua_constant(tolua_S,"gmMax",gmMax); + tolua_constant(tolua_S,"gmMin",gmMin); tolua_constant(tolua_S,"eWeather_Sunny",eWeather_Sunny); tolua_constant(tolua_S,"eWeather_Rain",eWeather_Rain); tolua_constant(tolua_S,"eWeather_ThunderStorm",eWeather_ThunderStorm); @@ -28892,6 +29022,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_beginmodule(tolua_S,"cPlayer"); tolua_constant(tolua_S,"MAX_HEALTH",cPlayer::MAX_HEALTH); tolua_constant(tolua_S,"MAX_FOOD_LEVEL",cPlayer::MAX_FOOD_LEVEL); + tolua_constant(tolua_S,"EATING_TICKS",cPlayer::EATING_TICKS); tolua_function(tolua_S,"Initialize",tolua_AllToLua_cPlayer_Initialize00); tolua_function(tolua_S,"GetEyeHeight",tolua_AllToLua_cPlayer_GetEyeHeight00); tolua_function(tolua_S,"GetEyePosition",tolua_AllToLua_cPlayer_GetEyePosition00); @@ -28900,12 +29031,11 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_function(tolua_S,"GetInventory",tolua_AllToLua_cPlayer_GetInventory00); tolua_function(tolua_S,"GetEquippedItem",tolua_AllToLua_cPlayer_GetEquippedItem00); tolua_function(tolua_S,"GetGameMode",tolua_AllToLua_cPlayer_GetGameMode00); - tolua_function(tolua_S,"GetIP",tolua_AllToLua_cPlayer_GetIP00); - tolua_function(tolua_S,"GetLastBlockActionTime",tolua_AllToLua_cPlayer_GetLastBlockActionTime00); - tolua_function(tolua_S,"GetLastBlockActionCnt",tolua_AllToLua_cPlayer_GetLastBlockActionCnt00); - tolua_function(tolua_S,"SetLastBlockActionCnt",tolua_AllToLua_cPlayer_SetLastBlockActionCnt00); - tolua_function(tolua_S,"SetLastBlockActionTime",tolua_AllToLua_cPlayer_SetLastBlockActionTime00); tolua_function(tolua_S,"SetGameMode",tolua_AllToLua_cPlayer_SetGameMode00); + tolua_function(tolua_S,"IsGameModeCreative",tolua_AllToLua_cPlayer_IsGameModeCreative00); + tolua_function(tolua_S,"IsGameModeSurvival",tolua_AllToLua_cPlayer_IsGameModeSurvival00); + tolua_function(tolua_S,"IsGameModeAdventure",tolua_AllToLua_cPlayer_IsGameModeAdventure00); + tolua_function(tolua_S,"GetIP",tolua_AllToLua_cPlayer_GetIP00); tolua_function(tolua_S,"MoveTo",tolua_AllToLua_cPlayer_MoveTo00); tolua_function(tolua_S,"GetWindow",tolua_AllToLua_cPlayer_GetWindow00); tolua_function(tolua_S,"CloseWindow",tolua_AllToLua_cPlayer_CloseWindow00); @@ -28927,6 +29057,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_function(tolua_S,"GetFoodTickTimer",tolua_AllToLua_cPlayer_GetFoodTickTimer00); tolua_function(tolua_S,"GetFoodExhaustionLevel",tolua_AllToLua_cPlayer_GetFoodExhaustionLevel00); tolua_function(tolua_S,"GetFoodPoisonedTicksRemaining",tolua_AllToLua_cPlayer_GetFoodPoisonedTicksRemaining00); + tolua_function(tolua_S,"IsSatiated",tolua_AllToLua_cPlayer_IsSatiated00); tolua_function(tolua_S,"SetFoodLevel",tolua_AllToLua_cPlayer_SetFoodLevel00); tolua_function(tolua_S,"SetFoodSaturationLevel",tolua_AllToLua_cPlayer_SetFoodSaturationLevel00); tolua_function(tolua_S,"SetFoodTickTimer",tolua_AllToLua_cPlayer_SetFoodTickTimer00); @@ -28935,6 +29066,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_function(tolua_S,"Feed",tolua_AllToLua_cPlayer_Feed00); tolua_function(tolua_S,"AddFoodExhaustion",tolua_AllToLua_cPlayer_AddFoodExhaustion00); tolua_function(tolua_S,"FoodPoison",tolua_AllToLua_cPlayer_FoodPoison00); + tolua_function(tolua_S,"IsEating",tolua_AllToLua_cPlayer_IsEating00); tolua_function(tolua_S,"Respawn",tolua_AllToLua_cPlayer_Respawn00); tolua_function(tolua_S,"SetVisible",tolua_AllToLua_cPlayer_SetVisible00); tolua_function(tolua_S,"IsVisible",tolua_AllToLua_cPlayer_IsVisible00); @@ -29037,6 +29169,9 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_function(tolua_S,"SetTimeOfDay",tolua_AllToLua_cWorld_SetTimeOfDay00); tolua_function(tolua_S,"SetWorldTime",tolua_AllToLua_cWorld_SetWorldTime00); tolua_function(tolua_S,"GetGameMode",tolua_AllToLua_cWorld_GetGameMode00); + tolua_function(tolua_S,"IsGameModeCreative",tolua_AllToLua_cWorld_IsGameModeCreative00); + tolua_function(tolua_S,"IsGameModeSurvival",tolua_AllToLua_cWorld_IsGameModeSurvival00); + tolua_function(tolua_S,"IsGameModeAdventure",tolua_AllToLua_cWorld_IsGameModeAdventure00); tolua_function(tolua_S,"IsPVPEnabled",tolua_AllToLua_cWorld_IsPVPEnabled00); tolua_function(tolua_S,"IsDeepSnowEnabled",tolua_AllToLua_cWorld_IsDeepSnowEnabled00); tolua_function(tolua_S,"GetDimension",tolua_AllToLua_cWorld_GetDimension00); diff --git a/source/Bindings.h b/source/Bindings.h index c21612525..7341c6587 100644 --- a/source/Bindings.h +++ b/source/Bindings.h @@ -1,6 +1,6 @@ /* ** Lua binding: AllToLua -** Generated automatically by tolua++-1.0.92 on 07/26/13 21:48:46. +** Generated automatically by tolua++-1.0.92 on 07/28/13 22:51:47. */ /* Exported function */ diff --git a/source/ClientHandle.cpp b/source/ClientHandle.cpp index a15facc6e..d66e47d32 100644 --- a/source/ClientHandle.cpp +++ b/source/ClientHandle.cpp @@ -801,6 +801,11 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, c } else if (ItemHandler->IsFood()) { + if (m_Player->IsSatiated()) + { + // The player is satiated, they cannot eat + return; + } m_Player->StartEating(); if (PlgMgr->CallHookPlayerEating(*m_Player)) { diff --git a/source/Defines.h b/source/Defines.h index f52050a9b..94e618eb0 100644 --- a/source/Defines.h +++ b/source/Defines.h @@ -116,6 +116,10 @@ enum eGameMode gmSurvival = eGameMode_Survival, gmCreative = eGameMode_Creative, gmAdventure = eGameMode_Adventure, + + // These two are used to check GameMode for validity when converting from integers. + gmMax, // Gets automatically assigned + gmMin = 0, } ; diff --git a/source/Player.cpp b/source/Player.cpp index c177b8cf4..c90f3c99c 100644 --- a/source/Player.cpp +++ b/source/Player.cpp @@ -705,7 +705,7 @@ void cPlayer::SetLastBlockActionCnt( int a_LastBlockActionCnt ) void cPlayer::SetGameMode(eGameMode a_GameMode) { - if ((a_GameMode >= 3) || (a_GameMode < 0)) + if ((a_GameMode >= gmMin) || (a_GameMode < gmMax)) { LOGWARNING("%s: Setting invalid gamemode: %d", GetName().c_str(), a_GameMode); return; diff --git a/source/Player.h b/source/Player.h index 093c35b44..eea8c1596 100644 --- a/source/Player.h +++ b/source/Player.h @@ -66,7 +66,7 @@ public: double GetEyeHeight(void) const; // tolua_export Vector3d GetEyePosition(void) const; // tolua_export inline bool IsOnGround(void) const {return m_bTouchGround; } // tolua_export - inline const double GetStance(void) const { return GetPosY() + 1.62; } // tolua_export // TODO: Proper stance when crouching etc. + inline const double GetStance(void) const { return GetPosY() + 1.62; } // tolua_export // TODO: Proper stance when crouching etc. inline cInventory & GetInventory(void) { return m_Inventory; } // tolua_export inline const cInventory & GetInventory(void) const { return m_Inventory; } @@ -74,9 +74,17 @@ public: virtual void TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ) override; - /// Returns the current gamemode. Partly OBSOLETE, you should use IsGameModeXXX() functions wherever applicable - eGameMode GetGameMode(void) const { return m_GameMode; } // tolua_export + // tolua_begin + /// Returns the current gamemode. Partly OBSOLETE, you should use IsGameModeXXX() functions wherever applicable + eGameMode GetGameMode(void) const { return m_GameMode; } + + /** Sets the gamemode for the player. + The gamemode may be gmNotSet, in that case the player inherits the world's gamemode. + Updates the gamemode on the client (sends the packet) + */ + void SetGameMode(eGameMode a_GameMode); + /// Returns true if the player is in Creative mode, either explicitly, or by inheriting from current world bool IsGameModeCreative(void) const; @@ -86,17 +94,22 @@ public: /// Returns true if the player is in Adventure mode, either explicitly, or by inheriting from current world bool IsGameModeAdventure(void) const; - std::string GetIP() { return m_IP; } // tolua_export - float GetLastBlockActionTime() { return m_LastBlockActionTime; } // tolua_export - int GetLastBlockActionCnt() { return m_LastBlockActionCnt; } // tolua_export - void SetLastBlockActionCnt( int ); // tolua_export - void SetLastBlockActionTime(); // tolua_export - void SetGameMode( eGameMode a_GameMode ); // tolua_export - void LoginSetGameMode( eGameMode a_GameMode ); + AString GetIP(void) const { return m_IP; } // tolua_export + + // tolua_end + void SetIP(const AString & a_IP); + float GetLastBlockActionTime() { return m_LastBlockActionTime; } + int GetLastBlockActionCnt() { return m_LastBlockActionCnt; } + void SetLastBlockActionCnt( int ); + void SetLastBlockActionTime(); + + // Sets the current gamemode, doesn't check validity, doesn't send update packets to client + void LoginSetGameMode(eGameMode a_GameMode); + /// Tries to move to a new position, with collision checks and stuff - virtual void MoveTo( const Vector3d & a_NewPos ); // tolua_export + virtual void MoveTo( const Vector3d & a_NewPos ); // tolua_export cWindow * GetWindow(void) { return m_CurrentWindow; } // tolua_export const cWindow * GetWindow(void) const { return m_CurrentWindow; } @@ -148,6 +161,9 @@ public: double GetFoodExhaustionLevel (void) const { return m_FoodExhaustionLevel; } int GetFoodPoisonedTicksRemaining(void) const { return m_FoodPoisonedTicksRemaining; } + /// Returns true if the player is satiated, i. e. their foodlevel is at the max and they cannot eat anymore + bool IsSatiated(void) const { return (m_FoodLevel >= MAX_FOOD_LEVEL); } + void SetFoodLevel (int a_FoodLevel); void SetFoodSaturationLevel (double a_FoodSaturationLevel); void SetFoodTickTimer (int a_FoodTickTimer); @@ -163,6 +179,9 @@ public: /// Starts the food poisoning for the specified amount of ticks; if already foodpoisoned, sets FoodPoisonedTicksRemaining to the larger of the two void FoodPoison(int a_NumTicks); + /// Returns true if the player is currently in the process of eating the currently equipped item + bool IsEating(void) const { return (m_EatingFinishTick >= 0); } + // tolua_end /// Starts eating the currently equipped item. Resets the eating timer and sends the proper animation packet @@ -235,6 +254,7 @@ public: // cEntity overrides: virtual bool IsCrouched (void) const { return m_IsCrouched; } virtual bool IsSprinting(void) const { return m_IsSprinting; } + virtual bool IsRclking (void) const { return IsEating(); } protected: typedef std::map< std::string, bool > PermissionMap; From 473dec42c8adf2a2c50f10bd5026209bd71e4ac2 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 29 Jul 2013 09:55:37 +0200 Subject: [PATCH 11/11] Updated the automatic Lua bindings --- source/Bindings.cpp | 467 ++++++++++++++++++++++++++++---------------- source/Bindings.h | 2 +- 2 files changed, 302 insertions(+), 167 deletions(-) diff --git a/source/Bindings.cpp b/source/Bindings.cpp index a81ec2b8c..a313ce98d 100644 --- a/source/Bindings.cpp +++ b/source/Bindings.cpp @@ -1,6 +1,6 @@ /* ** Lua binding: AllToLua -** Generated automatically by tolua++-1.0.92 on 07/29/13 02:06:10. +** Generated automatically by tolua++-1.0.92 on 07/29/13 09:54:50. */ #ifndef __cplusplus @@ -8448,166 +8448,6 @@ static int tolua_AllToLua_cPlayer_GetGameMode00(lua_State* tolua_S) } #endif //#ifndef TOLUA_DISABLE -/* method: GetIP of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_GetIP00 -static int tolua_AllToLua_cPlayer_GetIP00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnoobj(tolua_S,2,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetIP'", NULL); -#endif - { - std::string tolua_ret = (std::string) self->GetIP(); - tolua_pushcppstring(tolua_S,(const char*)tolua_ret); - } - } - return 1; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'GetIP'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - -/* method: GetLastBlockActionTime of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_GetLastBlockActionTime00 -static int tolua_AllToLua_cPlayer_GetLastBlockActionTime00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnoobj(tolua_S,2,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetLastBlockActionTime'", NULL); -#endif - { - float tolua_ret = (float) self->GetLastBlockActionTime(); - tolua_pushnumber(tolua_S,(lua_Number)tolua_ret); - } - } - return 1; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'GetLastBlockActionTime'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - -/* method: GetLastBlockActionCnt of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_GetLastBlockActionCnt00 -static int tolua_AllToLua_cPlayer_GetLastBlockActionCnt00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnoobj(tolua_S,2,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetLastBlockActionCnt'", NULL); -#endif - { - int tolua_ret = (int) self->GetLastBlockActionCnt(); - tolua_pushnumber(tolua_S,(lua_Number)tolua_ret); - } - } - return 1; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'GetLastBlockActionCnt'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - -/* method: SetLastBlockActionCnt of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_SetLastBlockActionCnt00 -static int tolua_AllToLua_cPlayer_SetLastBlockActionCnt00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnumber(tolua_S,2,0,&tolua_err) || - !tolua_isnoobj(tolua_S,3,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); - int tolua_var_1 = ((int) tolua_tonumber(tolua_S,2,0)); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetLastBlockActionCnt'", NULL); -#endif - { - self->SetLastBlockActionCnt(tolua_var_1); - } - } - return 0; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'SetLastBlockActionCnt'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - -/* method: SetLastBlockActionTime of class cPlayer */ -#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_SetLastBlockActionTime00 -static int tolua_AllToLua_cPlayer_SetLastBlockActionTime00(lua_State* tolua_S) -{ -#ifndef TOLUA_RELEASE - tolua_Error tolua_err; - if ( - !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) || - !tolua_isnoobj(tolua_S,2,&tolua_err) - ) - goto tolua_lerror; - else -#endif - { - cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); -#ifndef TOLUA_RELEASE - if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetLastBlockActionTime'", NULL); -#endif - { - self->SetLastBlockActionTime(); - } - } - return 0; -#ifndef TOLUA_RELEASE - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'SetLastBlockActionTime'.",&tolua_err); - return 0; -#endif -} -#endif //#ifndef TOLUA_DISABLE - /* method: SetGameMode of class cPlayer */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_SetGameMode00 static int tolua_AllToLua_cPlayer_SetGameMode00(lua_State* tolua_S) @@ -8641,6 +8481,134 @@ static int tolua_AllToLua_cPlayer_SetGameMode00(lua_State* tolua_S) } #endif //#ifndef TOLUA_DISABLE +/* method: IsGameModeCreative of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsGameModeCreative00 +static int tolua_AllToLua_cPlayer_IsGameModeCreative00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeCreative'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeCreative(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeCreative'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: IsGameModeSurvival of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsGameModeSurvival00 +static int tolua_AllToLua_cPlayer_IsGameModeSurvival00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeSurvival'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeSurvival(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeSurvival'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: IsGameModeAdventure of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsGameModeAdventure00 +static int tolua_AllToLua_cPlayer_IsGameModeAdventure00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeAdventure'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeAdventure(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeAdventure'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: GetIP of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_GetIP00 +static int tolua_AllToLua_cPlayer_GetIP00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetIP'", NULL); +#endif + { + AString tolua_ret = (AString) self->GetIP(); + tolua_pushcppstring(tolua_S,(const char*)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'GetIP'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + /* method: MoveTo of class cPlayer */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_MoveTo00 static int tolua_AllToLua_cPlayer_MoveTo00(lua_State* tolua_S) @@ -9343,6 +9311,38 @@ static int tolua_AllToLua_cPlayer_GetFoodPoisonedTicksRemaining00(lua_State* tol } #endif //#ifndef TOLUA_DISABLE +/* method: IsSatiated of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsSatiated00 +static int tolua_AllToLua_cPlayer_IsSatiated00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsSatiated'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsSatiated(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsSatiated'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + /* method: SetFoodLevel of class cPlayer */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_SetFoodLevel00 static int tolua_AllToLua_cPlayer_SetFoodLevel00(lua_State* tolua_S) @@ -9610,6 +9610,38 @@ static int tolua_AllToLua_cPlayer_FoodPoison00(lua_State* tolua_S) } #endif //#ifndef TOLUA_DISABLE +/* method: IsEating of class cPlayer */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_IsEating00 +static int tolua_AllToLua_cPlayer_IsEating00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cPlayer",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cPlayer* self = (const cPlayer*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsEating'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsEating(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsEating'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + /* method: Respawn of class cPlayer */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_Respawn00 static int tolua_AllToLua_cPlayer_Respawn00(lua_State* tolua_S) @@ -11416,6 +11448,102 @@ static int tolua_AllToLua_cWorld_GetGameMode00(lua_State* tolua_S) } #endif //#ifndef TOLUA_DISABLE +/* method: IsGameModeCreative of class cWorld */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_IsGameModeCreative00 +static int tolua_AllToLua_cWorld_IsGameModeCreative00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cWorld",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cWorld* self = (const cWorld*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeCreative'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeCreative(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeCreative'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: IsGameModeSurvival of class cWorld */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_IsGameModeSurvival00 +static int tolua_AllToLua_cWorld_IsGameModeSurvival00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cWorld",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cWorld* self = (const cWorld*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeSurvival'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeSurvival(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeSurvival'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + +/* method: IsGameModeAdventure of class cWorld */ +#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_IsGameModeAdventure00 +static int tolua_AllToLua_cWorld_IsGameModeAdventure00(lua_State* tolua_S) +{ +#ifndef TOLUA_RELEASE + tolua_Error tolua_err; + if ( + !tolua_isusertype(tolua_S,1,"const cWorld",0,&tolua_err) || + !tolua_isnoobj(tolua_S,2,&tolua_err) + ) + goto tolua_lerror; + else +#endif + { + const cWorld* self = (const cWorld*) tolua_tousertype(tolua_S,1,0); +#ifndef TOLUA_RELEASE + if (!self) tolua_error(tolua_S,"invalid 'self' in function 'IsGameModeAdventure'", NULL); +#endif + { + bool tolua_ret = (bool) self->IsGameModeAdventure(); + tolua_pushboolean(tolua_S,(bool)tolua_ret); + } + } + return 1; +#ifndef TOLUA_RELEASE + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'IsGameModeAdventure'.",&tolua_err); + return 0; +#endif +} +#endif //#ifndef TOLUA_DISABLE + /* method: IsPVPEnabled of class cWorld */ #ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_IsPVPEnabled00 static int tolua_AllToLua_cWorld_IsPVPEnabled00(lua_State* tolua_S) @@ -29017,6 +29145,8 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_constant(tolua_S,"gmSurvival",gmSurvival); tolua_constant(tolua_S,"gmCreative",gmCreative); tolua_constant(tolua_S,"gmAdventure",gmAdventure); + tolua_constant(tolua_S,"gmMax",gmMax); + tolua_constant(tolua_S,"gmMin",gmMin); tolua_constant(tolua_S,"eWeather_Sunny",eWeather_Sunny); tolua_constant(tolua_S,"eWeather_Rain",eWeather_Rain); tolua_constant(tolua_S,"eWeather_ThunderStorm",eWeather_ThunderStorm); @@ -29244,6 +29374,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_beginmodule(tolua_S,"cPlayer"); tolua_constant(tolua_S,"MAX_HEALTH",cPlayer::MAX_HEALTH); tolua_constant(tolua_S,"MAX_FOOD_LEVEL",cPlayer::MAX_FOOD_LEVEL); + tolua_constant(tolua_S,"EATING_TICKS",cPlayer::EATING_TICKS); tolua_function(tolua_S,"Initialize",tolua_AllToLua_cPlayer_Initialize00); tolua_function(tolua_S,"GetEyeHeight",tolua_AllToLua_cPlayer_GetEyeHeight00); tolua_function(tolua_S,"GetEyePosition",tolua_AllToLua_cPlayer_GetEyePosition00); @@ -29252,12 +29383,11 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_function(tolua_S,"GetInventory",tolua_AllToLua_cPlayer_GetInventory00); tolua_function(tolua_S,"GetEquippedItem",tolua_AllToLua_cPlayer_GetEquippedItem00); tolua_function(tolua_S,"GetGameMode",tolua_AllToLua_cPlayer_GetGameMode00); - tolua_function(tolua_S,"GetIP",tolua_AllToLua_cPlayer_GetIP00); - tolua_function(tolua_S,"GetLastBlockActionTime",tolua_AllToLua_cPlayer_GetLastBlockActionTime00); - tolua_function(tolua_S,"GetLastBlockActionCnt",tolua_AllToLua_cPlayer_GetLastBlockActionCnt00); - tolua_function(tolua_S,"SetLastBlockActionCnt",tolua_AllToLua_cPlayer_SetLastBlockActionCnt00); - tolua_function(tolua_S,"SetLastBlockActionTime",tolua_AllToLua_cPlayer_SetLastBlockActionTime00); tolua_function(tolua_S,"SetGameMode",tolua_AllToLua_cPlayer_SetGameMode00); + tolua_function(tolua_S,"IsGameModeCreative",tolua_AllToLua_cPlayer_IsGameModeCreative00); + tolua_function(tolua_S,"IsGameModeSurvival",tolua_AllToLua_cPlayer_IsGameModeSurvival00); + tolua_function(tolua_S,"IsGameModeAdventure",tolua_AllToLua_cPlayer_IsGameModeAdventure00); + tolua_function(tolua_S,"GetIP",tolua_AllToLua_cPlayer_GetIP00); tolua_function(tolua_S,"MoveTo",tolua_AllToLua_cPlayer_MoveTo00); tolua_function(tolua_S,"GetWindow",tolua_AllToLua_cPlayer_GetWindow00); tolua_function(tolua_S,"CloseWindow",tolua_AllToLua_cPlayer_CloseWindow00); @@ -29279,6 +29409,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_function(tolua_S,"GetFoodTickTimer",tolua_AllToLua_cPlayer_GetFoodTickTimer00); tolua_function(tolua_S,"GetFoodExhaustionLevel",tolua_AllToLua_cPlayer_GetFoodExhaustionLevel00); tolua_function(tolua_S,"GetFoodPoisonedTicksRemaining",tolua_AllToLua_cPlayer_GetFoodPoisonedTicksRemaining00); + tolua_function(tolua_S,"IsSatiated",tolua_AllToLua_cPlayer_IsSatiated00); tolua_function(tolua_S,"SetFoodLevel",tolua_AllToLua_cPlayer_SetFoodLevel00); tolua_function(tolua_S,"SetFoodSaturationLevel",tolua_AllToLua_cPlayer_SetFoodSaturationLevel00); tolua_function(tolua_S,"SetFoodTickTimer",tolua_AllToLua_cPlayer_SetFoodTickTimer00); @@ -29287,6 +29418,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_function(tolua_S,"Feed",tolua_AllToLua_cPlayer_Feed00); tolua_function(tolua_S,"AddFoodExhaustion",tolua_AllToLua_cPlayer_AddFoodExhaustion00); tolua_function(tolua_S,"FoodPoison",tolua_AllToLua_cPlayer_FoodPoison00); + tolua_function(tolua_S,"IsEating",tolua_AllToLua_cPlayer_IsEating00); tolua_function(tolua_S,"Respawn",tolua_AllToLua_cPlayer_Respawn00); tolua_function(tolua_S,"SetVisible",tolua_AllToLua_cPlayer_SetVisible00); tolua_function(tolua_S,"IsVisible",tolua_AllToLua_cPlayer_IsVisible00); @@ -29390,6 +29522,9 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S) tolua_function(tolua_S,"SetTimeOfDay",tolua_AllToLua_cWorld_SetTimeOfDay00); tolua_function(tolua_S,"SetWorldTime",tolua_AllToLua_cWorld_SetWorldTime00); tolua_function(tolua_S,"GetGameMode",tolua_AllToLua_cWorld_GetGameMode00); + tolua_function(tolua_S,"IsGameModeCreative",tolua_AllToLua_cWorld_IsGameModeCreative00); + tolua_function(tolua_S,"IsGameModeSurvival",tolua_AllToLua_cWorld_IsGameModeSurvival00); + tolua_function(tolua_S,"IsGameModeAdventure",tolua_AllToLua_cWorld_IsGameModeAdventure00); tolua_function(tolua_S,"IsPVPEnabled",tolua_AllToLua_cWorld_IsPVPEnabled00); tolua_function(tolua_S,"IsDeepSnowEnabled",tolua_AllToLua_cWorld_IsDeepSnowEnabled00); tolua_function(tolua_S,"GetDimension",tolua_AllToLua_cWorld_GetDimension00); diff --git a/source/Bindings.h b/source/Bindings.h index a86df572c..256a8e257 100644 --- a/source/Bindings.h +++ b/source/Bindings.h @@ -1,6 +1,6 @@ /* ** Lua binding: AllToLua -** Generated automatically by tolua++-1.0.92 on 07/29/13 02:06:11. +** Generated automatically by tolua++-1.0.92 on 07/29/13 09:54:50. */ /* Exported function */